Section: 17.6.5 [ptr.launder] Status: C++20 Submitter: Hubert Tong Opened: 2017-01-31 Last modified: 2021-02-25
Priority: 2
View all other issues in [ptr.launder].
View all issues with C++20 status.
Discussion:
Given:
struct A { int x, y; }; A a[100];
The bytes which compose a[3]
can be reached from &a[2].x
:
reinterpret_cast<A *>(&a[2].x) + 1
points to a[3]
,
however, the definition of "reachable" in [ptr.launder] does not encompass this case.
[2017-03-04, Kona]
Set priority to 2. Assign this (and 2860) to Core.
[2017-08-14, CWG telecon note]
CWG is fine with the proposed resolution.
[2020-02 Status to Immediate on Thursday night in Prague.]
Proposed resolution:
This wording is relative to N4618.
Modify 17.6.5 [ptr.launder] as indicated:
template <class T> constexpr T* launder(T* p) noexcept;[…]
-3- Remarks: An invocation of this function may be used in a core constant expression whenever the value of its argument may be used in a core constant expression. A byte of storageb
is reachable through a pointer value that points to an objectY
if there is an objectZ
, pointer-interconvertible withY
, such thatb
itis within the storage occupied byZ
,Yan object that is pointer-interconvertible withor the immediately-enclosing array object ifY
,Z
is an array element. The program is ill-formed ifYT
is a function type or (possibly cv-qualified)void
.