This is an unofficial snapshot of the ISO/IEC JTC1 SC22 WG21 Core Issues List revision 114a. See http://www.open-std.org/jtc1/sc22/wg21/ for the official list.
2024-04-28
Consider:
struct X; // declared, but not defined
int i;
X* p = static_cast<X*>(static_cast<void*>(&i));
Is the value of p unspecified per 7.6.1.9 [expr.static.cast] paragraph 14?
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, ...
Is that a case where implementations have to possibly pessimize a use of an undefined class, because a later definition can have the worst possible properties? Such a situation can also occur for pointer-to-members of undefined classes.
CWG 2023-12-15
The resulting pointer value should be unspecified if T is incomplete.
CWG 2023-03-18
CWG decided to reverse direction here and to constrain implementations, not programs.
Proposed resolution (approved by CWG 2024-03-18):
Change in 7.6.1.9 [expr.static.cast] paragraph 14 and add bullets as follows:
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 , T is complete, and A does not satisfy the alignment requirement of T, then the resulting pointer value is unspecified. Otherwise, ...