pcc wrote: C++23 has this to say on reinterpret_casts:
> When a prvalue v of object pointer type is converted to the object pointer > type “pointer to cv T”, the result is static_cast<cv T*>(static_cast<cv > void*>(v)). and on static_casts it says: > A prvalue of type “pointer to cv1 void” can be converted to a prvalue of type > “pointer to cv2 T”, where T is an object type and cv2 is the same > cv-qualification as, or greater cv-qualification than, cv1. If the original > pointer value represents the address A of a byte in memory and A does not > satisfy the alignment requirement of T, then the resulting pointer value is > unspecified. Otherwise, if the original pointer value points to an object a, > and there is an object b of type T (ignoring cv-qualification) that is > pointer-interconvertible (6.8.3) with a, the result is a pointer to b. > Otherwise, the pointer value is unchanged by the conversion. The standard permits pointers to different layout-incompatible types to have different representations: > The value representation of pointer types is implementation-defined. Pointers > to layout-compatible types shall have the same value representation and > alignment requirements So as long as `std::unique_ptr<int>` is non-standard-layout (making it layout-incompatible and non-pointer-interconvertible with its field), we can simply declare that the abstract machine operates as-if the value representations of `std::unique_ptr<int> *` and `int **` are different, which results in UB when using the unchanged pointer value. https://github.com/llvm/llvm-project/pull/151652 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits