Upgrade memoffset to 0.8.0 am: 0d0d25cb12 am: 6817016059

Original change: https://android-review.googlesource.com/c/platform/external/rust/crates/memoffset/+/2419084

Change-Id: I42ec961c14a4501a55f793dd3f1a30398e1b9b24
Signed-off-by: Automerger Merge Worker <[email protected]>
diff --git a/.cargo_vcs_info.json b/.cargo_vcs_info.json
index 057a882..161d06e 100644
--- a/.cargo_vcs_info.json
+++ b/.cargo_vcs_info.json
@@ -1,6 +1,6 @@
 {
   "git": {
-    "sha1": "d8accb76712984e2ab069193f392e5a7b6c5e78c"
+    "sha1": "0fac3ac6642dd017a36268c4cdba2f04ec050d11"
   },
   "path_in_vcs": ""
 }
\ No newline at end of file
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index ea6b607..f82f7f1 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -33,6 +33,7 @@
           - 1.36.0  # Oldest supported with MaybeUninit
           - 1.40.0  # Oldest supported with cfg(doctest)
           - 1.51.0  # Oldest supported with ptr::addr_of!
+          - 1.65.0  # Oldest supported with stable const evaluation (sans cell)
           - stable
           - beta
           - nightly
diff --git a/Android.bp b/Android.bp
index e22342d..0f97909 100644
--- a/Android.bp
+++ b/Android.bp
@@ -23,7 +23,7 @@
     host_supported: true,
     crate_name: "memoffset",
     cargo_env_compat: true,
-    cargo_pkg_version: "0.7.1",
+    cargo_pkg_version: "0.8.0",
     srcs: ["src/lib.rs"],
     edition: "2015",
     features: ["default"],
@@ -32,6 +32,7 @@
         "doctests",
         "maybe_uninit",
         "raw_ref_macros",
+        "stable_const",
         "tuple_ty",
     ],
     apex_available: [
@@ -49,7 +50,7 @@
     host_supported: true,
     crate_name: "memoffset",
     cargo_env_compat: true,
-    cargo_pkg_version: "0.7.1",
+    cargo_pkg_version: "0.8.0",
     srcs: ["src/lib.rs"],
     test_suites: ["general-tests"],
     auto_gen_config: true,
@@ -63,6 +64,7 @@
         "doctests",
         "maybe_uninit",
         "raw_ref_macros",
+        "stable_const",
         "tuple_ty",
     ],
 }
diff --git a/Cargo.toml b/Cargo.toml
index 1677446..5d71c64 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -11,7 +11,7 @@
 
 [package]
 name = "memoffset"
-version = "0.7.1"
+version = "0.8.0"
 authors = ["Gilad Naaman <[email protected]>"]
 description = "offset_of functionality for Rust structs."
 readme = "README.md"
diff --git a/Cargo.toml.orig b/Cargo.toml.orig
index 90620e2..71bdc9e 100644
--- a/Cargo.toml.orig
+++ b/Cargo.toml.orig
@@ -1,6 +1,6 @@
 [package]
 name = "memoffset"
-version = "0.7.1"
+version = "0.8.0"
 authors = ["Gilad Naaman <[email protected]>"]
 description = "offset_of functionality for Rust structs."
 license = "MIT"
diff --git a/METADATA b/METADATA
index e30f02d..5ccdb78 100644
--- a/METADATA
+++ b/METADATA
@@ -11,13 +11,13 @@
   }
   url {
     type: ARCHIVE
-    value: "https://static.crates.io/crates/memoffset/memoffset-0.7.1.crate"
+    value: "https://static.crates.io/crates/memoffset/memoffset-0.8.0.crate"
   }
-  version: "0.7.1"
+  version: "0.8.0"
   license_type: NOTICE
   last_upgrade_date {
-    year: 2022
-    month: 12
-    day: 12
+    year: 2023
+    month: 2
+    day: 3
   }
 }
diff --git a/README.md b/README.md
index e297b33..b0bfd10 100644
--- a/README.md
+++ b/README.md
@@ -7,6 +7,7 @@
 Introduces the following macros:
  * `offset_of!` for obtaining the offset of a member of a struct.
  * `offset_of_tuple!` for obtaining the offset of a member of a tuple. (Requires Rust 1.20+)
+ * `offset_of_union!` for obtaining the offset of a member of a union.
  * `span_of!` for obtaining the range that a field, or fields, span.
 
 `memoffset` works under `no_std` environments.
@@ -16,7 +17,7 @@
 
 ```toml
 [dependencies]
-memoffset = "0.7"
+memoffset = "0.8"
 ```
 
 These versions will compile fine with rustc versions greater or equal to 1.19.
@@ -45,21 +46,40 @@
 }
 ```
 
-## Feature flags ##
+## Usage in constants ##
+`memoffset` has support for compile-time `offset_of!` on rust>=1.65, or on older nightly compilers.
 
-### Usage in constants ###
-`memoffset` has **experimental** support for compile-time `offset_of!` on a nightly compiler.
+### Usage on stable Rust ###
+Constant evaluation is automatically enabled and avilable on stable compilers starting with rustc 1.65.
 
-In order to use it, you must enable the `unstable_const` crate feature and several compiler features.
+This is an incomplete implementation with one caveat:
+Due to dependence on [`#![feature(const_refs_to_cell)]`](https://github.com/rust-lang/rust/issues/80384), you cannot get the offset of a `Cell` field in a const-context.
+
+This means that if need to get the offset of a cell, you'll have to remain on nightly for now.
+
+### Usage on recent nightlies ###
+
+If you're using a new-enough nightly and you require the ability to get the offset of a `Cell`,
+you'll have to enable the `unstable_const` cargo feature, as well as enabling `const_refs_to_cell` in your crate root.
+
+Do note that `unstable_const` is an unstable feature that is set to be removed in a future version of `memoffset`.
 
 Cargo.toml:
 ```toml
 [dependencies.memoffset]
-version = "0.7"
+version = "0.8"
 features = ["unstable_const"]
 ```
 
 Your crate root: (`lib.rs`/`main.rs`)
 ```rust,ignore
+#![feature(const_refs_to_cell)]
+```
+
+### Usage on older nightlies ###
+In order to use it on an older nightly compiler, you must enable the `unstable_const` crate feature and several compiler features.
+
+Your crate root: (`lib.rs`/`main.rs`)
+```rust,ignore
 #![feature(const_ptr_offset_from, const_refs_to_cell)]
 ```
diff --git a/build.rs b/build.rs
index 0604c19..e18810f 100644
--- a/build.rs
+++ b/build.rs
@@ -19,4 +19,7 @@
     if ac.probe_rustc_version(1, 51) {
         println!("cargo:rustc-cfg=raw_ref_macros");
     }
+    if ac.probe_rustc_version(1, 65) {
+        println!("cargo:rustc-cfg=stable_const");
+    }
 }
diff --git a/src/lib.rs b/src/lib.rs
index 1798d91..356595d 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -58,9 +58,10 @@
 // ANDROID: include standard library to build as a dylib
 //#![no_std]
 #![cfg_attr(
-    feature = "unstable_const",
-    feature(const_ptr_offset_from, const_refs_to_cell)
+    all(feature = "unstable_const", not(stable_const)),
+    feature(const_ptr_offset_from)
 )]
+#![cfg_attr(feature = "unstable_const", feature(const_refs_to_cell))]
 
 #[macro_use]
 #[cfg(doctests)]
diff --git a/src/offset_of.rs b/src/offset_of.rs
index d070181..9ce4ae2 100644
--- a/src/offset_of.rs
+++ b/src/offset_of.rs
@@ -46,7 +46,7 @@
 }
 
 /// Macro to compute the distance between two pointers.
-#[cfg(feature = "unstable_const")]
+#[cfg(any(feature = "unstable_const", stable_const))]
 #[macro_export]
 #[doc(hidden)]
 macro_rules! _memoffset_offset_from_unsafe {
@@ -58,7 +58,7 @@
         unsafe { (field as *const u8).offset_from(base as *const u8) as usize }
     }};
 }
-#[cfg(not(feature = "unstable_const"))]
+#[cfg(not(any(feature = "unstable_const", stable_const)))]
 #[macro_export]
 #[doc(hidden)]
 macro_rules! _memoffset_offset_from_unsafe {
@@ -312,7 +312,7 @@
         assert_eq!(f_ptr as usize + 0, raw_field_union!(f_ptr, Foo, c) as usize);
     }
 
-    #[cfg(feature = "unstable_const")]
+    #[cfg(any(feature = "unstable_const", stable_const))]
     #[test]
     fn const_offset() {
         #[repr(C)]
@@ -337,7 +337,7 @@
         assert_eq!([0; offset_of!(Foo, b)].len(), 4);
     }
 
-    #[cfg(feature = "unstable_const")]
+    #[cfg(any(feature = "unstable_const", stable_const))]
     #[test]
     fn const_fn_offset() {
         const fn test_fn() -> usize {