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

            Bug ID: 109739
           Summary: bogus warning due to -Wmissing-field-initializers in
                    C++20 with designated initializers on struct with
                    empty base class
           Product: gcc
           Version: 13.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: tobias.rittweiler at contractors dot roche.com
  Target Milestone: ---

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
#include <cstdint>

struct Empty {};

struct S : Empty {
    uint32_t Uint32;
};

void consume(const S&) {}

void test() {
    S s = { .Uint32 = 42 };
    consume(s);
}
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

gcc-13.1 -std=c++20 -Werror=missing-field-initializers

<source>: In function 'void test()':
<source>:12:26: error: missing initializer for member 'S::<anonymous>'
[-Werror=missing-field-initializers]
   12 |     S s = { .Uint32 = 42 };
      |                          ^
cc1plus: some warnings being treated as errors
Compiler returned: 1


My reading of
https://en.cppreference.com/w/cpp/language/aggregate_initialization is that
since C++17 base classes are allowed in class type to form an "aggregate" and
designated initializers are allowed since C++20.

So I would expect this example to be free of any warning.


(I am aware of the situation that the man page currently says that
`-Wmissing-field-initializers` "does not warn about designated initializers"
but that is evidently not true in the C++ frontend, as has been pointed out
before, see [1], [2].)


[1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=39589#c11
[2] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96868#c3

Reply via email to