You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
For the following C++ program Clang incorrectly prints 0 instead of 1 with -O2 -fstrict-enums (see https://godbolt.org/z/Kaec7c4Eb):
#include<iostream>
#include<type_traits>enum E { E0 } e;
enum F { F0, F1, F2, F3 };
static_assert(std::is_same_v<std::underlying_type_t<E>, std::underlying_type_t<F>>);
structA { E e; };
structB { F f; };
union U {
A a;
B b;
} u;
booltest() {
return u.a.e == 2;
}
auto ptest = test;
intmain() {
u.b.f = F2;
std::cout << ptest();
}
Because the two enumerations have the same underlying type, they are layout-compatible and therefore it is permitted to use the inactive u.a.e to read the active u.b.f corresponding to it in the common initial sequence. The read should happen as if u.b.f was nominated, meaning it should read the value 2 even if E is not able to represent that value.
I am not sure whether this is intentional or should be considered a defect in the standard, though.