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

    <tr>
        <th>Summary</th>
        <td>
            `requires requires` on friend function leads to Assertion `detail::isPresent(Val) && "dyn_cast on a non-existent value"'
        </td>
    </tr>

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

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

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

<pre>
    The following valid translation unit

```
struct s {
        template<typename T>
                requires requires(T x) { x.g(); }
        friend void f(T);
};
```

causes clang to fail with an assertion:

```
clang++: /root/llvm-project/llvm/include/llvm/Support/Casting.h:660: decltype(auto) llvm::dyn_cast(From*) [with To = clang::TypedefNameDecl; From = clang::Decl]: Assertion `detail::isPresent(Val) && "dyn_cast on a non-existent value"' 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 -S --gcc-toolchain=/opt/compiler-explorer/gcc-snapshot -fcolor-diagnostics -fno-crash-diagnostics -std=c++2b <source>
1.      <source>:4:18: current parser token ';'
2.      <source>:1:1: parsing struct/union/class body 's'
 #0 0x000056330a949ce4 PrintStackTraceSignalHandler(void*) Signals.cpp:0:0
 #1 0x000056330a947a8c llvm::sys::CleanupOnSignal(unsigned long) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x3f6fa8c)
 #2 0x000056330a87ea18 CrashRecoverySignalHandler(int) CrashRecoveryContext.cpp:0:0
 #3 0x00007faef1677420 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x14420)
 #4 0x00007faef114400b raise (/lib/x86_64-linux-gnu/libc.so.6+0x4300b)
 #5 0x00007faef1123859 abort (/lib/x86_64-linux-gnu/libc.so.6+0x22859)
 #6 0x00007faef1123729 (/lib/x86_64-linux-gnu/libc.so.6+0x22729)
 #7 0x00007faef1134fd6 (/lib/x86_64-linux-gnu/libc.so.6+0x33fd6)
 #8 0x000056330d826dc2 (anonymous namespace)::ConstraintRefersToContainingTemplateChecker::TransformDecl(clang::SourceLocation, clang::Decl*) (.isra.0) SemaTemplate.cpp:0:0
 #9 0x000056330d83c329 clang::TreeTransform<(anonymous namespace)::ConstraintRefersToContainingTemplateChecker>::TransformCXXDependentScopeMemberExpr(clang::CXXDependentScopeMemberExpr*) SemaTemplate.cpp:0:0
#10 0x000056330d83da56 clang::TreeTransform<(anonymous namespace)::ConstraintRefersToContainingTemplateChecker>::TransformCallExpr(clang::CallExpr*) SemaTemplate.cpp:0:0
#11 0x000056330d84462d clang::TreeTransform<(anonymous namespace)::ConstraintRefersToContainingTemplateChecker>::TransformRequiresExpr(clang::RequiresExpr*) SemaTemplate.cpp:0:0
#12 0x000056330d824529 clang::Sema::ConstraintExpressionDependsOnEnclosingTemplate(unsigned int, clang::Expr const*) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x6e4c529)
#13 0x000056330d146597 clang::Sema::FriendConstraintsDependOnEnclosingTemplate(clang::FunctionDecl const*) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x676e597)
#14 0x000056330d2143c5 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+++0x683c3c5)
#15 0x000056330d2b261c clang::Sema::ActOnFriendFunctionDecl(clang::Scope*, clang::Declarator&, llvm::MutableArrayRef<clang::TemplateParameterList*>) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x68da61c)
#16 0x000056330cf12f05 clang::Parser::ParseCXXClassMemberDeclaration(clang::AccessSpecifier, clang::ParsedAttributes&, clang::Parser::ParsedTemplateInfo const&, clang::ParsingDeclRAIIObject*) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x653af05)
#17 0x000056330cfaa265 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+++0x65d2265)
#18 0x000056330cfb8206 clang::Parser::ParseTemplateDeclarationOrSpecialization(clang::DeclaratorContext, clang::SourceLocation&, clang::ParsedAttributes&, clang::AccessSpecifier) (.part.0) ParseTemplate.cpp:0:0
#19 0x000056330cf11e2d clang::Parser::ParseCXXClassMemberDeclaration(clang::AccessSpecifier, clang::ParsedAttributes&, clang::Parser::ParsedTemplateInfo const&, clang::ParsingDeclRAIIObject*) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x6539e2d)
#20 0x000056330cf13f85 clang::Parser::ParseCXXClassMemberDeclarationWithPragmas(clang::AccessSpecifier&, clang::ParsedAttributes&, clang::TypeSpecifierType, clang::Decl*) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x653bf85)
#21 0x000056330cf15976 clang::Parser::ParseCXXMemberSpecification(clang::SourceLocation, clang::SourceLocation, clang::ParsedAttributes&, unsigned int, clang::Decl*) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x653d976)
#22 0x000056330cf17be3 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+++0x653fbe3)
#23 0x000056330cef472b clang::Parser::ParseDeclarationSpecifiers(clang::DeclSpec&, clang::Parser::ParsedTemplateInfo const&, clang::AccessSpecifier, clang::Parser::DeclSpecContext, clang::Parser::LateParsedAttrList*) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x651c72b)
#24 0x000056330cebecac clang::Parser::ParseDeclOrFunctionDefInternal(clang::ParsedAttributes&, clang::ParsingDeclSpec&, clang::AccessSpecifier) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x64e6cac)
#25 0x000056330cebf570 clang::Parser::ParseDeclarationOrFunctionDefinition(clang::ParsedAttributes&, clang::ParsingDeclSpec*, clang::AccessSpecifier) (.part.0) Parser.cpp:0:0
#26 0x000056330cec4d2b clang::Parser::ParseExternalDeclaration(clang::ParsedAttributes&, clang::ParsingDeclSpec*) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x64ecd2b)
#27 0x000056330cec5bba clang::Parser::ParseTopLevelDecl(clang::OpaquePtr<clang::DeclGroupRef>&, clang::Sema::ModuleImportState&) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x64edbba)
#28 0x000056330cec5ff4 clang::Parser::ParseFirstTopLevelDecl(clang::OpaquePtr<clang::DeclGroupRef>&, clang::Sema::ModuleImportState&) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x64edff4)
#29 0x000056330ceba03a clang::ParseAST(clang::Sema&, bool, bool) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x64e203a)
#30 0x000056330bc621a8 clang::CodeGenAction::ExecuteAction() (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x528a1a8)
#31 0x000056330b4fbe89 clang::FrontendAction::Execute() (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x4b23e89)
#32 0x000056330b48374e clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x4aab74e)
#33 0x000056330b5e1433 clang::ExecuteCompilerInvocation(clang::CompilerInstance*) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x4c09433)
#34 0x0000563307dfb984 cc1_main(llvm::ArrayRef<char const*>, char const*, void*) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x1423984)
#35 0x0000563307df4a68 ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&) driver.cpp:0:0
#36 0x000056330b2f2a19 void llvm::function_ref<void ()>::callback_fn<clang::driver::CC1Command::Execute(llvm::ArrayRef<llvm::Optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const::'lambda'()>(long) Job.cpp:0:0
#37 0x000056330a87f1ba llvm::CrashRecoveryContext::RunSafely(llvm::function_ref<void ()>) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x3ea71ba)
#38 0x000056330b2f326f clang::driver::CC1Command::Execute(llvm::ArrayRef<llvm::Optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const (.part.0) Job.cpp:0:0
#39 0x000056330b2bdba9 clang::driver::Compilation::ExecuteCommand(clang::driver::Command const&, clang::driver::Command const*&, bool) const (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x48e5ba9)
#40 0x000056330b2be62d 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+++0x48e662d)
#41 0x000056330b2c80cc clang::driver::Driver::ExecuteCompilation(clang::driver::Compilation&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x48f00cc)
#42 0x0000563307df9d63 clang_main(int, char**) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x1421d63)
#43 0x00007faef1125083 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x24083)
#44 0x0000563307df465e _start (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x141c65e)
clang-16: error: clang frontend command failed with exit code 134 (use -v to see invocation)
Compiler returned: 134
```

See it live: https://godbolt.org/z/1W1qn9bcf
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJztWllz2zgS_jXyC0oq3seDHxTZns1uZu2yXDPzpgJBUOKGIhgAdOT59dPNQyIoWXFSVqZqd12yDgJo9Pf1gQaJRKQv108bTjJRFOJrXq7JMy3ylGhJS1VQnYuS1GWuJ9bNxJp374HVvZqfSsuaaaLIJPzQd4s131YwnE_chX6peEm3nDxN3Nt9B3hJ_qXOJVek_zJxoieymzgxiiK72RouwK-J-wEu3OyHZjLnZUqeBeiZ4Zi2T9cOHfffTUXbd0ZrBXOyggJYLUhG84J8zfWG0JJQpbhE0BN3fgZyM3jifMCXOycT504KoeGjKJ6300qK_3DW_4SPvGRFnfLDhWVdVUJijwVVGlifbUBOAOJBWspZgZwBMlprgXQ0w0Ajd56-lCsGY6AR5gRZ84Yu_0OD4EmQiXvTYmv7P4GglGf_Bv5vQC5SiePG3Zo2_wann_cUEICbcg30tH1y9QA24iXO_RstmnmdAF7w4fR6ERhHSSnKKd_lSkNvdKgawDgTJ2zI5umsZfHh0-18eUtUnWxzDaOSeg2ugMSgXTZaVwpndu7gtQZ4dTJjCLlncUR2rlSNPnQHhkxJxznR4NxMUrUhCWWfwa0Z6LIgFUwkBeMANiVK1LK9jCPBBwTLwXdTIuuSKCbzSncqLzUIIWm9rfYOYkFT_CDFWtItoXJdbwG06txCVKgZaF0BbgmcVIWQXOI1JH-69zc1hSgqP0NDkpd9c-thZLpOv1KZTT34RqYC5dKqQum1rmo9U2S6JNPpmrGpFqJgGwoi3Juz02NnVdJKbYQm04wJaJimOV2XAhySgcisFNOGOPOy0inIZq1qTgKOtOjo64PbRkKMy-7cg387QlJYLSV6RUUlQAdDf-bgaU6IQQvvjQTnhAS7-28GYp5q0w5AgfQkOsqUIglkNJSn9tLgl2sRa2fBnx-4rkVjL2bcIw8yL3Vj0Sd0i2W-LmnxD3CBAimKML908dU2qRmr0O5W87-XbY9khzRig4hVL6r9sig4LevqvmylwQx1qeAr-Fkh0NgYT9E7OQ28rJ2bBRkog-lxr61jaBuFnNoRWaCdHzkTz1y-jHnIMeJjs89ClJrv9GlC3G6KMKM8s4Mw9ByLrFaQPDTgWEF4tziLPIH3XRSsAm9a5GW9m67Lum2o9EZyms6UmFkNFtsDKQYSz5gG2i0rIZLmir9BPkPJQSPZc2GgIdk3JTtu5MeEJuJNmg8kOw4MNCQHY8nh3upvlglDDJmhKdP1sjT4PpmuC0MMmdHQS9LICVLmoEwKmf1lK2pFcEVXVZNN486_wSEhv4K7PPKMS_Uk0EvgN0TrU1cOLDacfQavatcmrDEyIbfN6uNEg_Vo2UT-J8GaCgQz83ix6hY-J5rlSlJ0EghTvqX9TKddMzZxucyFYcPlUnK-Vwsy0HtCvh2hXvzxxw2H0iiFdLhkouK_8m3C5e2ukiYZZzvOvw0cc5Q1Ap5SP_jbgNOiOIFyf_WNkGwTkucFTvp3QXrsKthjWGbLG6E5o_DzfNNNUcJYa5wAyhkIl9ZZ1H15CzWQUAP9h2tOk9aNuEIJhKHAQ3S953IUcI_5g-SFSF0Dqe0FfhyeRnrXVP0HvKqFeRrlQALUB0w3rLDioujCgIPyBjrPQOfYnsv80-jmTN-XQ1WppLBajrIiBn-j_VE-7LsHJ9q6xfp4IG4O2kz7sczEcfsnIT7X1SNXdaE70Ye65tda06TgcynpC0QMBNhQcmeKB9BryzWXn_KWd4gckJJAmdoIfH8rYE5nvmEF37RC4gQ2O2eFxtGGtvgxK7wHVRfgJ6UA3-AnGPLDMtvJLMNLH5pSffAdFqQFFtvtOtQDbxbqIVFzhvurZcVZnuWo7OJIajrXWuZJrXHjNvbdo3nTnit01z6WT42CZIBaPc4_frxP2u3hRULedylwZZAZmmRS6gTnyVyCsgUfkDjPwAlO57KDj-1j-nKMjbuNa7KT5jpr0COHuIBFUgcINywSmRZJIscKzpLWczawyb1stKZF_ucJR_-WWS7F3Az2wrotfQ3FTxcV8SjMbW7WS_8P89fDPAauhk7lWCMy3Sz6wZz5e643D5Kut1R9g9fvd5tmge8FPDX3FM_spN6ZswQoMTizR5xBtXQ-EIGzlq4OAzvhfWd3imcbX6HvTIF8UbpSYMOgyxnRFSbcPU8X-tfAX4Y0afG5cwm84favvEy_hyoEjoLfK3hPpIy2JHxVdq_BmXVvbMpLGCkDGxhGMvYvjGde6CRn-RlE_h6_Ol5OLsz2j7Pc9fzUVqwd633JegnObQaUGpx7JucJZ5R9k_N7eajos48AT7b3YL97qeoWndMG-gkVjscDwGsQ4o8IyfzQeqsTGrzkZX6cYX-AlvHe6G3lizxZtzjm9oQzL_1GiN3uWuu-WrH8GKJLmJKlI98OR2D9JKHni1VRfeLPvDjep95X9EvNH7Q095vY8RcpcF-fNXvMozp_vx3-VaR1wT9u8ZHcUje7kYvkVY-nANPgIRrzkGXeWR7ucqn0fwkZgNUgIx7FN7XcY6eYL59GlRGq3gLqF9f28xI6O6DSUGfziVvCAsem0VDnhUj5L7ycs_5pO95_5AzCsbvUPPp_b019J6KgiKGpUZYmHizxkXGz9U7ialimJ1S9jJJe4rigg6GkYyoZuaHHTTrbaT9CBUBLfGh6itHXUV3Elz1KE9DTAGIUTInPbc81qtpO5QOeZ3Gq7D_Ce5EM7TErBv0MAEb1EaZZEkeQmZi92uJjdyc63PYb3u_b0MGt9fYmqHkNLgweOL8zDttzXFDTwOGPcHg0iEjP_sJ-alLFAM1yS4viN9hkCwlJsDgJqnGiVObPr6zlrrGWJ07mUDtuD_IcJsq6emQlG-qa1v4gUPfchYEqeJxjlZVmPm_n7lxkYYOXbClsdUYxe9JEh4v3FU5PC-PiEoqFct0tE60Bm6MQ2LZasd3OttsfCVU5W6mme0eS0RkvrPARBh4SaZtH4gAc-ryQg3bsMj-k8MZJWuqbIRMnLOg2SSmeethzBUi7gwX_FMlpgxj1Bo3CzIZ644D61EP_tuWxLpc048WLwed5213ghAOnoW2WDuaza_AxqCAz8j_tI6Ni-1VniE3mkjSh8avMNcajR0tiT6eRrUcDscNrm9UzXedGNTPA9q4pP-I-wB56lGeNeOGjJ81v4QVIV6-TAq24hzZIOZd6935Q0Rxd4Phe1VkeO2f5KWwGgXnr1DPrLYdFFmOvaX4z-G5UBidKgtes8BPZfP8CJMosoMfgzxkt3HEadBVUX4L0-jdpZX6xksKGiQ3NzINftuNbkUtWKzxsBMkO8k-j4Heed_JAiDHLuADzAp-TVv77g7QZSN9P3w63A_ACwqXE7DvvThJnXT0NbtG6R3vUtT1ZzHc5xnbKiQ31I57CUJxMn_GYq-Kc5IMit5upr2-J5LqWJUcHxcFnDjYvUZImBXgqdh6dnxVpIgo9ExLw3f0J__bv9pcyTlh2xa_tIHBjPwhD_yq9dtPYjemVznXBr2GO42PagYXHfLtj2P2STwpOU4WQLnmC-KqWxfWPHw32Q6jnrzbXnht7tsczz2Pcty3biiM3ikLmcs9NmBtdFTThhbqe-OAITsm_kkYE6uDfXOXXjuU4VowPF8HLvZkfpS5nNLHD0IJ0F0w8CzbfeTFDPZDzK3ndqJTUawWNBQBTh0bwR3zkwJvpQD6t9UbI65Q-56nSouRXzezXjfZ_AfqQzg8">