Skip to content

[clang] Incorrect -fstrict-enums optimization of enumeration without fixed underlying type in the presense of common initial sequence rule. #150833

@keinflue

Description

@keinflue

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>>);

struct A { E e; };
struct B { F f; };
union U {
    A a;
    B b;
} u;

bool test() {
    return u.a.e == 2;
}

auto ptest = test;

int main() {
    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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    clangClang issues not falling into any other categoryquestionA question, not bug report. Check out https://llvm.org/docs/GettingInvolved.html instead!

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions