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

    <tr>
        <th>Summary</th>
        <td>
            Clang crashes on incorrect code with -std=c++17
        </td>
    </tr>

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

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

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

<pre>
    Reproducer:
```
// test.cpp content
namespace a {
template <b> class c {
  d() {
    a::c.

// Command to compile:
clang -cc1 -std=c++17 test.cpp
```
Without assertions it seems to be crashing due to an infinite recursion in `clang::Parser::isCXXDeclarationSpecifier`. With assertions I see the following Stack dump:
```
clang: ../llvm/clang/lib/Parse/ParseTentative.cpp:1569: clang::Parser::TPResult clang::Parser::isCXXDeclarationSpecifier(clang::Parser::TPResult, bool*): Assertion `Tok.isNot(tok::annot_cxxscope) || NextToken().isNot(tok::identifier)' 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: ../llvm/debug/bin/clang -cc1 -std=c++17 small.cpp
1.      small.cpp:4:5: at annotation token
2.      small.cpp:1:1: parsing namespace 'a'
3.      small.cpp:2:14: parsing struct/union/class body 'a::c'
4.      small.cpp:3:7: parsing function body 'a::c::d'
5.      small.cpp:3:7: in compound statement ('{}')
 #0 0x00000000042d0413 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) ../llvm/llvm/lib/Support/Unix/Signals.inc:569:22
 #1 0x00000000042d04ca PrintStackTraceSignalHandler(void*) ../llvm/llvm/lib/Support/Unix/Signals.inc:636:1
 #2 0x00000000042ce46a llvm::sys::RunSignalHandlers() ../llvm/llvm/lib/Support/Signals.cpp:103:20
 #3 0x00000000042cfe47 SignalHandler(int) ../llvm/llvm/lib/Support/Unix/Signals.inc:407:1
 #4 0x00007f3f35c7db20 __restore_rt sigaction.c:0:0
 #5 0x00007f3f3475e37f raise (/lib64/libc.so.6+0x3737f)
 #6 0x00007f3f34748db5 abort (/lib64/libc.so.6+0x21db5)
 #7 0x00007f3f34748c89 _nl_load_domain.cold.0 loadmsgcat.c:0:0
 #8 0x00007f3f34756a76 .annobin___GI___assert_fail.end assert.c:0:0
 #9 0x0000000007a674a8 clang::Parser::isCXXDeclarationSpecifier(clang::Parser::TPResult, bool*) ../llvm/clang/lib/Parse/ParseTentative.cpp:1570:
43
#10 0x0000000007a66c4a clang::Parser::isCXXDeclarationSpecifier(clang::Parser::TPResult, bool*) ../llvm/clang/lib/Parse/ParseTentative.cpp:1322:
37
#11 0x0000000007a64c22 clang::Parser::isCXXSimpleDeclaration(bool) ../llvm/clang/lib/Parse/ParseTentative.cpp:114:43
#12 0x0000000007a64bf5 clang::Parser::isCXXDeclarationStatement() ../llvm/clang/lib/Parse/ParseTentative.cpp:64:62
#13 0x0000000007a574f6 clang::Parser::isDeclarationStatement() ../llvm/clang/include/clang/Parse/Parser.h:2418:40
#14 0x0000000007a4c9d1 clang::Parser::ParseStatementOrDeclarationAfterAttributes(llvm::SmallVector<clang::Stmt*, 32u>&, clang::Parser::ParsedStmtContext, clang::SourceLocat
ion*, clang::ParsedAttributes&, clang::ParsedAttributes&) ../llvm/clang/lib/Parse/ParseStmt.cpp:236:78
#15 0x0000000007a4c24d clang::Parser::ParseStatementOrDeclaration(llvm::SmallVector<clang::Stmt*, 32u>&, clang::Parser::ParsedStmtContext, clang::SourceLocation*) /iusers/m
podchis/source/syclos/llvm/clang/lib/Parse/ParseStmt.cpp:115:60
#16 0x0000000007a5051a clang::Parser::ParseCompoundStatementBody(bool) ../llvm/clang/lib/Parse/ParseStmt.cpp:1157:56
#17 0x0000000007a553dd clang::Parser::ParseFunctionStatementBody(clang::Decl*, clang::Parser::ParseScope&) ../llvm/clang/lib/Parse/ParseStmt.cpp
:2428:48
#18 0x000000000797e624 clang::Parser::ParseLexedMethodDef(clang::Parser::LexedMethod&) ../llvm/clang/lib/Parse/ParseCXXInlineMethods.cpp:598:19
#19 0x000000000797d191 clang::Parser::LexedMethod::ParseLexedMethodDefs() ../llvm/clang/lib/Parse/ParseCXXInlineMethods.cpp:275:1
#20 0x000000000797e0bf clang::Parser::ParseLexedMethodDefs(clang::Parser::ParsingClass&) ../llvm/clang/lib/Parse/ParseCXXInlineMethods.cpp:527:3
#21 0x00000000079baedf clang::Parser::ParseCXXMemberSpecification(clang::SourceLocation, clang::SourceLocation, clang::ParsedAttributes&, unsigned int, clang::Decl*) /iuser
s/mpodchis/source/syclos/llvm/clang/lib/Parse/ParseDeclCXX.cpp:3541:21
#22 0x00000000079b4e68 clang::Parser::ParseClassSpecifier(clang::tok::TokenKind, clang::SourceLocation, clang::DeclSpec&, clang::Parser::ParsedTemplateInfo const&, clang::A
ccessSpecifier, bool, clang::Parser::DeclSpecContext, clang::ParsedAttributes&) ../llvm/clang/lib/Parse/ParseDeclCXX.cpp:2018:34
#23 0x0000000007994ccc clang::Parser::ParseDeclarationSpecifiers(clang::DeclSpec&, clang::Parser::ParsedTemplateInfo const&, clang::AccessSpecifier, clang::Parser::DeclSpec
Context, clang::Parser::LateParsedAttrList*) ../llvm/clang/lib/Parse/ParseDecl.cpp:4145:26
#24 0x0000000007a5d4ce clang::Parser::ParseSingleDeclarationAfterTemplate(clang::DeclaratorContext, clang::Parser::ParsedTemplateInfo const&, clang::ParsingDeclRAIIObject&,
 clang::SourceLocation&, clang::ParsedAttributes&, clang::AccessSpecifier) ../llvm/clang/lib/Parse/ParseTemplate.cpp:229:13
#25 0x0000000007a5d0a9 clang::Parser::ParseTemplateDeclarationOrSpecialization(clang::DeclaratorContext, clang::SourceLocation&, clang::ParsedAttributes&, clang::AccessSpec
ifier) ../llvm/clang/lib/Parse/ParseTemplate.cpp:170:45
#26 0x0000000007a5cbe3 clang::Parser::ParseDeclarationStartingWithTemplate(clang::DeclaratorContext, clang::SourceLocation&, clang::ParsedAttributes&, clang::AccessSpecifier) ../llvm/clang/lib/Parse/ParseTemplate.cpp:47:50
#27 0x000000000798bd7a clang::Parser::ParseDeclaration(clang::DeclaratorContext, clang::SourceLocation&, clang::ParsedAttributes&, clang::ParsedAttributes&, clang::SourceLo
cation*) ../llvm/clang/lib/Parse/ParseDecl.cpp:1778:45
#28 0x000000000796c61b clang::Parser::ParseExternalDeclaration(clang::ParsedAttributes&, clang::ParsingDeclSpec*) ../llvm/clang/lib/Parse/Parser
.cpp:947:49
#29 0x00000000079ae1ae clang::Parser::ParseInnerNamespace(llvm::SmallVector<clang::Parser::InnerNamespaceInfo, 4u> const&, unsigned int, clang::SourceLocation&, clang::Pars
edAttributes&, clang::BalancedDelimiterTracker&) ../llvm/clang/lib/Parse/ParseDeclCXX.cpp:256:41
#30 0x00000000079adfbd clang::Parser::ParseNamespace(clang::DeclaratorContext, clang::SourceLocation&, clang::SourceLocation) ../llvm/clang/lib/
Parse/ParseDeclCXX.cpp:239:22
#31 0x000000000798bf46 clang::Parser::ParseDeclaration(clang::DeclaratorContext, clang::SourceLocation&, clang::ParsedAttributes&, clang::ParsedAttributes&, clang::SourceLo
cation*) ../llvm/clang/lib/Parse/ParseDecl.cpp:1793:43
#32 0x000000000796c61b clang::Parser::ParseExternalDeclaration(clang::ParsedAttributes&, clang::ParsingDeclSpec*) ../llvm/clang/lib/Parse/Parser
.cpp:947:49
#33 0x000000000796ba6b clang::Parser::ParseTopLevelDecl(clang::OpaquePtr<clang::DeclGroupRef>&, clang::Sema::ModuleImportState&) ../llvm/clang/l
ib/Parse/Parser.cpp:737:42
#34 0x000000000796b1f9 clang::Parser::ParseFirstTopLevelDecl(clang::OpaquePtr<clang::DeclGroupRef>&, clang::Sema::ModuleImportState&) ../llvm/cl
ang/lib/Parse/Parser.cpp:591:43
#35 0x00000000079669d3 clang::ParseAST(clang::Sema&, bool, bool) ../llvm/clang/lib/Parse/ParseAST.cpp:161:47
#36 0x00000000052a6c73 clang::ASTFrontendAction::ExecuteAction() ../llvm/clang/lib/Frontend/FrontendAction.cpp:1144:11
#37 0x00000000052a659f clang::FrontendAction::Execute() ../llvm/clang/lib/Frontend/FrontendAction.cpp:1041:38
#38 0x00000000051e3538 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) ../llvm/clang/lib/Frontend/CompilerInstance.cpp:1038:42
#39 0x000000000543b624 clang::ExecuteCompilerInvocation(clang::CompilerInstance*) ../llvm/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp:2
66:38
#40 0x000000000279352d cc1_main(llvm::ArrayRef<char const*>, char const*, void*) ../llvm/clang/tools/driver/cc1_main.cpp:250:40
#41 0x0000000002786b2f ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&) ../llvm/clang/tools/driver/driver.cpp:317:20
#42 0x00000000027871af clang_main(int, char**) ../llvm/clang/tools/driver/driver.cpp:388:26
#43 0x00000000027aef7c main ../llvm/debug/tools/clang/tools/driver/clang-driver.cpp:11:63
#44 0x00007f3f3474a493 __libc_start_main (/lib64/libc.so.6+0x23493)
#45 0x000000000278549e _start (../llvm/debug/bin/clang+0x278549e)
Aborted (core dumped)
```

Godbolt link for convenience: https://godbolt.org/

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzlWltzozoS_jXOi2pcIASYhzw4zmQ2tXOrSXb3vLmEJBJ2MHgR5GTm12-3BOYSQ-Jkds-p3ZRtiEDdX1_U3brEhfxx_k3ty0LWQpULb71wLhfOehE4zcf-S6_gQyqlq6XY74ko8krllX2Y853Sey4U4WQRXtjGSu32Ga8UWXibeOG9JyLjWhPRvUGIXNDVgkb9JkI4YvDWYtlw7vPfFLsdzyWpCkCw26eZOgAG8vkdeSeES97pSi68S7GgF_BxwwPso6L9I63ui7oigE6VVVrkmqQV0UrtNPKJFREl1_cpUJe1wiaekzRP0jwF6Uol6lJDL2giQNPAsBJ85aW2GvXWqd789tulgqclRx43eyXSJIXHgbMkCKHP_xrZk-pekaTIsuJ35H1TcfEdEOz2UzZqWZPlEnSVZQ87uNhG-DeN4ddAaq-3YEAA86CMary16wcRdp8Q4fbrN6XrrJp6Pi0iXT1DckE3JC6KbEHB0AbDulUG6vS2-L5M9ecC3ltVxXfbl-d5UW3F46MWxV5ZL9rAh3xWjxX0ULl1rqc9UwmCN8iiBQ1JwsGRZONvXz--X9-8J7qOd-AGnMT1HRh5X5QVmv6-qvYayRh_vAO71fESXLFTOF7ewXD6pxLA9SrVulYafRf9Ns1FVktrWuNVJAarViWMHdTBvsSBKBQIL4ku6tI2Y0_wjkKkMJ4kKeucaFGm-6qBfMQ1wKnM39eyuCv5jvDyrt6B2HrsH1KBgHCN07z1lolBpHc8y7pR5DYcumZvzeDrIwcOmkP7GEcAvaE1TC96pJfbfMkeXANdvYsnYB0OX9vXO9KXYl_W76yrsjaar3PgbWWCuBNDnLPkbHQ5UGVHqHrwDftEkzoXRpQnZMxFHqj5c9QgQmDUKmqwpwbdKLQIMW4aYggML_EGfNLGwgX1HOI8Ou0fo9JhrkeM5Qxf_UM3g6pM88q4wa31pVX3Usl_3xagFcXB3gH6E7yL46XvBu3FRImbeo_-Dnd_y9NHbEjvcp7pJbgvWtiECUo7mO4TmIKTESZL4y_gy5kJCQ9FKu14fzWQwAuM6xxw0CEOoVjAj6nrW50P4OgmD70ASIugcV0HjUudDoI3gpAoFpKx7G80AHPCodysYRomXuL5IpQxdch2W0LaK0q1hdCl0ztuPHiJBBzzPXT3-91Z6CsvTEjJU62scyKqgNmrWOpiCV504Tx6Ibw3cNdgSIitZOwTHmPsnCNEXXhvQCgcExKriGzzbJsVXG5lseMpSFJkcukQbNrpO8GrY7KtRrIFPAzIEoMTRLztdvvhGn5s6t1iHlgqG2zh_2Pkor55Qx6EjK_-4wnx9Qk9dA4ZgXltJeW5zkiKQDD-55XCo_QghRd2UrgjKZigdFaKmxRKUtWTBUSw-F4PziSfvm7pGFWc-C_WbZsUjsSjE0AFiCmgHSZviMkPWRJMYzoRUFPT9FoG4MrlPYZI5q5M5OpAsSEoJiLpToEy9wcwX8oexHVSqXJdVWUa1xVWWr3Ud4NZ-O9QiBVAZ9OjfVPtKuOVG-LRGmYnTWacYy-x0wbnPY_V6N0bU6p9LCAGWfmMb62PUZR9qEd5jt94sRsgvrYsMpkxXHXa9sfapky-Qtt_tHpbxUK1D55Xa5O7r3ZWzn0hxX2KDW3tfKV_iKzQp6rPdbGKDXrOGoxGkOO7kxHT3G-aQu-gxguoHE-PN0NQoam-OlThCJXvyXmjXjV17BhVrw8ae8J3B-5hZ12v8k-LH4MCNUGh56argURRqALKZnF8VI9KflIwhZeXKpnOSb33TkMNEfo6z9Jc2c5t5edHCN2NOujRCLp0o8l41kczJcuxovR0nDT0u1oRS2RnrGEnTk7QsJ5W8Vc7WdrgfOvX6Jiiw3e5lQ4zfhRzJeexA-FPahersqla2giymokus6HnJQG9zqHazpW086xBj8Pg6uKXlc5EsbfFL6QN8raTTp_hnJr2LE9H2mMqmKxdrfbQkhP13mE1xSy1_DXN5SmaQ6xI-CV54bZZSLzOE1z1y3X1tFe7BohLJz3Abfk5yaHFcTzvvC0dD-1BHVMAeayzx7AqiyImhJhVxbEqXD-N3r9UsU9V-owqrXwzCm1DIHDuFPwx1dVp0wTk1y47uQyDHO0yIx0Vl75kQs3nM4hcg7mBqStbFT1VMr5VlM-L-XJVN-ETiX9bX19_ie0KIr7WzD9nRteLKsl5y54w3bDCtJ5tVmzdXpj2x8p3eDSrn5ZiT_1fbMjmWfrzSMx-zgK_Uj1NRf82JblmJg5uelDSuKIUsfJePPorXlbgK7hv8DoX_RP5DzNVbVdr02FVG61iGc7X2sP5yX9VC8-_0fJoMlR_CnN6pHPDcDXyo1HFHIjAjWe19f4RAlvOs0mtvUzqJlTZZHOKOE3F00gUGfOzro6mozqaK5fPh-7rPFfl53bP4GUz1D6RYX8M0Sguq82mZS9Wz9R1L3EkK-G8Yi843AsFhXaW7lJMQCUX33F0vaHy8AOTIw8a9kZTAC6TeH7a2FfuLxxe4-dzAjabczNiev1dCRTTHceRhE2uev3fxZEINy5665Ye_R-LI96ovA5iHswLdFvsP6oHldlJWl-SL3v-r1p9rUZBBF_8UBb1_ptKji5y3agdt3efClln6nqH2zpm8WVuRDcVx1OJG1lDz8jac3U2ltVN5iuuq7TU1R8vsJVg2sSHxRZ35K3-SOAgkk-rp_XN7Wiqj_As6HZieOJ6HJBsh1Dg2uLlgGlQ0fmUByIcYIK-V6U5NyPXZhXONr9_VAKGR9P03JpPS6F3u2429toNCWYuHa5wjMuPBqsmM6DeDscxyxBet8TnDQoW31We7w2WITb2YE95DZkXk-FxLU3jfy5V9iCPWXW7uqvRABsUJT7z4tG6ZAOvI_hQHFtreiLbcxGvBXtr3PRqks3hOIRBHARDnbNBxqcQ_H0KGV-4W9xIHVRM67LkP8zw3oh7XrYF0NoMdxjrgzZomNjGb6WoADcuX8kyfcAy5qpleihOzLyoq_6ZO4S6CmKakFbujWsVcbzEg2iTHcU96RFP4Nmbdg3NxThLe-DoCFzo8mYotZpsa0PAYNTycs0MWa_QA3srGswbsuYqCQVBpkeP87TUp-2AD94NeLo4UoMuyLLBsQIWMs4ij2y3uHm_1TgFNULPb-170OewtY9E_ZEKfRYpYskhpWfOJlmitteB7BpPGEBdjmOtKJU5CaVkx3V0lNH8fihkXGQVydL8O0kK4zAPKk-VjTjjg1727WVR3h1q0TN17gaB6_koxZk892TkRfysSqtMnW8QrD3ipTQxpwMBWgluCoykIr_jib_xEauzuszOX3_CzA9h9Jzdn_N4xVUYJpETJYHrcCp8xZQThEm4imSYnGU8Vpk-X_gXC__yLD2nDqXOijKXua67WkrH8ThnK5_7jhs7csEcyJtptkTGqIKz8txgAOtoeJilutLdQ67NNEm19Hld3Rfl-dXPnO9-5kV-ZgCfG7T_BqMH2rY">