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

    <tr>
        <th>Summary</th>
        <td>
            [clang] Crash in constexpr evaluator when initializing complex value
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang
      </td>
    </tr>

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

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

<pre>
    See:
```c++
typedef __attribute__((__ext_vector_type__(2))) float float2;

struct vec2 {
 _Complex  float v;
public:
    constexpr vec2(float x, float y) {
 __real(v) = x;
    }
};

constexpr vec2 S = vec2(1.0, 1.0);
```
https://godbolt.org/z/Grds7av5Y

The [original report](https://github.com/llvm/llvm-project/pull/101126#issuecomment-2887852032) used vectors, but it also happens with the not-so-recent `_Complex`.

Backtrace:
```console
clang++: /root/llvm-project/llvm/tools/clang/lib/AST/ExprConstant.cpp:4071: typename SubobjectHandler::result_type findSubobject({anonymous}::EvalInfo&, const clang::Expr*, const {anonymous}::CompleteObject&, const {anonymous}::SubobjectDesignator&, SubobjectHandler&) [with SubobjectHandler = {anonymous}::ModifySubobjectHandler; typename SubobjectHandler::result_type = bool]: Assertion `O->isComplexFloat()' 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: /opt/compiler-explorer/clang-assertions-trunk/bin/clang++ -gdwarf-4 -g -o /app/output.s -mllvm --x86-asm-syntax=intel -fno-verbose-asm -S --gcc-toolchain=/opt/compiler-explorer/gcc-snapshot -fcolor-diagnostics -fno-crash-diagnostics -std=c++20 <source>
1.      <source>:12:34: current parser token ';'
 #0 0x0000000003f99d48 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x3f99d48)
 #1 0x0000000003f979d4 llvm::sys::CleanupOnSignal(unsigned long) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x3f979d4)
 #2 0x0000000003edc608 CrashRecoverySignalHandler(int) CrashRecoveryContext.cpp:0:0
 #3 0x000070c8a7842520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520)
 #4 0x000070c8a78969fc pthread_kill (/lib/x86_64-linux-gnu/libc.so.6+0x969fc)
 #5 0x000070c8a7842476 gsignal (/lib/x86_64-linux-gnu/libc.so.6+0x42476)
 #6 0x000070c8a78287f3 abort (/lib/x86_64-linux-gnu/libc.so.6+0x287f3)
 #7 0x000070c8a782871b (/lib/x86_64-linux-gnu/libc.so.6+0x2871b)
 #8 0x000070c8a7839e96 (/lib/x86_64-linux-gnu/libc.so.6+0x39e96)
 #9 0x00000000078c3013 handleAssignment((anonymous namespace)::EvalInfo&, clang::Expr const*, (anonymous namespace)::LValue const&, clang::QualType, clang::APValue&) ExprConstant.cpp:0:0
#10 0x00000000078f7ead clang::StmtVisitorBase<llvm::make_const_ptr, (anonymous namespace)::LValueExprEvaluator, bool>::Visit(clang::Stmt const*) ExprConstant.cpp:0:0
#11 0x00000000078f888d EvaluateLValue(clang::Expr const*, (anonymous namespace)::LValue&, (anonymous namespace)::EvalInfo&, bool) ExprConstant.cpp:0:0
#12 0x00000000078cc266 Evaluate(clang::APValue&, (anonymous namespace)::EvalInfo&, clang::Expr const*) ExprConstant.cpp:0:0
#13 0x00000000078ccc14 EvaluateIgnoredValue((anonymous namespace)::EvalInfo&, clang::Expr const*) ExprConstant.cpp:0:0
#14 0x00000000078efdfc EvaluateStmt((anonymous namespace)::StmtResult&, (anonymous namespace)::EvalInfo&, clang::Stmt const*, clang::SwitchCase const*) (.part.0) ExprConstant.cpp:0:0
#15 0x00000000078f0228 EvaluateStmt((anonymous namespace)::StmtResult&, (anonymous namespace)::EvalInfo&, clang::Stmt const*, clang::SwitchCase const*) (.part.0) ExprConstant.cpp:0:0
#16 0x0000000007921593 HandleConstructorCall(clang::Expr const*, (anonymous namespace)::LValue const&, (anonymous namespace)::CallRef, clang::CXXConstructorDecl const*, (anonymous namespace)::EvalInfo&, clang::APValue&) ExprConstant.cpp:0:0
#17 0x000000000792195f HandleConstructorCall(clang::Expr const*, (anonymous namespace)::LValue const&, llvm::ArrayRef<clang::Expr const*>, clang::CXXConstructorDecl const*, (anonymous namespace)::EvalInfo&, clang::APValue&) ExprConstant.cpp:0:0

```

</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzcWF1v47oR_TX0CyFDIq2vBz8odtxeYIvdbhYXt08GRY1kNjQpkJTXvr--ICXHsZNt6m57UTRw4oDkHJ4ZnpmhxKwVnQJYovQBpesZG9xOm6WrGTRgzKzWzWn5BIBoheIKZfH44Yg8-E9cuVMPDbR4u2XOGVEPDrZbRApEiu0Wjm57AO602fp1YYIgUo4f3ErN3PiXIOrRUFxZZwbu8AE4wSj3g3i70vtewhFPFodxcT_UUvCRGcYYc62sg2NvgjEixbj6iMhqMjz5Xc-gWwNMIlIcwiBd4-MI66FQvvZs8vULrWtw_BQspn2Seez3CF_lZHGOFIqrnXO99TTJBpFNp5taSzfXpkNk8zsimz-ZxubskP5t3OnbDjBKH7QRnVBMYgO9Ng6la0SKGyjhdkM953qPyEbKw_kr6o3-O3CHyKYfpERkk8RJQjJEqLB2AK73e1AuIkWRFymJqT8TPFho8Hha1rtTDw4Lh5m0Gu9Y34Oy-LtwO-x2gJV2kdWRAQ7KYZTF5zNCWTwf_Xhg_NkZxt9oRyurJfiYSqa6SUm0wohsjNburROTa05raRHZTGYbKWpENtXTN0Q2j8ferPwRMeXmvO8RrRZxnnhYrzzF9oCfhlrXHvLPTDUSjOdFKwN2kC7oE7dCNS-rvIjzB6a0Ou31YIMYvMHjgclfVKuRD-hqVB0eOY3zx94gUl3m3kUZw-Xg87RX9sH6F1pr8BnLnDaT0Ru3_HDpJRRO63Y6CPfdLf6iG9Ge3kbp4Z4QevRaa-n1SitcWQvGCa28Rj5HiD4KOyll41MyVIoSkRy3TEhovHa-fHqsnh6xHeq91x-uh25KAuw0vjsFguS9bjBTDRaKy6GBIGJumN3h-kWnZIV7A73RHKxPBqsHMw57S2at5oI5aLAZFLbciN55vk-O8WfcDPt-VLpPgPKL0Z1he8xMN_hks5PCde85cb3vhQQTwbGX2vhDG2UdsXPAbOTMoJ4R2dRCXVTvkwVHXfOdmTZa4KjDkfa4rO89-uD6wc0tjvY-CjiKjkUWMbuP7Ek5dkR0LZQDiaNW6egAptYW_DyOnnAUdZxHPsv4jgmF6Pqf8vWLrWK93WmHo5ZrqU3UCNYpbZ3gdtwjxPh62LoG0fXUQkiMEV1NkaaPKK4SH76rMVolBNGKLnwM-WCMrzk9MxYMdvoZFEYk93WX5L5-I0JjHB_j8w9ty7JZFDjIIwjWnuz4zxcjlAvn921UQHFZZNj3rbbOANtPmSaUC5nlNfsfOUhEHuLjRM-nwUg-uSGfl83iPfIrCUwN_Wf15AuCb2WDCt28wVL7Lf4bVD2ZC1VyRRUansUFXvkj_wpcH8CcRm4vpamYYni1ZqWVg-O5bsfhd8SnE34e84LlxYKkXi_BqbH6H4tsmy0iKdRwjDo1jBN8bvU8C5SDyYXw4hqwzMqW497tDLBm-yykvA892F_Q01u6izzDXajXdwIH0wtwdg1MirylmNW-JN4FGwwvsPkb2KS-GzCpL4DFNSAtoczuAwwmF8DytcDygtM4oXgX1FSFq6uvreN186WhYd-qbB_yuXy_Z19367HvTj37A6RPvzI5wNniFu2vA5PfTj3cDFdfgtXUmd-5q5w177M_vna5zYE1r8Ge3N79Kqxw2jwwC4iuLrVhz55hG7hte2f-ZXc8Ix-iYbxWrMYOHiovolXYDJHihsOrqH3oU3LjU1EUDZ52hE9TcIqfPpbpQO4TQ_D1YxfIjRI5ybIXF67Jvz7ue9n8OAYfMqS3DHmyeGH4S6e0geYc6j-M1OKaFLRNy19IeRl9TMav-hqumD8b0RvZXs99F47vVszClXuIFPOeGRee7T5yNr2ReUxI8X_rbHblbEmStKR4bPTByj_Ga7Ni_gH051P7quJ-YOH3_Artjc-r3357xWsNXN7D4sdxvqu457dBK9P2DwrapUtUxrCTDxBd_XAL-vg_F77rtyqzZkmbkpZsBsskX-SLNMuTbLZblkmc52XJWdOkGUlKmjd1DIzROs-LLMlmYkliksZpkscLWtBsTnkGaZ0VUJc8bpMELWLYMyHnPmRzbbpZeIZcJouYLoqZZDVIG96YETJdkQlK1zOzDI-e9dBZtIilsM5eIJxwMrxmGy3S9XgHxkK9enEF5yaMv-9AYaGEE0yK34XqMJ9egvklMBuMXP77j8KTJ4cl-UcAAAD__5LcK_E">