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

    <tr>
        <th>Summary</th>
        <td>
            Clang crashes when a consteval function has multiple diagnostics in flight
        </td>
    </tr>

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

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

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

<pre>
    Apologies for the terrible title: this is difficult to summarise. Clang will crash with the following code (that's a repro of real code). Observations:

* `get_format` and `f` must both be templates
* `get_format` must be `consteval`
* `f`'s return statement must try to initialise something that isn't actually a member
* both `get_format` and `f` need to generate a Sema diagnostic

```cpp
struct S {
    int e;
};

template<class T>
consteval int get_format()
{
        return nullptr;
}

template<class T>
constexpr S f(T) noexcept
{
        return get_format<T>();
}

constexpr S x = f(0);
```

**Observed on:** dae91f5dbc5bee579eac7f4cbb71e86f2934817f (trunk), e19b7dc36bc047b9eb72078d034596be766da350 (17.0.1), not present in 16.0.0
**Requires assertions:** Yes.
**Options:** `-gdwarf-4 -g -o /tmp/compiler-explorer-compiler202399-6962-m3zjz9.pmcim/output.s -mllvm --x86-asm-syntax=intel -S --gcc-toolchain=/opt/compiler-explorer/gcc-snapshot -fcolor-diagnostics -fno-crash-diagnostics -std=c++20 /tmp/compiler-explorer-compiler202399-6962-m3zjz9.pmcim/example.cpp`
**Diagnostics:**
```
<source>:8:9: error: cannot initialize return object of type 'int' with an rvalue of type 'std::nullptr_t'
    8 |         return nullptr;
      | ^~~~~~~
<source>:14:9: error: no viable conversion from returned value of type 'int' to function return type 'S'
   14 |         return get_format<T>();
      |                ^~~~~~~~~~~~~~~
<source>:17:17: note: in instantiation of function template specialization 'f<int>' requested here
   17 | constexpr S x = f(0);
      | ^
<source>:1:8: note: candidate constructor (the implicit copy constructor) not viable: no known conversion from 'int' to 'const S &' for 1st argument
    1 | struct S {
      |        ^
<source>:1:8: note: candidate constructor (the implicit move constructor) not viable: no known conversion from 'int' to 'S &&' for 1st argument
    1 | struct S {
 |        ^
<source>:17:17: error: call to immediate function 'f<int>' is not a constant expression
   17 | constexpr S x = f(0);
      | ^
clang++: /root/llvm-project/clang/lib/Sema/SemaDeclCXX.cpp:2492: void clang::Sema::DiagnoseImmediateEscalatingReason(clang::FunctionDecl*): Assertion `FD->hasBody() && "expected the function to have a body"' 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 -S --gcc-toolchain=/opt/compiler-explorer/gcc-snapshot -fcolor-diagnostics -fno-crash-diagnostics -std=c++20 <source> -isystem/opt/compiler-explorer/libs/glm/trunk
1.      <source>:17:21: current parser token ';'
 #0 0x00000000037217e8 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x37217e8)
 #1 0x000000000371f4ac llvm::sys::CleanupOnSignal(unsigned long) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x371f4ac)
 #2 0x0000000003668058 CrashRecoverySignalHandler(int) CrashRecoveryContext.cpp:0:0
 #3 0x00007f3dc8118420 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x14420)
 #4 0x00007f3dc7bdb00b raise (/lib/x86_64-linux-gnu/libc.so.6+0x4300b)
 #5 0x00007f3dc7bba859 abort (/lib/x86_64-linux-gnu/libc.so.6+0x22859)
 #6 0x00007f3dc7bba729 (/lib/x86_64-linux-gnu/libc.so.6+0x22729)
 #7 0x00007f3dc7bcbfd6 (/lib/x86_64-linux-gnu/libc.so.6+0x33fd6)
 #8 0x00000000062d20d5 (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x62d20d5)
 #9 0x00000000063bc61a EvaluateAndDiagnoseImmediateInvocation(clang::Sema&, llvm::PointerIntPair<clang::ConstantExpr*, 1u, unsigned int, llvm::PointerLikeTypeTraits<clang::ConstantExpr*>, llvm::PointerIntPairInfo<clang::ConstantExpr*, 1u, llvm::PointerLikeTypeTraits<clang::ConstantExpr*>>>) SemaExpr.cpp:0:0
#10 0x00000000063fcc9e clang::Sema::PopExpressionEvaluationContext() (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x63fcc9e)
#11 0x000000000627e4c8 clang::Sema::ActOnCXXExitDeclInitializer(clang::Scope*, clang::Decl*) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x627e4c8)
#12 0x0000000005ea7837 clang::Parser::ParseDeclarationAfterDeclaratorAndAttributes(clang::Declarator&, clang::Parser::ParsedTemplateInfo const&, clang::Parser::ForRangeInit*)::InitializerScopeRAII::pop() ParseDecl.cpp:0:0
#13 0x0000000005eb3582 clang::Parser::ParseDeclarationAfterDeclaratorAndAttributes(clang::Declarator&, clang::Parser::ParsedTemplateInfo const&, clang::Parser::ForRangeInit*) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x5eb3582)
#14 0x0000000005ec0c70 clang::Parser::ParseDeclGroup(clang::ParsingDeclSpec&, clang::DeclaratorContext, clang::ParsedAttributes&, clang::SourceLocation*, clang::Parser::ForRangeInit*) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x5ec0c70)
#15 0x0000000005e8e2eb clang::Parser::ParseDeclOrFunctionDefInternal(clang::ParsedAttributes&, clang::ParsedAttributes&, clang::ParsingDeclSpec&, clang::AccessSpecifier) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x5e8e2eb)
#16 0x0000000005e8ea1f clang::Parser::ParseDeclarationOrFunctionDefinition(clang::ParsedAttributes&, clang::ParsedAttributes&, clang::ParsingDeclSpec*, clang::AccessSpecifier) (.part.0) Parser.cpp:0:0
#17 0x0000000005e963c4 clang::Parser::ParseExternalDeclaration(clang::ParsedAttributes&, clang::ParsedAttributes&, clang::ParsingDeclSpec*) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x5e963c4)
#18 0x0000000005e96bed clang::Parser::ParseTopLevelDecl(clang::OpaquePtr<clang::DeclGroupRef>&, clang::Sema::ModuleImportState&) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x5e96bed)
#19 0x0000000005e89c9a clang::ParseAST(clang::Sema&, bool, bool) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x5e89c9a)
#20 0x000000000498b388 clang::CodeGenAction::ExecuteAction() (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x498b388)
#21 0x00000000041f0b09 clang::FrontendAction::Execute() (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x41f0b09)
#22 0x0000000004171fde clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x4171fde)
#23 0x00000000042cfcae clang::ExecuteCompilerInvocation(clang::CompilerInstance*) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x42cfcae)
#24 0x0000000000bef2d6 cc1_main(llvm::ArrayRef<char const*>, char const*, void*) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0xbef2d6)
#25 0x0000000000be6b9a ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&, llvm::ToolContext const&) driver.cpp:0:0
#26 0x0000000003fce1a9 void llvm::function_ref<void ()>::callback_fn<clang::driver::CC1Command::Execute(llvm::ArrayRef<std::optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const::'lambda'()>(long) Job.cpp:0:0
#27 0x0000000003668504 llvm::CrashRecoveryContext::RunSafely(llvm::function_ref<void ()>) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x3668504)
#28 0x0000000003fce79f clang::driver::CC1Command::Execute(llvm::ArrayRef<std::optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const (.part.0) Job.cpp:0:0
#29 0x0000000003f96965 clang::driver::Compilation::ExecuteCommand(clang::driver::Command const&, clang::driver::Command const*&, bool) const (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x3f96965)
#30 0x0000000003f973cd clang::driver::Compilation::ExecuteJobs(clang::driver::JobList const&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&, bool) const (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x3f973cd)
#31 0x0000000003f9f2f5 clang::driver::Driver::ExecuteCompilation(clang::driver::Compilation&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x3f9f2f5)
#32 0x0000000000bec77c clang_main(int, char**, llvm::ToolContext const&) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0xbec77c)
#33 0x0000000000ae6c91 main (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0xae6c91)
#34 0x00007f3dc7bbc083 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x24083)
#35 0x0000000000be667e _start (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0xbe667e)
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzkWltv27qW_jXKC2FDomRdHvLgOsmZbHTQoAkGnSeDopZs7lKkNkmlzn6Y3z4gdbHoOGl6TlLg4Bit60rk4rc-rsunC9Ga7QTAZbD6FKyuLkhn9lJd0j-r8qKU1dPlupVc7hhoVEuFzB6QAaVYyQEZZjgE8RqZPdOIaVSxuma04wYZiXTXNEQxDUu04UTs0A_GOaKK6D36wcze2aol5_IHEztEZQUowLnZExPgTCOCFLRKIlkjBYS7AQEuluhLqUE9EsOk0EG8DsKrIBy_8RoFabgDs62laogJ0hARUdmDtf3ddNqgUpo9Kq0jTcuJAf3K5H4C2BNUCm3gkfAgDb0Z1rKDrMB0SiBtiIEGhOlnG_Vk-WCCGUY404C0bMDsrdfWW8S0CHBmEKGmI5w_IYIaaEpQx1Uc5Fc9EwCVXWYHAhQxgAi6h4agipGdkNow6hGVhv0f2rb9EW1URw26R0H2qT-CEEJMGARBPBwJsqvjb_c9UhjEG8qJ1ughiK_7UxNdzsgMOM4DXIwGJ2vFQJ7oOG-N8tb8lQUPrUL3qA5w_hDgAgkJBwqteXG9GbB444z1-F5Yf77IAQXxlVsq9GaM3J5EZoDXfehChaSwkeuOoYpAEdWrqqSrEmCVFUBoVie0LLMI8rTGRZzkUVa77FCd-G4XwxsEUVFmFY3TkoZJVhZQZjjM8iqMk1WRlpClaUXiVWjnRdkyXEbDRCENahVoG6FMoChdhstwDvMr_NUxBRoRrUFNidbD_V_QS8-n9mRAkIaLXfWDqHqRoMUOLSQK8I1p2gDfUNm0jINawKHlUoFajEdwiOOiWKRFihdN_PeffxfLtqGsCfCN7EzbmaVGi4bzxwYtFoc8XRDdLPSTMOQQxFdMGOBocY8Wix2lCyMlp3vCRBBfWQOtObd2gG_sYC1Iq_fSoEVNJZdqcUwZjRa1kAtXtPzD2lRBfEUD_CnAn3D4L3oIB9K0HJY2G1NvK66Oi04Mnw-zeKNlpyjYEI7XeRCvC1ubQSmp7A9KhN34sQz9DWO5kuWfQI2ts-aptTU4Y8KW4L5KE4HUI-EdzAc479dBvB6ydWvHH6tGjoJsg8bPC4ndn7QDg9X1_7nPWU-i5JkrQqJHRmwLolI8gtJMClQr2QxrQYWeQR58MhLVnaA2ZEdg44j7uQ9Rcs6HnxWLo08nn8nF8XPe1Wz8sjnqWisTiAltiDDMdTzr0uTAWAyRboG6Te3HBDirg3hjXbYQM6Tgrw60gQrtQcHRycxhfUNN8zbrPPYh6CbklIiKVRads2-7i1R9hwfEmpYzygyisn2aD-hrthn2d9js70L-EM_22tvUAGfOim1gOLUHrVyJtEFE7TrbjI-ORM6R8w3P27139rWRj_BOvg5e_rOOvsXHYyzOSgjnTso0DVTMujuF4rOQY9r5RnqHidURB9t0rE_vE4DUqsq-AFtwAb5RUtpCb5vEolXSljVbkftxN5yVAb6xomj45woo33z75qpuvMZJga2dR8kq1M9xJc5NcL-GWgy3o_vXmhJODBO7r0C0FAHOZxNvBm7sMq5wuyK2Hluq7ZM3V4sgvt4T_UlWT30tGTYWBRjDoQVqk9Yp5SnpJdqTR6vvSjcJuxggjEM19OW7z9fr-2uku7JhdgfKbme1tFROl--NaftecmMbIDP7rlxS2QzEPeePad2BDvCN05tMUN5V4DD1Yr4k9LtRhILVFq0T7RS0hgoN8YQ3bibRWlJLW4VUJ5CmirVmgHxvCP2Oqq5pJ0UfLoOwuFNyp0gzxbYedvrlju42YHEULotBMt2UTByDwQYNOqNSSNv-uwiOWbqiBdNP2kDz6tKclXYXd9wO61lxREeW6HPZjyOX9J1SVim2RGlQyMjv4NLdpubUMAMchyg8hOMnznCUQY5cRLls0E-6_3GnmDBuvx_6oMmPgxT5sZXaKCCNS4MNclXPJkX-Trse4E_hYYA3XYdY_JGPP6oTQs_h33Agomu_iHu2E4QHOO-Eu4auEJd2lQ9A68B4aLGHNk3zcJWjjQ2br0DlI6inHt5_EVFxu2g-MOmN2Uhh4GCGChi6v9MS8bBEVscVzaMoT3CItlsF2kgFW2UGP_u6esjTbZosOBPdYbETXX-iNXsFpFpquQydL1GS4NDzJJkvk5VVGYYlUsReJ__cPrWWU2c5icOw9CyvfMslyVcFIqV8E_KZZYzzVeFZTk8tZ9Ouv9lmhn2bmW-TlnWV_prNOK6r1LOZz6MkxRUOq9V7R-dg1lu38NaNS5pGBF1bTU4MrEX1rJPeikdJnXj1e2jfrV0lOKbinbTVV90Kc0eY6u8EjBM2g9q4PrTKNd0Nijr7PSWpy4Mz5j6z7_Dw1MKDIsz2mdesWonzMqJbUcs3ovpXUfR_cOHu9djjz1PZlrbQ34-a0gLOa5w72V5POm3YMSbFUCgmifK-EdQDOt4VwnEU-ZGbQULz84jX1HwRm2_frg_MWKl1O13gqpNYorKFgf3Z4aM8e__McLA9v7y6vQKS5XE2R3Pnuuzst4VHlNuEdW1Ajf-Xai2qtTGKlZ2x8iw_8akfNCTPaytUD8NlpI3bXou_PutGqq9E7MAyPQnbIF7PmHdcf13f3vZnWtkOoTP5dD5QY5-eMl7l-N-fnvcOrIEYL7ASnzka0iz8KXP_ULJrfW7sOSZ29ux9C_S5q0fypqLwnAqP-lML905ofp4K_mlG_m4yHVcemSufzBwwlD8l84s6XvHVt7aY9_Lwl7h524hXN2hN7eWXPcdqBupDKHOMeJSlp5SRqH5r5nrMuRuUpzrgQ4g7jbvzxC1booxVr0PxeqHFZr7_RRrT5FX_rw99hMx4-D0-f0A4OG-9cMhP6SihepWOB9l-hkfgfTue8_ClJX91cGdOlN5Uv75C7UTQszIzSYT_llXH4bZppbJXngbc4A_hoYTK46E4SYuCFuQZD-v7hxdlbyklP_77EalsIc0xY08tJkVexrmnvTaygn-AWLuM7Q9dH4B2BoZDH6ISByAeUk8lJlEdlmExR3qjbIsS1RmoHwSyx-CBxD7ILKor8Onsl7116p7CeUZf9upDYnnA6TniibME05oSz5EB8tGf89d0z_z9kKI04PMc8DRSWEKNqxRRGm0bYm3MbkStlSJPrrBs6J6oUfaNV37-MbxxN40_xo8epefG6sSNtCwIGsnfRA-uUsycuW8I5_8D1Eh127T8rE8nl9jWxiDvZpK3QJVijy90QOwpgLimEJGiv5t-tDvexd4qx607Oz5Du-6HUMJ5Sej3bS38gt-vPcTQJtrIpiGiOk3qs3s4Pa-U7mE1sRzM-DHK3cKvx8vpDZombLf0cIii_j8l0YxutRs-sOgNtge2Zrpyt6dPzBHObU5INTtvh6yPJd4FUc-5mxLgjJOmrEiAsyNVOB9vNv4hy_P7kZ3eIlyFyWwrzt0I7M987cQ9qYE_eXS-vnUfcNezR-xFfn4aYlnhicz_uBA5EagvxkLhE1ekRbp6kTi3d-RZxxzZ9Ir5yUQ74KVr5FeGrj2xM_PtXQOqd3seUCcPLeoii2n1q7z8IUv9Mil_yPIz08Yj5bXSPMVB29_bHG5XvpXHIVh-C5uWLI_N6ITNGtcvRtnV7LcnHM4ohpd24Tey-f7lrafH4w-fNHaaZbTHOiqUEb8rK-uhKPy8bb-7JrHIPOieNgwJpLSIkAX93mv3pr21T54glTTMY7TdclbaSkyU2c6AvPX5TBLmsbfKM9WVZoB6--_PrzV-XH180-uiuoyrIi7IBVxGaZHmURLn0cX-ssjiKIJ8RXBBkrosK7oiZY1zGlc1idLkgl3iEMdRGBZhFBVJtIyTNMoiHOY1FHmYQ5CE0BDGlzaYllLtLtxj_8s0XyX4gpMSuHbvCGM8oMUB3gQYK9iNb3VgHKyuLtSle3-g7HY6SELOtNFHo-6V4cv-fWD3kBs0-rEHMb4n4t4XnV512BONmo4b1nJA86fhTKCas93eXHSKX_7zbzQ47_4_AAD__0aQ0L0">