https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97128

            Bug ID: 97128
           Summary: Uninitialized members of base class wrongly allowed in
                    constexpr constructor
           Product: gcc
           Version: 11.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: feodor.alexeev+gcc at gmail dot com
  Target Milestone: ---

Given this code: (https://godbolt.org/z/qsaeM7)

struct Base {
    int x;
};

struct Derived : Base {
    constexpr Derived() { }
};

int main () {
    constexpr Derived kDerived;
    return kDerived.x;
}

g++ -std=c++17 -pedantic compiles the program that exits with code 0.
clang rejects it as I believe in c++17 for a constructor to be constexpr all
members must be initialized before execution enters the body of the
constructor.

I also believe that the program is invalid as of c++20 as all must be
initialized by the end of the constexpr constructor. Still g++ -std=c++2a
compiles it.

Note that if there was an uninitialized member of Derived itself, g++ would
generate an error as expected.

There is a similar bug filed where g++ wrongly allows uninitialized member of
anonymous struct inside a union member:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86581 . Not sure if this counts as
a duplicate.

Reply via email to