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

            Bug ID: 120498
           Summary: error: either all initializer clauses should be
                    designated or none of them should be when
                    designated-initialising nested union members(?) (same
                    code accepted as C)
           Product: gcc
           Version: 16.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: nabijaczleweli at nabijaczleweli dot xyz
  Target Milestone: ---

Real code:
  static jmp_buf sigbussy;
  struct sigaction sa{.sa_flags = static_cast<int>(SA_RESETHAND), .sa_handler =
[](int) { longjmp(sigbussy, true); }};

Extracted:
  #include <signal.h>
  struct sigaction sa = {.sa_flags = SA_RESETHAND, .sa_handler = 0};

Reduced:
  struct sa {
    int sa_flags;
    union {
      int sa_handler, b;
    } u;
  };
  struct sa sa = {.sa_flags = 0, .u.sa_handler = 0};

g++ -std=c++20 fails to compile this with
  <source>:7:32: error: either all initializer clauses should be designated or
none of them should be
      7 | struct sa sa = {.sa_flags = 0, .u.sa_handler = 0};
        |                                ^
  <source>:7:32: error: expected primary-expression before '.' token
  Compiler returned: 1

gcc accepts this directly. Repro on 12.2.0, 14.2.0,
Compiler-Explorer-Build-gcc-c7df2b7d4380ade4caf8af4de8d3407d7d523a2f-binutils-2.42)
16.0.0 20250531 (experimental). Probably earlier ones too.

(You can drop the .sa_flags initialiser to get a slightly different error.)

Clang accepts this always. Somehow I feel like GCC-in-C++ mode is wrong to
reject it here.

Reply via email to