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

    <tr>
        <th>Summary</th>
        <td>
            [clang] Crash on unexpanded pack in concept-constrained NTTP
        </td>
    </tr>

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

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

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

<pre>
    ### Reproducer

```c++
template <typename...Ts> struct index_by;

template <typename T, typename Indices>
concept InitFunc = true;

// with constrained non-type template parameter
// clang crashes
// gcc is still fine
template <typename Indices, InitFunc<Indices> auto init>
struct LazyLitMatrix;

template <
 typename...Indices,
    InitFunc<index_by<Indices>> auto init /* This parameter pack should be expanded */
>
struct LazyLitMatrix<index_by<Indices...>, init> {
};

LazyLitMatrix<
 index_by<int, char>,
    42
> inst;
```

When using the same for a type argument, clang correctly errors out with `type constraint contains unexpanded parameter pack 'Indices'`. After fixing that, even the original case with NTTP compiles correctly. See on compiler explorer: https://godbolt.org/z/4PocYYqWx

### Stack trace

```
Stack dump:
0.      Program arguments: /opt/compiler-explorer/clang-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>
1.      <source>:22:7: current parser token ';'
 #0 0x00000000036b0788 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x36b0788)
 #1 0x00000000036ae8d4 llvm::sys::CleanupOnSignal(unsigned long) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x36ae8d4)
 #2 0x00000000035f6e88 CrashRecoverySignalHandler(int) CrashRecoveryContext.cpp:0:0
 #3 0x00007fdd8e442520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520)
 #4 0x0000000006fcbc61 clang::StmtVisitorBase<llvm::make_const_ptr, (anonymous namespace)::IntExprEvaluator, bool>::Visit(clang::Stmt const*) ExprConstant.cpp:0:0
 #5 0x0000000006fba9de Evaluate(clang::APValue&, (anonymous namespace)::EvalInfo&, clang::Expr const*) ExprConstant.cpp:0:0
 #6 0x0000000006fd75c6 EvaluateInPlace(clang::APValue&, (anonymous namespace)::EvalInfo&, (anonymous namespace)::LValue const&, clang::Expr const*, bool) (.constprop.0) ExprConstant.cpp:0:0
 #7 0x0000000006fe590a clang::Expr::EvaluateAsConstantExpr(clang::Expr::EvalResult&, clang::ASTContext const&, clang::Expr::ConstantExprKind) const (/opt/compiler-explorer/clang-trunk/bin/clang+++0x6fe590a)
 #8 0x00000000060b4c3e clang::ActionResult<clang::Expr*, true> calculateConstraintSatisfaction<calculateConstraintSatisfaction(clang::Sema&, clang::NamedDecl const*, clang::SourceLocation, clang::MultiLevelTemplateArgumentList const&, clang::Expr const*, clang::ConstraintSatisfaction&)::'lambda'(clang::Expr const*)>(clang::Sema&, clang::Expr const*, clang::ConstraintSatisfaction&, calculateConstraintSatisfaction(clang::Sema&, clang::NamedDecl const*, clang::SourceLocation, clang::MultiLevelTemplateArgumentList const&, clang::Expr const*, clang::ConstraintSatisfaction&)::'lambda'(clang::Expr const*)&&) SemaConcept.cpp:0:0
 #9 0x00000000060b5548 CheckConstraintSatisfaction(clang::Sema&, clang::NamedDecl const*, llvm::ArrayRef<clang::Expr const*>, llvm::SmallVectorImpl<clang::Expr*>&, clang::MultiLevelTemplateArgumentList const&, clang::SourceRange, clang::ConstraintSatisfaction&) SemaConcept.cpp:0:0
#10 0x00000000060b5ae8 clang::Sema::CheckConstraintSatisfaction(clang::NamedDecl const*, llvm::ArrayRef<clang::Expr const*>, llvm::SmallVectorImpl<clang::Expr*>&, clang::MultiLevelTemplateArgumentList const&, clang::SourceRange, clang::ConstraintSatisfaction&) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x60b5ae8)
#11 0x00000000068f8894 _Z31FinishTemplateArgumentDeductionIN5clang38ClassTemplatePartialSpecializationDeclEENSt9enable_ifIXsr23IsPartialSpecializationIT_E5valueENS0_23TemplateDeductionResultEE4typeERNS0_4SemaEPS4_bN4llvm8ArrayRefINS0_16TemplateArgumentEEERNSC_15SmallVectorImplINS0_23DeducedTemplateArgumentEEERNS0_4sema21TemplateDeductionInfoE SemaTemplateDeduction.cpp:0:0
#12 0x00000000068f8cff _ZN4llvm12function_refIFvvEE11callback_fnIZ23DeduceTemplateArgumentsIN5clang38ClassTemplatePartialSpecializationDeclEENSt9enable_ifIXsr23IsPartialSpecializationIT_E5valueENS5_23TemplateDeductionResultEE4typeERNS5_4SemaEPS9_NS_8ArrayRefINS5_16TemplateArgumentEEERNS5_4sema21TemplateDeductionInfoEEUlvE_EEvl SemaTemplateDeduction.cpp:0:0
#13 0x0000000005f43f71 clang::Sema::runWithSufficientStackSpace(clang::SourceLocation, llvm::function_ref<void ()>) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x5f43f71)
#14 0x000000000690202e _Z23DeduceTemplateArgumentsIN5clang38ClassTemplatePartialSpecializationDeclEENSt9enable_ifIXsr23IsPartialSpecializationIT_E5valueENS0_23TemplateDeductionResultEE4typeERNS0_4SemaEPS4_N4llvm8ArrayRefINS0_16TemplateArgumentEEERNS0_4sema21TemplateDeductionInfoE SemaTemplateDeduction.cpp:0:0
#15 0x0000000006949012 getPatternForClassTemplateSpecialization(clang::Sema&, clang::SourceLocation, clang::ClassTemplateSpecializationDecl*, clang::TemplateSpecializationKind) (.isra.0) SemaTemplateInstantiate.cpp:0:0
#16 0x0000000006986f69 clang::Sema::InstantiateClassTemplateSpecialization(clang::SourceLocation, clang::ClassTemplateSpecializationDecl*, clang::TemplateSpecializationKind, bool) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x6986f69)
#17 0x0000000006a0842f void llvm::function_ref<void ()>::callback_fn<clang::Sema::RequireCompleteTypeImpl(clang::SourceLocation, clang::QualType, clang::Sema::CompleteTypeKind, clang::Sema::TypeDiagnoser*)::'lambda'()>(long) SemaType.cpp:0:0
#18 0x0000000005f43f71 clang::Sema::runWithSufficientStackSpace(clang::SourceLocation, llvm::function_ref<void ()>) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x5f43f71)
#19 0x0000000006a0d7f5 clang::Sema::RequireCompleteTypeImpl(clang::SourceLocation, clang::QualType, clang::Sema::CompleteTypeKind, clang::Sema::TypeDiagnoser*) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x6a0d7f5)
#20 0x0000000006a0d875 clang::Sema::RequireCompleteType(clang::SourceLocation, clang::QualType, clang::Sema::CompleteTypeKind, clang::Sema::TypeDiagnoser&) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x6a0d875)
#21 0x0000000006a0d950 clang::Sema::RequireCompleteType(clang::SourceLocation, clang::QualType, clang::Sema::CompleteTypeKind, unsigned int) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x6a0d950)
#22 0x0000000006168a91 clang::Sema::ActOnUninitializedDecl(clang::Decl*) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x6168a91)
#23 0x0000000005e0e9dc clang::Parser::ParseDeclarationAfterDeclaratorAndAttributes(clang::Declarator&, clang::Parser::ParsedTemplateInfo const&, clang::Parser::ForRangeInit*) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x5e0e9dc)
#24 0x0000000005e25f48 clang::Parser::ParseDeclGroup(clang::ParsingDeclSpec&, clang::DeclaratorContext, clang::ParsedAttributes&, clang::Parser::ParsedTemplateInfo&, clang::SourceLocation*, clang::Parser::ForRangeInit*) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x5e25f48)
#25 0x0000000005dda64d clang::Parser::ParseDeclOrFunctionDefInternal(clang::ParsedAttributes&, clang::ParsedAttributes&, clang::ParsingDeclSpec&, clang::AccessSpecifier) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x5dda64d)
#26 0x0000000005ddb223 clang::Parser::ParseDeclarationOrFunctionDefinition(clang::ParsedAttributes&, clang::ParsedAttributes&, clang::ParsingDeclSpec*, clang::AccessSpecifier) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x5ddb223)
#27 0x0000000005de38d2 clang::Parser::ParseExternalDeclaration(clang::ParsedAttributes&, clang::ParsedAttributes&, clang::ParsingDeclSpec*) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x5de38d2)
#28 0x0000000005de5447 clang::Parser::ParseTopLevelDecl(clang::OpaquePtr<clang::DeclGroupRef>&, clang::Sema::ModuleImportState&) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x5de5447)
#29 0x0000000005dd443a clang::ParseAST(clang::Sema&, bool, bool) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x5dd443a)
#30 0x0000000003f18955 clang::CodeGenAction::ExecuteAction() (/opt/compiler-explorer/clang-trunk/bin/clang+++0x3f18955)
#31 0x00000000041af831 clang::FrontendAction::Execute() (/opt/compiler-explorer/clang-trunk/bin/clang+++0x41af831)
#32 0x000000000413506b clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x413506b)
#33 0x0000000004292e13 clang::ExecuteCompilerInvocation(clang::CompilerInstance*) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x4292e13)
#34 0x0000000000c50e2c cc1_main(llvm::ArrayRef<char const*>, char const*, void*) (/opt/compiler-explorer/clang-trunk/bin/clang+++0xc50e2c)
#35 0x0000000000c4addd ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&, llvm::ToolContext const&) driver.cpp:0:0
#36 0x0000000003f61839 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
#37 0x00000000035f72b3 llvm::CrashRecoveryContext::RunSafely(llvm::function_ref<void ()>) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x35f72b3)
#38 0x0000000003f61a59 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
#39 0x0000000003f27fa7 clang::driver::Compilation::ExecuteCommand(clang::driver::Command const&, clang::driver::Command const*&, bool) const (/opt/compiler-explorer/clang-trunk/bin/clang+++0x3f27fa7)
#40 0x0000000003f2895d clang::driver::Compilation::ExecuteJobs(clang::driver::JobList const&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&, bool) const (/opt/compiler-explorer/clang-trunk/bin/clang+++0x3f2895d)
#41 0x0000000003f3277c clang::driver::Driver::ExecuteCompilation(clang::driver::Compilation&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x3f3277c)
#42 0x0000000000c4e291 clang_main(int, char**, llvm::ToolContext const&) (/opt/compiler-explorer/clang-trunk/bin/clang+++0xc4e291)
#43 0x0000000000b31424 main (/opt/compiler-explorer/clang-trunk/bin/clang+++0xb31424)
#44 0x00007fdd8e429d90 (/lib/x86_64-linux-gnu/libc.so.6+0x29d90)
#45 0x00007fdd8e429e40 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x29e40)
#46 0x0000000000c4a93e _start (/opt/compiler-explorer/clang-trunk/bin/clang+++0xc4a93e)
clang++: error: clang frontend command failed with exit code 139 (use -v to see invocation)
Compiler returned: 139
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzkW92S4jiyfhrXjQLCln-wL-qCpmAPc3qq6zTszNm5IWRZBm0ZySPJNdQ8_YYkA5b5qaodpqMjuoPuBlvK_PLLTCkly0hKumaE3HvxJy9-uEON2nBxv_03ESgnz3c5L17vPRjaD_hKasGLBhPh-Q-eP27_TXz7wR78pD_mqiLbukKKAC-cqNeaMLQlw-FwKb1wCqQSDVaAsoLsVvmrF37qCjzXFSw9OAGHX3NWUEy0LNsFc4ZJrcCcUTVrGAZe-ACUaEhPtAdnHpyBP6jaAMyZVAJRRgrAOBto4eCgu0YCbYk6mGo74gqxNcACyQ2Rzp01xoBKIBWtKlBSRq7YskcPJwfAXjg52gRQozigjKqDgS1jn9Gfr5-p-hkpQXdXaLNXQIf4o872HgBd5UdXdHA4UIAxdAyWGyqP7IAa4WcgN7ypCpATQHY1YgUpgAcNMxbfdSvOKB8Oh7oTnOxZAN5ob-zooWd4X1xrYEcqZUrLwhskrNgjBxE8YASUSXWUvQ_rrqpfN4SBRlK2BmpDgNTeLLkAyFANkFg3W9Iqs6HChSBYVa-ACMGFBLxRNvy8xDd9DmGo9FeFKJOgYQcee0x7cHTw5MhL_CEYl_pmSXcWFDLKyQthBiEXdE0ZqgBGkljFj8vlE8B8W9OKyCPAIVgQAjjb3xLalxUXRHjhGGyUqqUXttG-5kXOKzXkYu3B2Z8enEVPHP_rX7__unOzbT9yLJQGrwTC5OzQYX_aVkWzrbUmc8kfen72JPhaoO2BXg1EhyOvlQdne7yDA144M-QPlGjYswdnOWX7a3aIAoN18QcS5SACgzUYcC0M1bUW2ai6UUMJBtuqetmCwWCXJgMktwP5yhTaeeEDZYpUYLAAg8Ea44HivMIbRJkXPlzFpBtLhmq54QoMSswrLgYFRWvGpaJYgkHJ-MCMLe5lqQovfGhHV-jr_Ja8EZgc8irQLDmXwzGEXjgeaaZwIwRhSoeSJAIo_kyYDiQd6nDUpoIHQx_4O3__J0xyf5SmQLOgvRGO5au0X54EZcr4amkcCtNjI4H-WHGpBEFbDyY2gZUHM-DB9K94zIOf_F2LyYPZEXTggkYkLaJzoCcVQaypv7AFXTNUeTBtmJn8ClBxreVWEA0CByJ0IMZlQtIUTLSfvxLMX4h4tZj-B7Gi0prSljOnzYQzRXZqiGudHb75e1ARtipGZVGkJIpgrOPE2FPR3IOzXZqskmhQUdbsBmvW2Bt4KPkwMcBNFwd21IWdlDjHSWBHNcvoQm3VL1RSxcUnJIkXTo60b9EzWZmRbVUrocPAgylinL1ueSOBnpNkbWInsx3mTE13tZi-oKpBipsuOeeVjWUvHBtNHkx7AOzwaSabDGgJE_0bsQs8xa5NOcoKAlqlxJU-fvoFVQ1po_gN-FrEnJW8bd0RozF9EGTigixGMU4OIOfsqbJJdyOsb7T-bCTvLXjDutZnNpeG5noteD3032f4yDWcxJmP-tqONmg2xnIv0dxzSHFbfyWyqc5YMF4s28y6ZmM7hnR0_S9lhbbKdLrJ0NEa7ORg6jDi5xEOiYMeK8pZa1s46aO2PrF18BRgVOFGV4iTQ8mxQIrKEhkpuv8bLdz0I1t0ytYj2pLigeDKCYtuNzNHfeYYWZHOzZ-bStHP5IVUy7aaHbdz_mcqr3rokrpLliSHCPfgqELbvEB6MjyJoG7umtrxbQr-SziTNx30o9Ove-mOQNs-sUu-8yNJ1subOI5SMNkQ_Hxrao9z3lgI9PqVlKd5eOxg1zTHPostqqpfCFZczLd1dT6Fdac-mP_OU9b5XxFbkw_46Trdugbz-3QjkoI-oVbPe33w47J9k7nE-uAwl2gnOZVykpZpmkVg9VsYzCijctO37IEUjYE1f4yN-DCdVEjKfbsnJBRF1aImmKKK_mnGE-2w6fRxoTLCUF6RFS3n_y8FDOfybPv5cjWN9VxOpo8LfwXDvfSDdju3TaeRXixPv-pWkQ6n6dMiWuWPkfZuug-Gub4dJH1TplPdcbIK4l4EzK1So4wU57v5q0iSLYLBCTRdRE1NcpzcOp8msO8BXJZg9Zs1IoBlw0znlSDlfPbyMp0GAUZVlSP8vCrZ_Lc90j5Q-c1cFL_LRfHBRdnqcbHquie-6J74Os_Tf1Yv09V0-lJ9hPGwy3hcRmE5Cs4PTKJhv1K1WTRlSTEl7QJ3UZ_U2qcT6HGA6XrQCycvnBY2nW3pcJvcbs1wcttdq2U-9CEBq-8gYD6e0x9J6RvmprsyzKLMDyBYE_WElCKCzbhwmHJNfk_5cLXwuiJb039aV51vu1-U6NUXlQLZhVeXhbldwVCkyHke3MVnliZlkp3PmI6o91PzzUhwlqJ_fT61RDg5565WkZ9GsAQm5d87IJgmnRHeLUiOTH8lvzdUkAnf1hVRZPlaE1O_vJ_a_2tQpbv1Y_JYl3Vk7wk821A3eLC7k0Tsl0Vn6vjDcmm_u2ai8LW-EHbpDzJQZ72gKUZlfN7O79zpt0krS0CXIej3GUpH72foe2DndkW8Nd5hJ-izk8X-d8POYUf9hnv-rY0OCW4dHSQpyi4MFmOsvrB_MsqoMhOEXVK6PBzmlhsBtngcwG4ZSnySFbgL-Mk8mel815iQMI4xz_f2v7kYs2KslKB5o4g8NcQ2Oq0-TjQUx4qg5JdWsN1eMy7MUnbOqLohXS0bDl2RSxeMyyh9k65_CN7ULiH6HmVrfVeXCKf2HRlr94DP2e_w_TFe364C-yXNN2HcEOow7lS_cVGgJCreZPyLmLXT6AMp50yXyag69cA7CHyzxVUvjjEmUpoisKSahhvxZGlweEp6POUQhu9NZIcuMyL1q-O_ha1-hP19bGkyHLZGLlskTAt4la3pzgZRh7Vvw9CtODAmOhykPQ7iKBpd5WDJa7PTeDpRfanR7w15UsJdJxwGP7Mbemb38jgd_syLptJlJBe6bFbkhtVKa5tjfNZLlygK0Ynx48Xy4vrZruFuu5ZrcXSB9o4-lEGaxbG7YVuQfxA2bh-U2f1ightFxvu965udILDaHXhO1RcFqExDp-CZCT19seIMvhsiaxU7yKCLLIz9JHeJs7rsZgEm57m7bMrt4rMF56B36rIIZpAEoftky-A8GvFymLjTa0bebkhpQTmonfLIx7FPIAYYB6st0jLS8w9JNujkyYh7DU7M7sUNwVtoDvbYxR6hoijAnuZJsDR5nl59ZHNiSOKu7bWM00f6GSgEfSHi7PaDe-QiLJMgDbNb7uVY3W20TIIJ324RK_qJetZx5vSXvsZrrR1VzkGbhRKUrduR33r10GG1wrtdENgfOZIUr6Rp3rLoNNYXVkogquT-dk8cqiod_Vx07usmnXMf48OJiPftCf3E8_P-GPWOTI1gHnZcce5gVLvqbdgClaR6dej8Jts9LUwn3NN-XKHY2U394eLCbE3XSCi7NX0xADKXODgq0egiccZh6GTq27PpjNW9jrrBpdXvlaZjpz655Smg1tZuFEW96gSmWVx8lIyfeC4vM_ETz0-eZF8bhA_OrxEVnQPW7ySvjZC_j0LNkEOhe0y0DOFohC_Bfeh8dyqAM1P_Jeq_IYW3KjsNJw5psDdZE7jfZ9uXGt2D9Topxu-bim9SXBg4Dl6nnPPzMIhgBDTSmyi08hyFkXvsFmZF9sFjt6aLIzPuyySRD1Yr3W0lFRJq1bHo3VpI5GpJ-nVYFhJg5d_IO1riQWX3dji270KYo-n6Oijbmh_gNspLRCtS2NcVyI7q4CkICEITOY0kYPACFAeSEEA7NXmrbF-OA0FUIxjReaY79945uCvuwyILM3RH7oNREMIkiLLobnOfBwHyYxTHZZKHiZ8jmOAoS2FeRmUQo9EdvYc-jPwoSPwsToNoWMRRGmE_zKKk8HW5E_lki2g11Kkw5GJ9R6VsyH2apklyV6GcVNK8cwVhywz04oc7ca_bD_JmLb3Ir6hU8ihBUVWZF7Vsj_jBHg8HnLmvi-BnQBloX4gadF9yelwun-4aUd33XuagatPkQ8y3Om507tr_BrXg_yZYR4FBLz04Mwb8JwAA__8audfF">