From a34c2677afeee2747d680536f302a8c5665a65f4 Mon Sep 17 00:00:00 2001
From: Mark Rousskov <mark.simulacrum@gmail.com>
Date: Sat, 21 Dec 2019 20:35:41 -0500
Subject: [PATCH] Warn against relying on ?Sized being last

---
 src/liballoc/rc.rs   | 2 ++
 src/liballoc/sync.rs | 2 ++
 2 files changed, 4 insertions(+)

diff --git a/src/liballoc/rc.rs b/src/liballoc/rc.rs
index 42a278de98bef..00c4b5462be64 100644
--- a/src/liballoc/rc.rs
+++ b/src/liballoc/rc.rs
@@ -2106,6 +2106,8 @@ impl<T: ?Sized> Unpin for Rc<T> { }
 unsafe fn data_offset<T: ?Sized>(ptr: *const T) -> isize {
     // Align the unsized value to the end of the `RcBox`.
     // Because it is ?Sized, it will always be the last field in memory.
+    // Note: This is a detail of the current implementation of the compiler,
+    // and is not a guaranteed language detail. Do not rely on it outside of std.
     data_offset_align(align_of_val(&*ptr))
 }
 
diff --git a/src/liballoc/sync.rs b/src/liballoc/sync.rs
index a99564c0dac8a..37995a7ec794f 100644
--- a/src/liballoc/sync.rs
+++ b/src/liballoc/sync.rs
@@ -2161,6 +2161,8 @@ impl<T: ?Sized> Unpin for Arc<T> { }
 unsafe fn data_offset<T: ?Sized>(ptr: *const T) -> isize {
     // Align the unsized value to the end of the `ArcInner`.
     // Because it is `?Sized`, it will always be the last field in memory.
+    // Note: This is a detail of the current implementation of the compiler,
+    // and is not a guaranteed language detail. Do not rely on it outside of std.
     data_offset_align(align_of_val(&*ptr))
 }