<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/77085>77085</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Initializing union containing struct with flexible array member asserts
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang:codegen,
            crash-on-valid
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          nikic
      </td>
    </tr>
</table>

<pre>
    ```c
struct _NMPObject {
  int ifindex;
  char network_ptr[];
};

union {
  int x;
  struct _NMPObject k;
} foo = {};
```

Appears to have regressed in clang 15: https://cpp.godbolt.org/z/ePnc1PKdG

```
clang: /home/npopov/repos/llvm-project/clang/include/clang/AST/Expr.h:4905: const Expr *clang::InitListExpr::getInit(unsigned int) const: Assertion `Init < getNumInits() && "Initializer access out of range!"' failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace, preprocessed source, and associated run script.
Stack dump:
0.      Program arguments: /home/npopov/repos/llvm-project/build/bin/clang repro.c -c
1.      <eof> parser at end of file
2.      repro.c:6:1: LLVM IR generation of declaration 'union (unnamed at repro.c:6:1)'
3.      repro.c:9:3: Generating code for declaration 'foo'
 #0 0x0000000006fe2c98 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/home/npopov/repos/llvm-project/build/bin/clang+0x6fe2c98)
 #1 0x0000000006fe083e llvm::sys::RunSignalHandlers() (/home/npopov/repos/llvm-project/build/bin/clang+0x6fe083e)
 #2 0x0000000006f4a066 CrashRecoverySignalHandler(int) CrashRecoveryContext.cpp:0:0
 #3 0x00007f1fe2a5fbb0 __restore_rt (/lib64/libc.so.6+0x3dbb0)
 #4 0x00007f1fe2ab0884 __pthread_kill_implementation (/lib64/libc.so.6+0x8e884)
 #5 0x00007f1fe2a5fafe gsignal (/lib64/libc.so.6+0x3dafe)
 #6 0x00007f1fe2a4887f abort (/lib64/libc.so.6+0x2687f)
 #7 0x00007f1fe2a4879b _nl_load_domain.cold (/lib64/libc.so.6+0x2679b)
 #8 0x00007f1fe2a58187 (/lib64/libc.so.6+0x36187)
 #9 0x000000000a3d331e clang::VarDecl::getFlexibleArrayInitChars(clang::ASTContext const&) const (/home/npopov/repos/llvm-project/build/bin/clang+0xa3d331e)
#10 0x00000000071f584e clang::CodeGen::CodeGenModule::EmitGlobalVarDefinition(clang::VarDecl const*, bool) (/home/npopov/repos/llvm-project/build/bin/clang+0x71f584e)
#11 0x00000000071ec526 clang::CodeGen::CodeGenModule::EmitGlobalDefinition(clang::GlobalDecl, llvm::GlobalValue*) (/home/npopov/repos/llvm-project/build/bin/clang+0x71ec526)
#12 0x00000000071f1002 clang::CodeGen::CodeGenModule::EmitGlobal(clang::GlobalDecl) (/home/npopov/repos/llvm-project/build/bin/clang+0x71f1002)
#13 0x00000000071eb1b9 clang::CodeGen::CodeGenModule::EmitTopLevelDecl(clang::Decl*) (/home/npopov/repos/llvm-project/build/bin/clang+0x71eb1b9)
```

(I'm marking this as "crash-on-valid" as it should at least compile with GNU extensions -- I'm not sure whether this is conformant with standard C. It occurs in the wild in NetworkManager.)
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysV11v2zoS_TX0yyCGRFlfD35w3ThbbNoNmu59NShqJHFDkQJJJen99QtSsmP5tlvcboIktkbUnHPmQxwya0WrELck_UDSjys2uk6brRJPgq8qXX_fkiyafjmJPpJoZ50ZuYPjl88P_6r-g9wByT9MtwCEciAaoWp8JcnZyjtmQKF70ebpODgzYZ0XkPzie_g_KqHVtd9Lj38l8XTpDhqtgSQfg4tL7yctl2C7YUBmLDgNHXtGMNgatBZrEAq4ZKqFOCXJDjrnBkuSHaEHQg98GNatrist3VqbltDDn4Qe8EHx-OGf9d0lwhVs8OkdEnrodI-EHtSgB_1M6MHgoC2hBymf-5vBaK_Ng4VH6EEoLscaLyy7x2-EHm5fB7PuSLLblFHgyrWyDrwZCD0jkmT3SQl3L6zztyZLi84bCS1GFYrBC3eElpMT721nLRoXcpJFfjGQZA8tui9j7y8toYV_gNCM0AwIpd4qmBR_ogHGOVoLenSgGzBMtUhoTCglNIeGCYn1eorMw_3t7vEW7Fj1wgGDamzBR8S4kJ1F_FvhurFac93P4fpr1IS1I_poAlNeVIgduA6BG2Y7qBh_coZxJHQPg8HBaD5l3urRTGb_JLNWc8Ec1mBGBZYbMbiZ8qNj_AnqsR88s2CK1iQqH4xuDeuBmXbsUTn79xJejULW_lOoU7IhEFxzuJk7MfY4JNmjbkhyCwMz1kfbAaraR7oREqeV1K-cHyfJLiPJLvZ87u__-AyfvkKLCg0LCdYN1Mglmy8Jzedm9OWhWI-1R7j2RUtC8wkrWWKVJNklHutuxlAtcF0jNNpcIzVan90AoUkE0Wt0-skapLwsIKQ6FK79bqcvD0YoFxLxbcpm8bbIsJejts4g60N17k_FHUr2_0gHoR-i15mU139mHV-xjooEf8T666geRauY_AdTtUTz1kTvQ8zjLojRJbENi7IM9r4TviLXz2i-L_gQWsyhWqzZa-Xw1a354Cs-Cn9niGSGyJu4QcrSpqoiOB4NWqcNHo2b1UlRZZvpk6-tXmeBdFJXVbSgvFn6q6Ki2MDxOLjOIKuPT0LKo-gHib7FTnX0c4ACi2KzAEivCbMGobUhDr_gyppleLOlq01R5A2wSv9CNM2KvFk4yq8d5WUFRyWPUrP6WOueCbXmWta_8JuX1cJvcaW1iIv8f2vM4iJfuCgvS4gldZLECBe7yx_MfEQuzxvLQeKrqCTujGHf_Z6w71go9Itndo_f5pqaNxzfpvPm8z7NMBM9K_FNuni35HGTFpuFkr2u8Q7V4uKzrkeJk-m2F-5O6orJoLkRfsPTailtDsdJ186_fiqt5bu1-Ux8oSxeKkOe0uz3lP1M1ukul17Q26vtFA85YhD7biKDhoVIepW-OIro74n8ubT3y5Fnt6CfXOWoiqvy79L_pod7fMaZ7KWIyfKuCfAE3xT8aIwmtPhEaN5Dz8yT3-VdJyww66fBMG7daHXzzKSoCaXeLhzYTo8yDBQSmfX93w9CIrwI18Hdl38DvjpUVmhl4eYGJv9KO7CjQXjp0HVoJiBhfZc12vRMucmBdUzVzNSwX8MnB5rz0Vg_1PsJ8EXIMOB_mY4ln5liLZo1oeWq3iZ1mZRshds4jzabNIvTeNVt04SWSbVpiiqOoiwqK16kRUnTNK_SMi2bldjSiG6iOEpjGlFarpMm57wqMKqbKkpZSTYR9kzItQ-8PzWswoi6zfOoSFeSVShtOIlRekqnn5VaVGFa3v8olP7UZrYhk9XYWrKJpLDOvkE44SRuzwO5T8000nGtHBPKG-bzVAhbM7-zgfmXNvTYV36sDEcAuxqN3P7-IB6E_jcAAP__u0pnTA">