Upgrade rust/crates/memoffset to 0.6.3 am: 4ba1537d75 am: 98364184a8 am: aad3ea15e6

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

Change-Id: I1d824668902018e087f57d4e09bddd03793426ed
diff --git a/.cargo_vcs_info.json b/.cargo_vcs_info.json
index 3621e2c..fcba615 100644
--- a/.cargo_vcs_info.json
+++ b/.cargo_vcs_info.json
@@ -1,5 +1,5 @@
 {
   "git": {
-    "sha1": "da57ff39e1007a5cb2b50380bb235d067b648846"
+    "sha1": "9846cd17f381a5a9b478267ca5c684ab59346283"
   }
 }
diff --git a/.travis.yml b/.travis.yml
index 1bf5ede..d3c4d65 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -11,8 +11,11 @@
       - sh ci/miri.sh
 
   - rust: 1.19.0  # Oldest supported (first version with numeric fields in struct patterns)
+  - rust: 1.20.0  # Oldest supported with tuple_ty
   - rust: 1.31.0  # Oldest supported with allow(clippy)
   - rust: 1.36.0  # Oldest supported with MaybeUninit
+  - rust: 1.40.0  # Oldest supported with cfg(doctest)
+  - rust: 1.51.0  # Oldest supported with ptr::addr_of!
   - rust: stable
   - rust: beta
   - rust: nightly
diff --git a/Android.bp b/Android.bp
index 5b98902..ae913ce 100644
--- a/Android.bp
+++ b/Android.bp
@@ -1,4 +1,5 @@
 // This file is generated by cargo2android.py --run --device --tests --dependencies --patch=patches/Android.bp.patch.
+// Do not modify this file as changes will be overridden on upgrade.
 
 package {
     default_applicable_licenses: ["external_rust_crates_memoffset_license"],
@@ -59,6 +60,9 @@
 rust_test_host {
     name: "memoffset_host_test_src_lib",
     defaults: ["memoffset_defaults"],
+    test_options: {
+        unit_test: true,
+    },
 }
 
 rust_test {
diff --git a/Cargo.toml b/Cargo.toml
index 9e2874f..e273757 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -12,7 +12,7 @@
 
 [package]
 name = "memoffset"
-version = "0.6.1"
+version = "0.6.3"
 authors = ["Gilad Naaman <gilad.naaman@gmail.com>"]
 description = "offset_of functionality for Rust structs."
 readme = "README.md"
@@ -28,4 +28,3 @@
 [features]
 default = []
 unstable_const = []
-unstable_raw = []
diff --git a/Cargo.toml.orig b/Cargo.toml.orig
index 61e20d9..9299a64 100644
--- a/Cargo.toml.orig
+++ b/Cargo.toml.orig
@@ -1,6 +1,6 @@
 [package]
 name = "memoffset"
-version = "0.6.1"
+version = "0.6.3"
 authors = ["Gilad Naaman <gilad.naaman@gmail.com>"]
 description = "offset_of functionality for Rust structs."
 license = "MIT"
@@ -18,4 +18,3 @@
 [features]
 default = []
 unstable_const = []
-unstable_raw = []
diff --git a/METADATA b/METADATA
index c803657..3e6b088 100644
--- a/METADATA
+++ b/METADATA
@@ -7,13 +7,13 @@
   }
   url {
     type: ARCHIVE
-    value: "https://static.crates.io/crates/memoffset/memoffset-0.6.1.crate"
+    value: "https://static.crates.io/crates/memoffset/memoffset-0.6.3.crate"
   }
-  version: "0.6.1"
+  version: "0.6.3"
   license_type: NOTICE
   last_upgrade_date {
-    year: 2020
-    month: 12
-    day: 15
+    year: 2021
+    month: 4
+    day: 8
   }
 }
diff --git a/README.md b/README.md
index 67ce9eb..a60f288 100644
--- a/README.md
+++ b/README.md
@@ -73,8 +73,3 @@
 ```
 
 If you intend to use `offset_of!` inside a `const fn`, also add the `const_fn` compiler feature.
-
-### Raw references ###
-Recent nightlies support [a way to create raw pointers](https://github.com/rust-lang/rust/issues/73394) that avoids creating intermediate safe references.
-`memoffset` can make use of that feature to avoid what is technically Undefined Behavior.
-Use the `unstable_raw` feature to enable this.
diff --git a/TEST_MAPPING b/TEST_MAPPING
index 9649938..71c00fc 100644
--- a/TEST_MAPPING
+++ b/TEST_MAPPING
@@ -1,7 +1,10 @@
-// Generated by cargo2android.py for tests in Android.bp
+// Generated by update_crate_tests.py for tests that depend on this crate.
 {
   "presubmit": [
     {
+      "name": "crossbeam-epoch_device_test_src_lib"
+    },
+    {
       "name": "memoffset_device_test_src_lib"
     }
   ]
diff --git a/build.rs b/build.rs
index c83bff2..0604c19 100644
--- a/build.rs
+++ b/build.rs
@@ -16,4 +16,7 @@
     if ac.probe_rustc_version(1, 40) {
         println!("cargo:rustc-cfg=doctests");
     }
+    if ac.probe_rustc_version(1, 51) {
+        println!("cargo:rustc-cfg=raw_ref_macros");
+    }
 }
diff --git a/patches/std.diff b/patches/std.diff
index 8238bdd..fc4bdbc 100644
--- a/patches/std.diff
+++ b/patches/std.diff
@@ -7,23 +7,23 @@
  //! ```
  
 -#![no_std]
-+// ANDROID: include standard library to build as a dynlib
++// ANDROID: include standard library to build as a dylib
 +//#![no_std]
  #![cfg_attr(
      feature = "unstable_const",
      feature(
-@@ -80,9 +81,9 @@ doctest!("../README.md");
- // This `use` statement enables the macros to use `$crate::mem`.
- // Doing this enables this crate to function under both std and no-std crates.
+@@ -78,9 +79,9 @@
  #[doc(hidden)]
--pub use core::mem;
-+pub use std::mem;  // ANDROID: use std instead of core, since we're not building wiht no-std.
- #[doc(hidden)]
--pub use core::ptr;
-+pub use std::ptr;  // ANDROID: use std instead of core, since we're not building wiht no-std.
+ pub mod __priv {
+     #[doc(hidden)]
+-    pub use core::mem;
++    pub use std::mem;  // ANDROID: use std instead of core, since we're not building with no-std.
+     #[doc(hidden)]
+-    pub use core::ptr;
++    pub use std::ptr;  // ANDROID: use std instead of core, since we're not building with no-std.
  
- #[macro_use]
- mod raw_field;
+     /// Use type inference to obtain the size of the pointee (without actually using the pointer).
+     #[doc(hidden)]
 diff --git a/src/span_of.rs b/src/span_of.rs
 index 0592dbd..369e5c6 100644
 --- a/src/span_of.rs
@@ -37,4 +37,4 @@
 +    use std::mem;
  
      #[test]
-     fn span_simple() {
+     fn span_simple() {
\ No newline at end of file
diff --git a/src/lib.rs b/src/lib.rs
index 25b0444..50d3e10 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -56,7 +56,7 @@
 //! let checksum = crc16(checksum_range);
 //! ```
 
-// ANDROID: include standard library to build as a dynlib
+// ANDROID: include standard library to build as a dylib
 //#![no_std]
 #![cfg_attr(
     feature = "unstable_const",
@@ -68,7 +68,6 @@
         const_raw_ptr_deref,
     )
 )]
-#![cfg_attr(feature = "unstable_raw", feature(raw_ref_macros))]
 
 #[macro_use]
 #[cfg(doctests)]
@@ -78,12 +77,20 @@
 #[cfg(doctest)]
 doctest!("../README.md");
 
-// This `use` statement enables the macros to use `$crate::mem`.
-// Doing this enables this crate to function under both std and no-std crates.
+/// Hiden module for things the macros need to access.
 #[doc(hidden)]
-pub use std::mem;  // ANDROID: use std instead of core, since we're not building wiht no-std.
-#[doc(hidden)]
-pub use std::ptr;  // ANDROID: use std instead of core, since we're not building wiht no-std.
+pub mod __priv {
+    #[doc(hidden)]
+    pub use std::mem;  // ANDROID: use std instead of core, since we're not building with no-std.
+    #[doc(hidden)]
+    pub use std::ptr;  // ANDROID: use std instead of core, since we're not building with no-std.
+
+    /// Use type inference to obtain the size of the pointee (without actually using the pointer).
+    #[doc(hidden)]
+    pub fn size_of_pointee<T>(_ptr: *const T) -> usize {
+        mem::size_of::<T>()
+    }
+}
 
 #[macro_use]
 mod raw_field;
diff --git a/src/offset_of.rs b/src/offset_of.rs
index 2ffb79c..a363d30 100644
--- a/src/offset_of.rs
+++ b/src/offset_of.rs
@@ -30,7 +30,7 @@
         // so it has to be in the same scope as `$name`. That's why
         // `let_base_ptr` declares a variable (several, actually)
         // instead of returning one.
-        let uninit = $crate::mem::MaybeUninit::<$type>::uninit();
+        let uninit = $crate::__priv::mem::MaybeUninit::<$type>::uninit();
         let $name: *const $type = uninit.as_ptr();
     };
 }
@@ -41,7 +41,7 @@
     ($name:ident, $type:ty) => {
         // No UB right here, but we will later dereference this pointer to
         // offset into a field, and that is UB because the pointer is dangling.
-        let $name = $crate::mem::align_of::<$type>() as *const $type;
+        let $name = $crate::__priv::mem::align_of::<$type>() as *const $type;
     };
 }
 
@@ -49,17 +49,19 @@
 #[cfg(feature = "unstable_const")]
 #[macro_export]
 #[doc(hidden)]
-macro_rules! _memoffset_offset_from {
-    ($field:expr, $base:expr) => {
+macro_rules! _memoffset_offset_from_unsafe {
+    ($field:expr, $base:expr) => {{
+        let field = $field; // evaluate $field outside the `unsafe` block
+        let base = $base; // evaluate $base outside the `unsafe` block
         // Compute offset, with unstable `offset_from` for const-compatibility.
         // (Requires the pointers to not dangle, but we already need that for `raw_field!` anyway.)
-        unsafe { ($field as *const u8).offset_from($base as *const u8) as usize }
-    };
+        unsafe { (field as *const u8).offset_from(base as *const u8) as usize }
+    }};
 }
 #[cfg(not(feature = "unstable_const"))]
 #[macro_export]
 #[doc(hidden)]
-macro_rules! _memoffset_offset_from {
+macro_rules! _memoffset_offset_from_unsafe {
     ($field:expr, $base:expr) => {
         // Compute offset.
         ($field as usize) - ($base as usize)
@@ -93,7 +95,7 @@
         // Get field pointer.
         let field_ptr = raw_field!(base_ptr, $parent, $field);
         // Compute offset.
-        _memoffset_offset_from!(field_ptr, base_ptr)
+        _memoffset_offset_from_unsafe!(field_ptr, base_ptr)
     }};
 }
 
@@ -117,7 +119,7 @@
         // Get field pointer.
         let field_ptr = raw_field_tuple!(base_ptr, $parent, $field);
         // Compute offset.
-        _memoffset_offset_from!(field_ptr, base_ptr)
+        _memoffset_offset_from_unsafe!(field_ptr, base_ptr)
     }};
 }
 
diff --git a/src/raw_field.rs b/src/raw_field.rs
index 16d01bb..a8dd2b3 100644
--- a/src/raw_field.rs
+++ b/src/raw_field.rs
@@ -18,22 +18,22 @@
 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 // SOFTWARE.
 
-/// `raw_const!`, or just ref-then-cast when that is not available.
-#[cfg(feature = "unstable_raw")]
+/// `addr_of!`, or just ref-then-cast when that is not available.
+#[cfg(raw_ref_macros)]
 #[macro_export]
 #[doc(hidden)]
-macro_rules! _memoffset__raw_const {
+macro_rules! _memoffset__addr_of {
     ($path:expr) => {{
-        $crate::ptr::raw_const!($path)
+        $crate::__priv::ptr::addr_of!($path)
     }};
 }
-#[cfg(not(feature = "unstable_raw"))]
+#[cfg(not(raw_ref_macros))]
 #[macro_export]
 #[doc(hidden)]
-macro_rules! _memoffset__raw_const {
+macro_rules! _memoffset__addr_of {
     ($path:expr) => {{
         // This is UB because we create an intermediate reference to uninitialized memory.
-        // Nothing we can do about that without `raw_const!` though.
+        // Nothing we can do about that without `addr_of!` though.
         &$path as *const _
     }};
 }
@@ -82,13 +82,14 @@
 macro_rules! raw_field {
     ($base:expr, $parent:path, $field:tt) => {{
         _memoffset__field_check!($parent, $field);
+        let base = $base; // evaluate $base outside the `unsafe` block
 
         // Get the field address.
         // Crucially, we know that this will not trigger a deref coercion because
         // of the field check we did above.
         #[allow(unused_unsafe)] // for when the macro is used in an unsafe block
         unsafe {
-            _memoffset__raw_const!((*($base as *const $parent)).$field)
+            _memoffset__addr_of!((*(base as *const $parent)).$field)
         }
     }};
 }
@@ -103,13 +104,14 @@
 macro_rules! raw_field_tuple {
     ($base:expr, $parent:ty, $field:tt) => {{
         _memoffset__field_check_tuple!($parent, $field);
+        let base = $base; // evaluate $base outside the `unsafe` block
 
         // Get the field address.
         // Crucially, we know that this will not trigger a deref coercion because
         // of the field check we did above.
         #[allow(unused_unsafe)] // for when the macro is used in an unsafe block
         unsafe {
-            _memoffset__raw_const!((*($base as *const $parent)).$field)
+            _memoffset__addr_of!((*(base as *const $parent)).$field)
         }
     }};
 }
diff --git a/src/span_of.rs b/src/span_of.rs
index 369e5c6..5fa11ae 100644
--- a/src/span_of.rs
+++ b/src/span_of.rs
@@ -95,23 +95,21 @@
     };
     // No explicit begin for range.
     (@helper $root:ident, $parent:path, [] ..) => {{
-        // UB due to taking references to uninitialized fields for `size_of_val`.
         ($root as usize,
-         $root as usize + $crate::mem::size_of_val(&(*$root)))
+         $root as usize + $crate::__priv::size_of_pointee($root))
     }};
-    (@helper $root:ident, $parent:path, [] ..= $field:tt) => {{
-        // UB due to taking references to uninitialized fields for `size_of_val`.
-        ($root as usize,
-         raw_field!($root, $parent, $field) as usize + $crate::mem::size_of_val(&(*$root).$field))
+    (@helper $root:ident, $parent:path, [] ..= $end:tt) => {{
+        let end = raw_field!($root, $parent, $end);
+        ($root as usize, end as usize + $crate::__priv::size_of_pointee(end))
     }};
-    (@helper $root:ident, $parent:path, [] .. $field:tt) => {{
-        ($root as usize, raw_field!($root, $parent, $field) as usize)
+    (@helper $root:ident, $parent:path, [] .. $end:tt) => {{
+        ($root as usize, raw_field!($root, $parent, $end) as usize)
     }};
     // Explicit begin and end for range.
     (@helper $root:ident, $parent:path, # $begin:tt [] ..= $end:tt) => {{
-        // UB due to taking references to uninitialized fields for `size_of_val`.
-        (raw_field!($root, $parent, $begin) as usize,
-         raw_field!($root, $parent, $end) as usize + $crate::mem::size_of_val(&(*$root).$end))
+        let begin = raw_field!($root, $parent, $begin);
+        let end = raw_field!($root, $parent, $end);
+        (begin as usize, end as usize + $crate::__priv::size_of_pointee(end))
     }};
     (@helper $root:ident, $parent:path, # $begin:tt [] .. $end:tt) => {{
         (raw_field!($root, $parent, $begin) as usize,
@@ -119,19 +117,17 @@
     }};
     // No explicit end for range.
     (@helper $root:ident, $parent:path, # $begin:tt [] ..) => {{
-        // UB due to taking references to uninitialized fields for `size_of_val`.
         (raw_field!($root, $parent, $begin) as usize,
-         $root as usize + $crate::mem::size_of_val(&*$root))
+         $root as usize + $crate::__priv::size_of_pointee($root))
     }};
     (@helper $root:ident, $parent:path, # $begin:tt [] ..=) => {{
         _memoffset__compile_error!(
             "Found inclusive range to the end of a struct. Did you mean '..' instead of '..='?")
     }};
     // Just one field.
-    (@helper $root:ident, $parent:path, # $begin:tt []) => {{
-        // UB due to taking references to uninitialized fields for `size_of_val`.
-        (raw_field!($root, $parent, $begin) as usize,
-         raw_field!($root, $parent, $begin) as usize + $crate::mem::size_of_val(&(*$root).$begin))
+    (@helper $root:ident, $parent:path, # $field:tt []) => {{
+        let field = raw_field!($root, $parent, $field);
+        (field as usize, field as usize + $crate::__priv::size_of_pointee(field))
     }};
     // Parsing.
     (@helper $root:ident, $parent:path, $(# $begin:tt)+ [] $tt:tt $($rest:tt)*) => {{
@@ -143,13 +139,11 @@
 
     // Entry point.
     ($sty:path, $($exp:tt)+) => ({
-        unsafe {
-            // Get a base pointer.
-            _memoffset__let_base_ptr!(root, $sty);
-            let base = root as usize;
-            let (begin, end) = span_of!(@helper root, $sty, [] $($exp)*);
-            begin-base..end-base
-        }
+        // Get a base pointer.
+        _memoffset__let_base_ptr!(root, $sty);
+        let base = root as usize;
+        let (begin, end) = span_of!(@helper root, $sty, [] $($exp)*);
+        begin-base..end-base
     });
 }