@@ -1131,213 +1131,3 @@ pub trait FnPtr: Copy + Clone {
11311131     #[ lang = "fn_ptr_addr" ]  
11321132    fn  addr ( self )  -> * const  ( ) ; 
11331133} 
1134- 
1135- /// Derive macro that makes a smart pointer usable with trait objects. 
1136- /// 
1137- /// # What this macro does 
1138- /// 
1139- /// This macro is intended to be used with user-defined pointer types, and makes it possible to 
1140- /// perform coercions on the pointee of the user-defined pointer. There are two aspects to this: 
1141- /// 
1142- /// ## Unsizing coercions of the pointee 
1143- /// 
1144- /// By using the macro, the following example will compile: 
1145- /// ``` 
1146- /// #![feature(derive_coerce_pointee)] 
1147- /// use std::marker::CoercePointee; 
1148- /// use std::ops::Deref; 
1149- /// 
1150- /// #[derive(CoercePointee)] 
1151- /// #[repr(transparent)] 
1152- /// struct MySmartPointer<T: ?Sized>(Box<T>); 
1153- /// 
1154- /// impl<T: ?Sized> Deref for MySmartPointer<T> { 
1155- ///     type Target = T; 
1156- ///     fn deref(&self) -> &T { 
1157- ///         &self.0 
1158- ///     } 
1159- /// } 
1160- /// 
1161- /// trait MyTrait {} 
1162- /// 
1163- /// impl MyTrait for i32 {} 
1164- /// 
1165- /// fn main() { 
1166- ///     let ptr: MySmartPointer<i32> = MySmartPointer(Box::new(4)); 
1167- /// 
1168- ///     // This coercion would be an error without the derive. 
1169- ///     let ptr: MySmartPointer<dyn MyTrait> = ptr; 
1170- /// } 
1171- /// ``` 
1172- /// Without the `#[derive(CoercePointee)]` macro, this example would fail with the following error: 
1173- /// ```text 
1174- /// error[E0308]: mismatched types 
1175- ///   --> src/main.rs:11:44 
1176- ///    | 
1177- /// 11 |     let ptr: MySmartPointer<dyn MyTrait> = ptr; 
1178- ///    |              ---------------------------   ^^^ expected `MySmartPointer<dyn MyTrait>`, found `MySmartPointer<i32>` 
1179- ///    |              | 
1180- ///    |              expected due to this 
1181- ///    | 
1182- ///    = note: expected struct `MySmartPointer<dyn MyTrait>` 
1183- ///               found struct `MySmartPointer<i32>` 
1184- ///    = help: `i32` implements `MyTrait` so you could box the found value and coerce it to the trait object `Box<dyn MyTrait>`, you will have to change the expected type as well 
1185- /// ``` 
1186- /// 
1187- /// ## Dyn compatibility 
1188- /// 
1189- /// This macro allows you to dispatch on the user-defined pointer type. That is, traits using the 
1190- /// type as a receiver are dyn-compatible. For example, this compiles: 
1191- /// 
1192- /// ``` 
1193- /// #![feature(arbitrary_self_types, derive_coerce_pointee)] 
1194- /// use std::marker::CoercePointee; 
1195- /// use std::ops::Deref; 
1196- /// 
1197- /// #[derive(CoercePointee)] 
1198- /// #[repr(transparent)] 
1199- /// struct MySmartPointer<T: ?Sized>(Box<T>); 
1200- /// 
1201- /// impl<T: ?Sized> Deref for MySmartPointer<T> { 
1202- ///     type Target = T; 
1203- ///     fn deref(&self) -> &T { 
1204- ///         &self.0 
1205- ///     } 
1206- /// } 
1207- /// 
1208- /// // You can always define this trait. (as long as you have #![feature(arbitrary_self_types)]) 
1209- /// trait MyTrait { 
1210- ///     fn func(self: MySmartPointer<Self>); 
1211- /// } 
1212- /// 
1213- /// // But using `dyn MyTrait` requires #[derive(CoercePointee)]. 
1214- /// fn call_func(value: MySmartPointer<dyn MyTrait>) { 
1215- ///     value.func(); 
1216- /// } 
1217- /// ``` 
1218- /// If you remove the `#[derive(CoercePointee)]` annotation from the struct, then the above example 
1219- /// will fail with this error message: 
1220- /// ```text 
1221- /// error[E0038]: the trait `MyTrait` is not dyn compatible 
1222- ///   --> src/lib.rs:21:36 
1223- ///    | 
1224- /// 17 |     fn func(self: MySmartPointer<Self>); 
1225- ///    |                   -------------------- help: consider changing method `func`'s `self` parameter to be `&self`: `&Self` 
1226- /// ... 
1227- /// 21 | fn call_func(value: MySmartPointer<dyn MyTrait>) { 
1228- ///    |                                    ^^^^^^^^^^^ `MyTrait` is not dyn compatible 
1229- ///    | 
1230- /// note: for a trait to be dyn compatible it needs to allow building a vtable 
1231- ///       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> 
1232- ///   --> src/lib.rs:17:19 
1233- ///    | 
1234- /// 16 | trait MyTrait { 
1235- ///    |       ------- this trait is not dyn compatible... 
1236- /// 17 |     fn func(self: MySmartPointer<Self>); 
1237- ///    |                   ^^^^^^^^^^^^^^^^^^^^ ...because method `func`'s `self` parameter cannot be dispatched on 
1238- /// ``` 
1239- /// 
1240- /// # Requirements for using the macro 
1241- /// 
1242- /// This macro can only be used if: 
1243- /// * The type is a `#[repr(transparent)]` struct. 
1244- /// * The type of its non-zero-sized field must either be a standard library pointer type 
1245- ///   (reference, raw pointer, `NonNull`, `Box`, `Rc`, `Arc`, etc.) or another user-defined type 
1246- ///   also using the `#[derive(CoercePointee)]` macro. 
1247- /// * Zero-sized fields must not mention any generic parameters unless the zero-sized field has 
1248- ///   type [`PhantomData`]. 
1249- /// 
1250- /// ## Multiple type parameters 
1251- /// 
1252- /// If the type has multiple type parameters, then you must explicitly specify which one should be 
1253- /// used for dynamic dispatch. For example: 
1254- /// ``` 
1255- /// # #![feature(derive_coerce_pointee)] 
1256- /// # use std::marker::{CoercePointee, PhantomData}; 
1257- /// #[derive(CoercePointee)] 
1258- /// #[repr(transparent)] 
1259- /// struct MySmartPointer<#[pointee] T: ?Sized, U> { 
1260- ///     ptr: Box<T>, 
1261- ///     _phantom: PhantomData<U>, 
1262- /// } 
1263- /// ``` 
1264- /// Specifying `#[pointee]` when the struct has only one type parameter is allowed, but not required. 
1265- /// 
1266- /// # Examples 
1267- /// 
1268- /// A custom implementation of the `Rc` type: 
1269- /// ``` 
1270- /// #![feature(derive_coerce_pointee)] 
1271- /// use std::marker::CoercePointee; 
1272- /// use std::ops::Deref; 
1273- /// use std::ptr::NonNull; 
1274- /// 
1275- /// #[derive(CoercePointee)] 
1276- /// #[repr(transparent)] 
1277- /// pub struct Rc<T: ?Sized> { 
1278- ///     inner: NonNull<RcInner<T>>, 
1279- /// } 
1280- /// 
1281- /// struct RcInner<T: ?Sized> { 
1282- ///     refcount: usize, 
1283- ///     value: T, 
1284- /// } 
1285- /// 
1286- /// impl<T: ?Sized> Deref for Rc<T> { 
1287- ///     type Target = T; 
1288- ///     fn deref(&self) -> &T { 
1289- ///         let ptr = self.inner.as_ptr(); 
1290- ///         unsafe { &(*ptr).value } 
1291- ///     } 
1292- /// } 
1293- /// 
1294- /// impl<T> Rc<T> { 
1295- ///     pub fn new(value: T) -> Self { 
1296- ///         let inner = Box::new(RcInner { 
1297- ///             refcount: 1, 
1298- ///             value, 
1299- ///         }); 
1300- ///         Self { 
1301- ///             inner: NonNull::from(Box::leak(inner)), 
1302- ///         } 
1303- ///     } 
1304- /// } 
1305- /// 
1306- /// impl<T: ?Sized> Clone for Rc<T> { 
1307- ///     fn clone(&self) -> Self { 
1308- ///         // A real implementation would handle overflow here. 
1309- ///         unsafe { (*self.inner.as_ptr()).refcount += 1 }; 
1310- ///         Self { inner: self.inner } 
1311- ///     } 
1312- /// } 
1313- /// 
1314- /// impl<T: ?Sized> Drop for Rc<T> { 
1315- ///     fn drop(&mut self) { 
1316- ///         let ptr = self.inner.as_ptr(); 
1317- ///         unsafe { (*ptr).refcount -= 1 }; 
1318- ///         if unsafe { (*ptr).refcount } == 0 { 
1319- ///             drop(unsafe { Box::from_raw(ptr) }); 
1320- ///         } 
1321- ///     } 
1322- /// } 
1323- /// ``` 
1324- #[ rustc_builtin_macro( CoercePointee ,  attributes( pointee) ) ]  
1325- #[ allow_internal_unstable( dispatch_from_dyn,  coerce_unsized,  unsize,  coerce_pointee_validated) ]  
1326- #[ rustc_diagnostic_item = "CoercePointee" ]  
1327- #[ unstable( feature = "derive_coerce_pointee" ,  issue = "123430" ) ]  
1328- pub  macro CoercePointee ( $item: item)   { 
1329-     /* compiler built-in */ 
1330- } 
1331- 
1332- /// A trait that is implemented for ADTs with `derive(CoercePointee)` so that 
1333- /// the compiler can enforce the derive impls are valid post-expansion, since 
1334- /// the derive has stricter requirements than if the impls were written by hand. 
1335- /// 
1336- /// This trait is not intended to be implemented by users or used other than 
1337- /// validation, so it should never be stabilized. 
1338- #[ lang = "coerce_pointee_validated" ]  
1339- #[ unstable( feature = "coerce_pointee_validated" ,  issue = "none" ) ]  
1340- #[ doc( hidden) ]  
1341- pub  trait  CoercePointeeValidated  { 
1342-     /* compiler built-in */ 
1343- } 
0 commit comments