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

    <tr>
        <th>Summary</th>
        <td>
            Clang ICE for template friend in templated class with constrained parameter that declares a lambda or class method
        </td>
    </tr>

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

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

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

<pre>
    The following examples trigger an assertion failure on trunk (since clang 16). They compile fine on clang 15. The assertion failure for both examples is the same.

The first uses a class method:
```c++
template<typename T> concept C = true;

struct A {
    template<C T> void f();
};

template<typename X>
class B {
    template<C T> friend void A::f();
};
```

https://godbolt.org/z/sq7fe9ed1

The second uses a lambda call operator:
```c++
template<typename T> concept C = true;

auto L = []<C T>{};

template<typename X>
class B {
 template<C T> friend void decltype(L)::operator()();
};
```
https://godbolt.org/z/h4YYTYnqE

The stack trace for the first is below, though both hit the same assertion.
```
clang++: /root/llvm-project/clang/lib/Sema/SemaTemplate.cpp:1753: clang::QualType {anonymous}::ConstraintRefersToContainingTemplateChecker::TransformTemplateTypeParmType(clang::TypeLocBuilder&, clang::TemplateTypeParmTypeLoc, bool): Assertion `TL.getDecl()->getDepth() <= TemplateDepth && "Nothing should reference a value below the actual template depth, " "depth is likely wrong"' 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>
1.      <source>:9:37: current parser token ';'
2.      <source>:8:1: parsing struct/union/class body 'B'
 #0 0x000000000379f808 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x379f808)
 #1 0x000000000379d4ec llvm::sys::CleanupOnSignal(unsigned long) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x379d4ec)
 #2 0x00000000036e5fe8 CrashRecoverySignalHandler(int) CrashRecoveryContext.cpp:0:0
 #3 0x00007f320ec42520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520)
 #4 0x00007f320ec969fc pthread_kill (/lib/x86_64-linux-gnu/libc.so.6+0x969fc)
 #5 0x00007f320ec42476 gsignal (/lib/x86_64-linux-gnu/libc.so.6+0x42476)
 #6 0x00007f320ec287f3 abort (/lib/x86_64-linux-gnu/libc.so.6+0x287f3)
 #7 0x00007f320ec2871b (/lib/x86_64-linux-gnu/libc.so.6+0x2871b)
 #8 0x00007f320ec39e96 (/lib/x86_64-linux-gnu/libc.so.6+0x39e96)
 #9 0x0000000006902243 (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x6902243)
#10 0x000000000690357b (anonymous namespace)::ConstraintRefersToContainingTemplateChecker::TransformTemplateTypeParmType(clang::TypeLocBuilder&, clang::TemplateTypeParmTypeLoc, bool) (.constprop.0) SemaTemplate.cpp:0:0
#11 0x000000000696ca67 clang::TreeTransform<(anonymous namespace)::ConstraintRefersToContainingTemplateChecker>::TransformType(clang::TypeLocBuilder&, clang::TypeLoc) SemaTemplate.cpp:0:0
#12 0x000000000696dca2 clang::TreeTransform<(anonymous namespace)::ConstraintRefersToContainingTemplateChecker>::TransformType(clang::TypeSourceInfo*) SemaTemplate.cpp:0:0
#13 0x0000000006970647 clang::TreeTransform<(anonymous namespace)::ConstraintRefersToContainingTemplateChecker>::TransformTemplateArgument(clang::TemplateArgumentLoc const&, clang::TemplateArgumentLoc&, bool) SemaTemplate.cpp:0:0
#14 0x0000000006971575 bool clang::TreeTransform<(anonymous namespace)::ConstraintRefersToContainingTemplateChecker>::TransformTemplateArguments<clang::TemplateArgumentLoc const*>(clang::TemplateArgumentLoc const*, clang::TemplateArgumentLoc const*, clang::TemplateArgumentListInfo&, bool) (.constprop.0) SemaTemplate.cpp:0:0
#15 0x00000000069716fe clang::TreeTransform<(anonymous namespace)::ConstraintRefersToContainingTemplateChecker>::TransformConceptSpecializationExpr(clang::ConceptSpecializationExpr*) SemaTemplate.cpp:0:0
#16 0x000000000696b4ee clang::Sema::ConstraintExpressionDependsOnEnclosingTemplate(clang::FunctionDecl const*, unsigned int, clang::Expr const*) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x696b4ee)
#17 0x000000000620c5ba clang::Sema::FriendConstraintsDependOnEnclosingTemplate(clang::FunctionDecl const*) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x620c5ba)
#18 0x00000000062dddb5 clang::Sema::ActOnFunctionDeclarator(clang::Scope*, clang::Declarator&, clang::DeclContext*, clang::TypeSourceInfo*, clang::LookupResult&, llvm::MutableArrayRef<clang::TemplateParameterList*>, bool&) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x62dddb5)
#19 0x000000000637c072 clang::Sema::ActOnFriendFunctionDecl(clang::Scope*, clang::Declarator&, llvm::MutableArrayRef<clang::TemplateParameterList*>) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x637c072)
#20 0x0000000005fbe129 clang::Parser::ParseCXXClassMemberDeclaration(clang::AccessSpecifier, clang::ParsedAttributes&, clang::Parser::ParsedTemplateInfo const&, clang::ParsingDeclRAIIObject*) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x5fbe129)
#21 0x00000000060607dd clang::Parser::ParseSingleDeclarationAfterTemplate(clang::DeclaratorContext, clang::Parser::ParsedTemplateInfo const&, clang::ParsingDeclRAIIObject&, clang::SourceLocation&, clang::ParsedAttributes&, clang::AccessSpecifier) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x60607dd)
#22 0x00000000060662d8 clang::Parser::ParseTemplateDeclarationOrSpecialization(clang::DeclaratorContext, clang::SourceLocation&, clang::ParsedAttributes&, clang::AccessSpecifier) (.part.0) ParseTemplate.cpp:0:0
#23 0x0000000005fbd2cc clang::Parser::ParseCXXClassMemberDeclaration(clang::AccessSpecifier, clang::ParsedAttributes&, clang::Parser::ParsedTemplateInfo const&, clang::ParsingDeclRAIIObject*) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x5fbd2cc)
#24 0x0000000005fbf425 clang::Parser::ParseCXXClassMemberDeclarationWithPragmas(clang::AccessSpecifier&, clang::ParsedAttributes&, clang::TypeSpecifierType, clang::Decl*) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x5fbf425)
#25 0x0000000005fc0d66 clang::Parser::ParseCXXMemberSpecification(clang::SourceLocation, clang::SourceLocation, clang::ParsedAttributes&, unsigned int, clang::Decl*) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x5fc0d66)
#26 0x0000000005fc2ec6 clang::Parser::ParseClassSpecifier(clang::tok::TokenKind, clang::SourceLocation, clang::DeclSpec&, clang::Parser::ParsedTemplateInfo const&, clang::AccessSpecifier, bool, clang::Parser::DeclSpecContext, clang::ParsedAttributes&) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x5fc2ec6)
#27 0x0000000005f9c398 clang::Parser::ParseDeclarationSpecifiers(clang::DeclSpec&, clang::Parser::ParsedTemplateInfo const&, clang::AccessSpecifier, clang::Parser::DeclSpecContext, clang::Parser::LateParsedAttrList*, clang::ImplicitTypenameContext) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x5f9c398)
#28 0x000000000605ff12 clang::Parser::ParseSingleDeclarationAfterTemplate(clang::DeclaratorContext, clang::Parser::ParsedTemplateInfo const&, clang::ParsingDeclRAIIObject&, clang::SourceLocation&, clang::ParsedAttributes&, clang::AccessSpecifier) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x605ff12)
#29 0x00000000060662d8 clang::Parser::ParseTemplateDeclarationOrSpecialization(clang::DeclaratorContext, clang::SourceLocation&, clang::ParsedAttributes&, clang::AccessSpecifier) (.part.0) ParseTemplate.cpp:0:0
#30 0x0000000006066593 clang::Parser::ParseDeclarationStartingWithTemplate(clang::DeclaratorContext, clang::SourceLocation&, clang::ParsedAttributes&, clang::AccessSpecifier) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x6066593)
#31 0x0000000005fa3069 clang::Parser::ParseDeclaration(clang::DeclaratorContext, clang::SourceLocation&, clang::ParsedAttributes&, clang::ParsedAttributes&, clang::SourceLocation*) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x5fa3069)
#32 0x0000000005f6b28e clang::Parser::ParseExternalDeclaration(clang::ParsedAttributes&, clang::ParsedAttributes&, clang::ParsingDeclSpec*) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x5f6b28e)
#33 0x0000000005f6c10d clang::Parser::ParseTopLevelDecl(clang::OpaquePtr<clang::DeclGroupRef>&, clang::Sema::ModuleImportState&) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x5f6c10d)
#34 0x0000000005f5f0fa clang::ParseAST(clang::Sema&, bool, bool) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x5f5f0fa)
#35 0x0000000004020918 clang::CodeGenAction::ExecuteAction() (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x4020918)
#36 0x000000000428cf29 clang::FrontendAction::Execute() (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x428cf29)
#37 0x000000000420b1ce clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x420b1ce)
#38 0x000000000436bcbe clang::ExecuteCompilerInvocation(clang::CompilerInstance*) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x436bcbe)
#39 0x0000000000c01fa6 cc1_main(llvm::ArrayRef<char const*>, char const*, void*) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0xc01fa6)
#40 0x0000000000bf983a ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&, llvm::ToolContext const&) driver.cpp:0:0
#41 0x0000000004061949 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
#42 0x00000000036e6494 llvm::CrashRecoveryContext::RunSafely(llvm::function_ref<void ()>) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x36e6494)
#43 0x0000000004061f3f 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
#44 0x000000000402a1a5 clang::driver::Compilation::ExecuteCommand(clang::driver::Command const&, clang::driver::Command const*&, bool) const (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x402a1a5)
#45 0x000000000402ac0d 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+++0x402ac0d)
#46 0x0000000004032b25 clang::driver::Driver::ExecuteCompilation(clang::driver::Compilation&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x4032b25)
#47 0x0000000000bff41c clang_main(int, char**, llvm::ToolContext const&) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0xbff41c)
#48 0x0000000000af8621 main (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0xaf8621)
#49 0x00007f320ec29d90 (/lib/x86_64-linux-gnu/libc.so.6+0x29d90)
#50 0x00007f320ec29e40 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x29e40)
#51 0x0000000000bf931e _start (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0xbf931e)
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsW19346iS_zTKC8c-EpIl6yEPbie527OZ7WwnZ3fmKQehks0GgQZQd3I__R6QbAvZcZK-9vw5d-Z0TycCiqpf_aooECJas5UAuAxmn4LZ1QVpzVqqSyIMESvg8qKQ5cvlwxpQJTmX35lYIXgmdcNBI6PYagUKEYGI1qAMkwJVhPFWAZICGdWKJxTguWaCAqKciBWK0gDnU_SwhhdEZd0wDqhiwg3oe8xc8wGZlVSokGa9U4FpZNaANKlhGoRXQbjo_u80Zkob1GrQiFjRWqMazFqWQdz3CtKw-0MD_Mn-cU8N1A0nBoJ4aV4aEKQG9BDE14hKQaExaImC-MpaB0H8aTirNqqlBi1QkPXPEUJoIG_ZCfomWYmqAM8DnO9EZFcjcYcU-SWIr7vWzqJPb81VKQai7KZcWMvjxdGZN5AMFVkb02g7Ft8E-GYly0JyM5VqFeCbfwb4Rv-WVZBDGY1doIFKUW58wEldlARRwjmSDShipDqbL0hrJLp1rR23t5BYwP5lrI8DXQLlVkyA57cOaQv71uQO_Xf74C3018mvvz78Kn673kPfEPqEjCK0Cx2zDQqmUQFcfg_wEpm1bFfrLq7WzGzjaRd_04NquWDtfRUvUIBvlJQmwDecf6snjZL_B9T-2ve74awI8M091KT_56GHcEqbJogXUTaLraCuv0Psv1vCH14asLgTIcVLLVvtkLKtSym0UYQJ8xUqUPpBLqUwhAkmVhvZyzXQJ1DdgAdFhK6kqjetVvYdUfVD56rBzPbJraSfWsZLUAFOLVLD9gMSbiW1vQopeedztNhmsCANH26nKzBXQHnn-kkQX7sHjVl3T1AQLy1fN8JdE3KTpyjA-L-kWdsErNey5SVS1mqwmZWgb4S30PnUOZBQ0xK-ZSkqu1mWVoz96363NODsCfgL-q6kdRIOcOayLZS90-9urxf310i3Rc0MIqhoV0hBI5VBRqIRNZlZt8WUyrpnwT4ZmNYt6ADfICJKxATlbQlOY6qIXqOC0CdHWKtro6BRkoLWUCItW9U9tiOJ1pIyYqBEqhVIU8Ua06t872hftnWzTS7hNAjzOyVXitSIqFVbgzC6p61sHE27tUhN4LnhUlmnd9SdbONAT9yKFuCbgokds20EoMmq_E5UNUnQZIUm0solTWOlt6ZpzVSjSW2xQJPJ8zydEF1P9Isw5DmIr5gwwNHkHk0mK0onRkpO14SJIL46qp7trAVp9FoaNKmo5FJNSkZWQmrDqEaTSsiJA9Z_rE0ZxFd9osWh5V0P7ybhRRYw73G8sJSOMxeirVIgDGqI0qCQkU8gUIAzm8Fw1knAByTMbZhbAXagY7JbMAN80wome0i1RrbosPJ20lCA4xCFz-HmvzjLq3k4R45mLiT1i-5-uFNMGEeCh45J810nRb4_Sm0UkLoPaiaMCz0bgSehQoA_hc-9ejYPbPWPRvqXCdBD-i85ENE2X8Q9Wwlis0UrXJVWIu6i9BzaWmU8bbGnbQqzCuZoabn0Faj8BuqlU-8_iCi5nXTeI-n1sRkZnk2f4kP3dztF3E-RVTEOgSZ4ZrnoTOsWi-d5-pgmE85E-zxZibZroFMtp6lT3A3x1E58mXmaVxQ1Zq2AlI9PjPOPTeDGexPMxkonWYpW2mHxUeWTLPVkp75sPM-qGJHCJtsPSXYDPcnZnuSo-LDMqPBkzn2ZcQ55-jGZbognMx-yLs1DjJP41GzvxW7ntaEZjuaNZ5nDZ1t1IFsR6sblk_yvUH9Y7afUqtgo2UxtlKADVdcgJC0OkY9DSkmaefMqgK0Ztlw5IUTXY5Q-jsoGhfeYikemlpTgP5ep927p_CwqGeDF-4yKfaOyME3-OP_1HRZ9vTUycNR6KylydH2d7IOufacN198GJhkBE82ymRv-Z0FHB_HyffAsrLD3Yrl4G8t3d2XadGRM_-U8Mxu7I63gj_LEsjtKuG-AMsLZP4ldRK6fG-WDfKTbO4MzHWWcIgHPaLc3HtljJwCtmRRX0IAo9RdxLSiXemCZr-dNK6hx_Sn3XLutIl2h5rnazjLoe_ICszfWW3IzDw0c0llBDqNx405WdpjoDoofReL01nXKe9bNfevKsixmh61bUPNFDFUlm1OiYXcq7QoxDtFh93HWtG19-X0gtveXF6_9VsqntvkKuuWbhLzbqfzcGlJwWChFXr5CdThx3RFFajCgbNrYJK1N1kjP4gUHsucFv5yMMxpm-JgXHNGGvvgxL5wCqtPj05k_xAd7Ze-sKiDC-dCyO7fBH_y8_OWXpd2i_wx1AWpjuNu7D4FaUApau1RZMavsck9quTBGsaI1oPe5uzdvucHK0vW1OuGuO1WwWn1dfP78pegOnc4R8j1WHph-7RymYVaWR426Z2LFYQDiojKgDueyHce2MX0-xMbdukxxK2nv6oPuOurQPUKcnt4d4J5H8MgjKS7nR0HbnbxuffJF-Sv-x9xyLuSmDVGmK7Y8xQ8WHjgehXmJKf07zN8X5hYrj1TJCMwqwbMfA_N_mVnfKbKqiX4D14_Txi3wGwHd9nJvzTobZhYSD7OZjxkNyzR9C7MOrt4GeoB949g6Gnjvge9IgXxOuBwaHlzpCC4M9A24LL8GfBnCZORTTwn5BOI_mSg_ApU13Ao-VfAeSBldSfiq7I0GR9a9sSvP4STrA89Jme-knMb58cVlEPlb-_X-cnJmtH8c5b7nbVex9qhvSla__-e64Ywy89C_St9KPYNnHPCeZ_y9Vzirqgj_XYj9foWYA9zzSP53IWZx8F9hWhxmefzunGGIMkysbNXwY9T8a7DHgTJkj__idFaROEyP71JfLVjPj9DbPcZznKeocCB5KGIfxbTAcziK4vWzASUIfxXNU6AxSHzdwnceOJy1HhyjPVFKo_D4bv1BNrfwDfj-sdCXhvzWwp1R_vGO7fgPJdvGHfxcH2DC9vTpZ1m2HD7XjVTm3rjAPk8Z48z0cBhtZ2ZVWJE9HBb3D6Pa213jSofl2-B9wGl1dip5OnvbiSTEYR55y8lSlvAPEAt3jLc54QbaGugf9detTqtpr4inqVfJJ3hOK_-A7UbZPCTKA6qeSclOB0_JzFcyLCIKPpzdtJ-FNkRQOIzo61adhcu9np4hXuGXxGlBC_BfcziVd_Z8k4c2lnv2niUp9fp5Bnh1UkjDqCIpojR6rImVMbjINDxRXhPlvxtcIv8ZXrprqeexo9NyaEbilTlhUeXzmKAN-MvowWWKgTH3NeH8f4AaqezO4aBNo4N1K6Nfwwc1dY5Kxb6BOlh9JZGfNtIoT_Luvu5ObtUf_j8qh61r3VzV7V8cUsJ5QejTYyX8hN_N3XNoGS1lXRNRjoP6oA_djbyFuyRsZycWgwE-RjGx6peRzsHbAY-P9Pk5irpfCqIZfdSue4-i19k-eDSKsO51s20eiSOc25iQatBuuyx2Kd6RqMPcDQlw1t3sDnC2gwrPN5fVfpLFYX-Mr5ilSZ4MXHHoIlnX8rUV96QC_uLBedx1Z7g112nsMT8eU6yKK_TvTJHRHulVLiSjJZ1EZPYqcM53ZG_F3KDpJfPRQNvhtU34ka6L0aWHrW0nLiCs2R6hxqUOoX6Z-h5cfpKFfh2Un2Rxy7TxQDmWmrc8aAizFNg_LD2KY0-W3wdN6he7iV-OhTEu8Kssuxr87BUOByqG17zwO6J5hnLWwePhl40W9iqJ-hdJmwplo79LK4s-Kby9bJ9Y904zT3WvNgxJNU9xhKzSp567E-3NnY9u3-Zl_sGLzm7IUOYsHMuEJESPj3bYozZEmceBce-eBRJ_lmhcycURoE7-6X1mhe9m33xtdFFexmUe5-QCLqMsxLPY7rMu1pdJVtIcSgJRMovLmIZASB5BlMdVFZMqvmCXOMRxhKMknIUxzqdhWNEwJxklRVJQmgZJCDVhfGoJOpVqdeG-T7nMZglOLzgpgGv3ZSTGvbY4mF1dqEv3VUvRrnSQhJxpo3cSDDMcLpe2O_q8vO4-vNp8htN_I8bE9lHZf5n4nZl1FxGKMAElajaXQpBZE-O-KCNq-BmdVN5HjRet4pc__j2OM_n_AwAA__8muBQP">