On 2022-11-11 03:55, Clive D.W. Feather wrote:
int x; int y = x;
is undefined behaviour because it might assign a trap representation to y.
It's undefined even on implementations that don't have trap representations. Draft C23 6.3.2.1 "Lvalues, arrays, and function designators" says, "If the lvalue designates an object of automatic storage duration that could have been declared with the register storage class (never had its address taken), and that object is uninitialized (not declared with an initializer and no assignment to it has been performed prior to use), the behavior is undefined." Hence, in the typical case where there are no trap representations, this code: time_t x, y = x; return !y; has undefined behavior, whereas this code: time_t x, y = x; return time(&x) == (time_t)-1 ? !y : !!y; must return 0 or 1 and the implementation cannot reject the first line's use of the uninitialized variable x. This part of the standard is strange indeed, and I can't imagine debugging implementation wanting to conform to the standard as written.