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

    <tr>
        <th>Summary</th>
        <td>
            [c++20][concepts][clangd][AST] Crash in clangd due to assertion failure in ASTWriter.cpp:5814
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

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

<pre>
    I am hitting a crash in clangd when indexing a large codebase's pch. After debugging, the code being parsed during the crash appears to be this:
```cpp
namespace fixed_containers
{
template <class StorageType>
concept IsFixedIndexBasedStorage = requires(const StorageType& a,
                                            StorageType& b,
                                            const std::size_t i)
{
    ...
};

```
The assertion at `ASTWriter.cpp:5814` is hit reliably. The cause appears to be `getTemplateArgsAsWritten()` returning null. Examining the definition, it appears that this can happen when the 2nd constructor overload for `ConceptSpecializationExpr` defined at `clang/lib/AST/ExprConcepts.cpp:73` is triggered, which always passes a nullptr for getTemplateArgsAsWritten(). Interestingly, Examining the expression in GDB, getTemplateArguments() returns one value.

I'm unsure if this overload is incorrect and the expectation is that this argument is never not null or if the `VisitConceptSpecializationExpr` is simply missing a conditional. 

Crash Backtrace:
```cpp
#29 0x0000557f32382b09 in clang::ASTRecordWriter::AddASTTemplateArgumentListInfo (this=0x7fb376018400, ASTTemplArgList=0x0) at /tools/build-llvmorg-16.0.0-rc4/source/clang/lib/Serialization/ASTWriter.cpp:5814
#30 0x0000557f323d4421 in clang::ASTStmtWriter::VisitConceptSpecializationExpr (this=0x7fb3760183f8, E=0x7fb33ae871a0) at /tools/build-llvmorg-16.0.0-rc4/source/clang/lib/Serialization/ASTWriterStmt.cpp:442
#31 0x0000557f323df69e in clang::StmtVisitorBase<std::add_pointer, clang::ASTStmtWriter, void>::Visit (this=0x7fb3760183f8, S=0x7fb33ae871a0) at tools/clang/include/clang/AST/StmtNodes.inc:1077
#32 0x0000557f323de51b in clang::ASTWriter::WriteSubStmt (this=0x7fb338095520, S=0x7fb33ae871a0) at /tools/build-llvmorg-16.0.0-rc4/source/clang/lib/Serialization/ASTWriterStmt.cpp:2756
#33 0x0000557f323dfd1b in clang::ASTRecordWriter::FlushStmts (this=0x7fb3760188b8) at /tools/build-llvmorg-16.0.0-rc4/source/clang/lib/Serialization/ASTWriterStmt.cpp:2771
#34 0x0000557f32368d43 in clang::ASTRecordWriter::Emit (this=0x7fb3760188b8, Code=112, Abbrev=0) at /tools/build-llvmorg-16.0.0-rc4/source/clang/include/clang/Serialization/ASTRecordWriter.h:96
#35 0x0000557f323ce966 in clang::ASTDeclWriter::Emit (this=0x7fb3760188a8, D=0x7fb33ae87090) at /tools/build-llvmorg-16.0.0-rc4/source/clang/lib/Serialization/ASTWriterDecl.cpp:53
#36 0x0000557f323ce6ac in clang::ASTWriter::WriteDecl (this=0x7fb338095520, Context=..., D=0x7fb33ae87090) at /tools/build-llvmorg-16.0.0-rc4/source/clang/lib/Serialization/ASTWriterDecl.cpp:2471
```

Creation Backtrace:
```cpp
#0 clang::ConceptSpecializationExpr::ConceptSpecializationExpr (this=0x7feea2e86920, C=..., NamedConcept=0x7fee31395a38, SpecDecl=0x7feea2e868e0, Satisfaction=0x0, Dependent=true, ContainsUnexpandedParameterPack=false)
    at /tools/build-llvmorg-16.0.0-rc4/source/clang/lib/AST/ExprConcepts.cpp:88
#1 0x000055f2719ba0df in clang::ConceptSpecializationExpr::Create (C=..., NamedConcept=0x7fee31395a38, SpecDecl=0x7feea2e868e0, Satisfaction=0x0, Dependent=true, ContainsUnexpandedParameterPack=false)
    at /tools/build-llvmorg-16.0.0-rc4/source/clang/lib/AST/ExprConcepts.cpp:103
#2 0x000055f2716ebc86 in canonicalizeImmediatelyDeclaredConstraint (C=..., IDC=0x7feea2e863f0, ConstrainedType=...) at /tools/build-llvmorg-16.0.0-rc4/source/clang/lib/AST/ASTContext.cpp:767
#3 0x000055f2716eb0e1 in clang::ASTContext::getCanonicalTemplateTemplateParmDecl (this=0x7feea007e200, TTP=0x7feea2e86530) at /tools/build-llvmorg-16.0.0-rc4/source/clang/lib/AST/ASTContext.cpp:808
#4 0x000055f27171561a in clang::ASTContext::getCanonicalTemplateName (this=0x7feea007e200, Name=...) at /tools/build-llvmorg-16.0.0-rc4/source/clang/lib/AST/ASTContext.cpp:6227
#5 0x000055f271714310 in clang::ASTContext::getCanonicalTemplateArgument (this=0x7feea007e200, Arg=...) at /tools/build-llvmorg-16.0.0-rc4/source/clang/lib/AST/ASTContext.cpp:6750
#6 0x000055f271715840 in getCanonicalTemplateArguments (C=..., Args=..., AnyNonCanonArgs=@0x7feed0a2a78f: true) at /tools/build-llvmorg-16.0.0-rc4/source/clang/lib/AST/ASTContext.cpp:3020
#7 0x000055f2717153f9 in clang::ASTContext::getCanonicalTemplateSpecializationType (this=0x7feea007e200, Template=..., Args=...) at /tools/build-llvmorg-16.0.0-rc4/source/clang/lib/AST/ASTContext.cpp:5001
#8 0x000055f2717150fb in clang::ASTContext::getTemplateSpecializationType (this=0x7feea007e200, Template=..., Args=..., Underlying=...) at /tools/build-llvmorg-16.0.0-rc4/source/clang/lib/AST/ASTContext.cpp:4970
#9 0x000055f27191cfb3 in clang::ClassTemplateDecl::getInjectedClassNameSpecialization (this=0x7feea2e86678) at /tools/build-llvmorg-16.0.0-rc4/source/clang/lib/AST/DeclTemplate.cpp:631
#10 0x000055f272c6ef71 in clang::Sema::CheckClassTemplate (this=0x7feea00f5a70, S=0x7feea027e1c0, TagSpec=26, TUK=clang::Sema::TUK_Definition, KWLoc=..., SS=..., Name=0x7fee313ec9c0, NameLoc=..., Attr=..., TemplateParams=0x7feea2e86588, 
    AS=clang::AS_none, ModulePrivateLoc=..., FriendLoc=..., NumOuterTemplateParamLists=0, OuterTemplateParamLists=0x7feed0a2fdd8, SkipBody=0x7feed0a2d2c8) at /tools/build-llvmorg-16.0.0-rc4/source/clang/lib/Sema/SemaTemplate.cpp:2106
#11 0x000055f2723c050a in clang::Sema::ActOnTag (this=0x7feea00f5a70, S=0x7feea027e1c0, TagSpec=26, TUK=clang::Sema::TUK_Definition, KWLoc=..., SS=..., Name=0x7fee313ec9c0, NameLoc=..., Attrs=..., AS=clang::AS_none, ModulePrivateLoc=..., 
    TemplateParameterLists=..., OwnedDecl=@0x7feed0a2d59b: false, IsDependent=@0x7feed0a2d59c: false, ScopedEnumKWLoc=..., ScopedEnumUsesClassTag=false, UnderlyingType=..., IsTypeSpecifier=false, IsTemplateParamOrArg=false, 
 OOK=clang::Sema::OOK_Outside, SkipBody=0x7feed0a2d2c8) at /tools/build-llvmorg-16.0.0-rc4/source/clang/lib/Sema/SemaDecl.cpp:16658
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzkWV1v2zjW_jXMDVGDIq0PX-TCsesXQedtirW7cxlQ5JHMrURpSSqJ59cvKMmWpTiebtvMYrFFAYsieXie53wy4taqXAPcovAOhesb3rh9ZW4PYJ95YRp7k1bycHuPeYn3yjmlc8yxMNzusdJYFFznEj_vQWOlJbx08wU3OWBRSUi5BURji2uxn-Fl5sBgCWmT50rniK6w23cLcQp-b82NBYllY_yonWzP4nUN3FjsKpwCdntlEVsiskZkiSLS_Rd13b3RvARbcwE4Uy8gH0WlHVcajO13xHfdg4OyLrgDjNhKFNxavHWV4TnsDjUg9rFbJSotoHb43m68uHuP845bkP1ijNgaG_hnowxYRBNRaetGkmiEOaKrThz-N_5NhKQ_JKTTxzrpKWNLq_6AR4cVoosJHX7xbDY7vl0j1k9MiO6Guz1gbi0YpyqNucMoIsvt7nejHJiZNwZbhkkwRxHBynrvwQYKxdPiMMN-s-CNhYllUURycLveLkuT26X1Eh1oRBOvckSwAdcY7R1EN0Uxwx9feKn00WEkZEorr5T3L-WGE_bcta6DBdd471_rznX9Nqplx5RphKsMrp7AFBWXOKuMV2vVecG2BqF4of7g_oSPL7XxGrVnguxZaKMC0U2hUkQ3y-0O0Y1f2YuwPTkx66lxRuU5GJBe4ee9EnvMi2d-sLj2BFvMW6C1M60y1wma4XvtwID1sVocvMgxP_BSG7DWG01p_H_rO79kLLMpQTvbyevZtrjSgJ940cDs3CnuEY1L3GjbGMAq6_g9cacsVlpUxoBwmGt5VACEa_lr0Z_MwvuT_VsNT2CwrlwLHVemE956yN-VVe6qPZTFVpV1ccClsrZPWpWWrVvwYobPIazaDHPHxTdnuIAriQVRRheYvBBCSBjGGaMsoSlZnFJhF2HL7e5vICoju1joX0q53O6mJP-mrLvXWYURTbqstiYvcZayOCJBMifEG-e4b2lyv75dQ7xpvLvRjauqwiK6SRtVyA9F8VRWJv8QRDMyIx-MmCO6sVVjBCC6GbvmFszAXeeqr8P3iJyRMXI5n9PgNfKtK9057uvGuoybZUnrt6e3jEMSB_x9QXvNe-DzOR1wBxPcWbSACW6_tQVaGV8ZEFud0i2X8rGulI9Jj-lNsugKP1VK-qoz8HaVnu1b9By5OeJWWhSNPGeiy0n-9M-VBDtTWiC2DEgcD7DpBDaEQfra3Oembp-3TerlvtKcJWQRhpRc1fzdDUvjMBogsqll5SWIr2N5UzR276XaywZK0uSvAxQHA6D5GFCUyDn7HkAfy7d8rYWywqtKAmLrIKBtQkpTA09-4c_BfO2YFyCfazvbI7ZcnFkwHAMWsIii14DXIIrvhMtbuOuxg5LF-zqo1--YctkALpqCi7j4jgj00q6G36rSDl58HfHd3n8ULp2f3HfcXR5LM3R9wndWZ3LOzdsdwvXpCXcAnEISLXruBtY-8xJkL-W0lgVsEXLWJegahMc6FpRAlwO5UzbjoiWnr-grvIYatATtBTrTwNFcXGn7VcNLzbUE-YUbXoID84WLb4itM174a9ZiaON_1nZvNq1JciJ7qIsZjYNFyonMJu75Zybw5gXP9_86rQEZ4p6OeI0gFUmX07iutBKeR7gvS5CKOygOngpuWsqsM1xpNyH0fr0aU8WyYxroNoDs7rvdhp8P_A7lcrvrE83xvhOddRdTjAQu9JKnROXHObjVkYFjG338_cJNeSHtAXBCYqBdG73bfRnzELJfkufegJuQIVTmI7hxEEYB_wG4PjSuQvQL3t2OEaWDIcMJsjkLyA8gO96HrqJbmvz9wcUhOYGLpmZL5i24awjsJPr8Ff1spA-fK91u7ifQnHRIJeGUx0mG2BJ3OerdQDJCB5DxFCTLLlxo_9SC4xzvE8r1YOy3XSbq3ZCHhAztcjJFTrIL7f8U-bsAXuGvWoIpDkq_v4_PF_Fg_sW4igciS6dXhlXBrT3q31Xenot7_Q8QDmS7wiefMSmXO6ko_iW3ow6cV-eo2jGE2WDigJzDoyKCLJ4Wmi2UvAe6B_FthPaSSbOQx6NrrH9LYwhEZ2ieexYQW9OoHX_9hNj64nm7r58e16M_V376_bdKDE6x3Y77ovN-CMRCnJL-aNfSOTOMzmokLyemCJO2oxoanOV2rOty-6gr3fZL_1_JpoAvRj1xNz5vYxRoOXr1uSkfGgdmdPhvyjrb3RpX-Mr0KR1mUnYd3zdV31XyMJqUVPyiW3bJ-5-JI9GADFfNYNTuUiZISKY1fLDsUrgHveP5f63_nNesH_GJwaVGNvbd9dHO_cqHZw2y7-dHxVCGi9QXw74NX-F7e97HT9eK0dqtqGqQH3VTTik5TXy1YLtg5_nQ7Z9n4vO22B_vx22Gy5S_ca_PNBuhfDBdq3Ka79l4eHjTlA8Pnx4fGmeVhL_S48-u4kEUhcnkbn0jb5lcsAW_gdsgihdkQcIwudnfJpJARDiZxzIL2CKDhZRJJFgWcz6fy-BG3VJCGWFBTP1DMotYEGU8YpwLEsRRguYESq6Kmdd8Vpn8RlnbwG0UzJPopuApFLb9KEmphmfcTiJKUbi-Mbd-z4e0yS2ak8K70yDFKVe0XzMFoneI3lGCwrUf9heuftR-uOyefSEJ13g1-agpG8CuOvvElXFVtF85NL70h_KbxhS3e-fq9tMk3SC6yZXbN-lMVKXnvng6_nyoTeULJ6KbFpc3Y4v7XwEAAP__BkIRvg">