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

    <tr>
        <th>Summary</th>
        <td>
            [clangd] Language server gets stuck while processing incorrectly called function-like macro
        </td>
    </tr>

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

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

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

<pre>
    After clangd detects invalid macro call, it displays an error and then hangs indefinitely and is unable to recover from this state without restarting.
It gets stuck in some kind of an infinite loop. I think it happens in the `SelectionTester::test()` (3rd call from the top in the stacktrace below) on line 320

Example code where it happens:
```c++
#include <vector>

#define BORKED(X) static const std::vector<int> v = X

int main() { BORKED(std::vector<int>{1, 2}); }
```

It can however recover if type is absent before braced-init:
```c++
#include <vector>

#define BORKED(X) static const std::vector<int> v = X

int main() { BORKED({1, 2}); }
```

**Stack trace:**
```
clangd.exe!clang::clangd::`anonymous namespace'::SelectionTester::getExpansionStart(clang::SourceLocation Loc) Line 525 (g:\Programming\llvm-project\clang-tools-extra\clangd\Selection.cpp:525)
clangd.exe!clang::clangd::`anonymous namespace'::SelectionTester::testChunk(clang::FileID FID, llvm::ArrayRef<clang::syntax::Token> Batch) Line 469 (g:\Programming\llvm-project\clang-tools-extra\clangd\Selection.cpp:469)
[Inline Frame] clangd.exe!clang::clangd::`anonymous-namespace'::SelectionTester::test(llvm::ArrayRef<clang::syntax::Token> ExpandedTokens) Line 332 (g:\Programming\llvm-project\clang-tools-extra\clangd\Selection.cpp:332)
clangd.exe!clang::clangd::`anonymous namespace'::SelectionVisitor::claimRange(clang::SourceRange S, clang::clangd::SelectionTree::Selection & Result) Line 949 (g:\Programming\llvm-project\clang-tools-extra\clangd\Selection.cpp:949)
clangd.exe!clang::clangd::`anonymous namespace'::SelectionVisitor::claimTokensFor(const clang::DynTypedNode & N, clang::clangd::SelectionTree::Selection & Result) Line 940 (g:\Programming\llvm-project\clang-tools-extra\clangd\Selection.cpp:940)
clangd.exe!clang::clangd::`anonymous namespace'::SelectionVisitor::pop() Line 846 (g:\Programming\llvm-project\clang-tools-extra\clangd\Selection.cpp:846)
[Inline Frame] clangd.exe!clang::clangd::`anonymous-namespace'::SelectionVisitor::dataTraverseStmtPost(clang::Stmt *) Line 677 (g:\Programming\llvm-project\clang-tools-extra\clangd\Selection.cpp:677)
clangd.exe!clang::RecursiveASTVisitor<clang::clangd::`anonymous namespace'::SelectionVisitor>::TraverseStmt(clang::Stmt * S, llvm::SmallVectorImpl<llvm::PointerIntPair<clang::Stmt *,1,bool,llvm::PointerLikeTypeTraits<clang::Stmt *>,llvm::PointerIntPairInfo<clang::Stmt *,1,llvm::PointerLikeTypeTraits<clang::Stmt *>>>> * Queue) Line 681 (g:\Programming\llvm-project\clang\include\clang\AST\RecursiveASTVisitor.h:681)
clangd.exe!clang::RecursiveASTVisitor<clang::clangd::`anonymous namespace'::SelectionVisitor>::TraverseVarHelper(clang::VarDecl * D) Line 2278 (g:\Programming\llvm-project\clang\include\clang\AST\RecursiveASTVisitor.h:2278)
clangd.exe!clang::RecursiveASTVisitor<clang::clangd::`anonymous namespace'::SelectionVisitor>::TraverseVarDecl(clang::VarDecl * D) Line 2282 (g:\Programming\llvm-project\clang\include\clang\AST\RecursiveASTVisitor.h:2282)
clangd.exe!clang::RecursiveASTVisitor<clang::clangd::`anonymous namespace'::SelectionVisitor>::TraverseDecl(clang::Decl * D) Line 479 (g:\Programming\llvm-project\build\tools\clang\include\clang\AST\DeclNodes.inc:479)
[Inline Frame] clangd.exe!clang::clangd::`anonymous-namespace'::SelectionVisitor::TraverseDecl::__l2::<lambda_f7aea7691af7a0655700551a684014a9>::operator()() Line 639 (g:\Programming\llvm-project\clang-tools-extra\clangd\Selection.cpp:639)
[Inline Frame] clangd.exe!clang::clangd::`anonymous-namespace'::SelectionVisitor::traverseNode(clang::Decl *) Line 761 (g:\Programming\llvm-project\clang-tools-extra\clangd\Selection.cpp:761)
clangd.exe!clang::clangd::`anonymous namespace'::SelectionVisitor::TraverseDecl(clang::Decl * X) Line 639 (g:\Programming\llvm-project\clang-tools-extra\clangd\Selection.cpp:639)
clangd.exe!clang::RecursiveASTVisitor<clang::clangd::`anonymous namespace'::SelectionVisitor>::TraverseDeclStmt(clang::DeclStmt * S, llvm::SmallVectorImpl<llvm::PointerIntPair<clang::Stmt *,1,bool,llvm::PointerLikeTypeTraits<clang::Stmt *>,llvm::PointerIntPairInfo<clang::Stmt *,1,llvm::PointerLikeTypeTraits<clang::Stmt *>>>> * Queue) Line 2368 (g:\Programming\llvm-project\clang\include\clang\AST\RecursiveASTVisitor.h:2368)
clangd.exe!clang::RecursiveASTVisitor<clang::clangd::`anonymous namespace'::SelectionVisitor>::TraverseStmt(clang::Stmt * S, llvm::SmallVectorImpl<llvm::PointerIntPair<clang::Stmt *,1,bool,llvm::PointerLikeTypeTraits<clang::Stmt *>,llvm::PointerIntPairInfo<clang::Stmt *,1,llvm::PointerLikeTypeTraits<clang::Stmt *>>>> * Queue) Line 687 (g:\Programming\llvm-project\clang\include\clang\AST\RecursiveASTVisitor.h:687)
clangd.exe!clang::RecursiveASTVisitor<clang::clangd::`anonymous namespace'::SelectionVisitor>::TraverseFunctionHelper(clang::FunctionDecl * D) Line 2217 (g:\Programming\llvm-project\clang\include\clang\AST\RecursiveASTVisitor.h:2217)
clangd.exe!clang::RecursiveASTVisitor<clang::clangd::`anonymous namespace'::SelectionVisitor>::TraverseFunctionDecl(clang::FunctionDecl * D) Line 2228 (g:\Programming\llvm-project\clang\include\clang\AST\RecursiveASTVisitor.h:2228)
clangd.exe!clang::RecursiveASTVisitor<clang::clangd::`anonymous namespace'::SelectionVisitor>::TraverseDecl(clang::Decl * D) Line 427 (g:\Programming\llvm-project\build\tools\clang\include\clang\AST\DeclNodes.inc:427)
[Inline Frame] clangd.exe!clang::clangd::`anonymous-namespace'::SelectionVisitor::TraverseDecl::__l2::<lambda_f7aea7691af7a0655700551a684014a9>::operator()() Line 639 (g:\Programming\llvm-project\clang-tools-extra\clangd\Selection.cpp:639)
[Inline Frame] clangd.exe!clang::clangd::`anonymous-namespace'::SelectionVisitor::traverseNode(clang::Decl *) Line 761 (g:\Programming\llvm-project\clang-tools-extra\clangd\Selection.cpp:761)
clangd.exe!clang::clangd::`anonymous namespace'::SelectionVisitor::TraverseDecl(clang::Decl * X) Line 639 (g:\Programming\llvm-project\clang-tools-extra\clangd\Selection.cpp:639)
clangd.exe!clang::RecursiveASTVisitor<clang::clangd::`anonymous namespace'::SelectionVisitor>::TraverseTranslationUnitDecl(clang::TranslationUnitDecl * D) Line 1601 (g:\Programming\llvm-project\clang\include\clang\AST\RecursiveASTVisitor.h:1601)
clangd.exe!clang::RecursiveASTVisitor<clang::clangd::`anonymous namespace'::SelectionVisitor>::TraverseDecl(clang::Decl * D) Line 633 (g:\Programming\llvm-project\build\tools\clang\include\clang\AST\DeclNodes.inc:633)
clangd.exe!clang::clangd::`anonymous namespace'::SelectionVisitor::TraverseDecl(clang::Decl * X) Line 640 (g:\Programming\llvm-project\clang-tools-extra\clangd\Selection.cpp:640)
[Inline Frame] clangd.exe!clang::RecursiveASTVisitor<clang::clangd::`anonymous namespace'::SelectionVisitor>::TraverseAST(clang::ASTContext &) Line 188 (g:\Programming\llvm-project\clang\include\clang\AST\RecursiveASTVisitor.h:188)
[Inline Frame] clangd.exe!clang::clangd::`anonymous-namespace'::SelectionVisitor::collect(clang::ASTContext &) Line 617 (g:\Programming\llvm-project\clang-tools-extra\clangd\Selection.cpp:617)
clangd.exe!clang::clangd::SelectionTree::SelectionTree(clang::ASTContext & AST, const clang::syntax::TokenBuffer & Tokens, unsigned int Begin, unsigned int End) Line 1071 (g:\Programming\llvm-project\clang-tools-extra\clangd\Selection.cpp:1071)
clangd.exe!clang::clangd::SelectionTree::createEach(clang::ASTContext & AST, const clang::syntax::TokenBuffer & Tokens, unsigned int Begin, unsigned int End, llvm::function_ref<bool __cdecl(clang::clangd::SelectionTree)> Func) Line 1042 (g:\Programming\llvm-project\clang-tools-extra\clangd\Selection.cpp:1042)
clangd.exe!clang::clangd::`anonymous namespace'::getDeclAtPositionWithRelations(clang::clangd::ParsedAST & AST, clang::SourceLocation Pos, clang::clangd::DeclRelationSet Relations, clang::ASTNodeKind * NodeKind) Line 191 (g:\Programming\llvm-project\clang-tools-extra\clangd\XRefs.cpp:191)
clangd.exe!clang::clangd::`anonymous namespace'::locateASTReferent(clang::SourceLocation CurLoc, const clang::syntax::Token * TouchedIdentifier, clang::clangd::ParsedAST & AST, llvm::StringRef MainFilePath, const clang::clangd::SymbolIndex * Index, clang::ASTNodeKind & NodeKind) Line 380 (g:\Programming\llvm-project\clang-tools-extra\clangd\XRefs.cpp:380)
clangd.exe!clang::clangd::locateSymbolAt(clang::clangd::ParsedAST & AST, clang::clangd::Position Pos, const clang::clangd::SymbolIndex * Index) Line 806 (g:\Programming\llvm-project\clang-tools-extra\clangd\XRefs.cpp:806)
clangd.exe!clang::clangd::`anonymous namespace'::Checker::testLocationFeatures(llvm::Optional<clang::clangd::Range> LineRange, const bool EnableCodeCompletion) Line 254 (g:\Programming\llvm-project\clang-tools-extra\clangd\tool\Check.cpp:254)
clangd.exe!clang::clangd::check(llvm::StringRef File, llvm::Optional<clang::clangd::Range> LineRange, const clang::clangd::ThreadsafeFS & TFS, const clang::clangd::ClangdLSPServer::Options & Opts, bool EnableCodeCompletion) Line 307 (g:\Programming\llvm-project\clang-tools-extra\clangd\tool\Check.cpp:307)
clangd.exe!main(int argc, char * * argv) Line 1001 (g:\Programming\llvm-project\clang-tools-extra\clangd\tool\ClangdMain.cpp:1001)
[Inline Frame] clangd.exe!invoke_main() Line 78 (d:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:78)
clangd.exe!__scrt_common_main_seh() Line 288 (d:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288)
kernel32.dll!7641fa29() (Unknown Source:0)
kernel32.dll![Frames below may be incorrect and/or missing, no symbols loaded for kernel32.dll] (Unknown Source:0)
ntdll.dll!77077a9e() (Unknown Source:0)
ntdll.dll!77077a6e() (Unknown Source:0)
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJztW1tz6jgS_jXkRRXKF7DhgYcEQi012ZlsyJw9b5SwG-zFSJQkk_Dvt1vmYgIkkAM5mapUkViWpb583Wq1cDOU8aJ1MzKgWJRxMY5ZDAYio1kq5jxLYzblkZIs4llW8dosNSxO9SzjC824YKCUVNiImUlAsAQp0MwYRqlIDWQL-yzVLBd8mAEzkimI5BzZjZSc4ix8pg03wJ5Tk8jc4HO8VyYV42rF6VScm55hYzA0LI8mSJxpOQU2QS5MjkiIVBTcWCblrMp6RFVMSNSEz2YgSCKSj1UCpw8ZapdK8YRsQFX8G_wYbFe8RsVr4giGLV_FVuOVkCT4bEUFxYsmRvEI2BAy-YzTmBQsSwUw33MKoYv_dy98OkO1IxmjggkoKElFvIuxgVN8oop3S5-i1_NTEWU5zqz47TlKLVHcuzJ5HGKRBnb71-Mfdx2U_CdJQ4CmEXIV2uBNXGi5ItFOhUFCbI50O-xnmSA-QXunogCDVcLbDeVDdHCQS57hVcIOIejfMmpta1ZmgvaM0GqJfAbyg5U_pCNmFjMgZ-FDDSjJEEYSERsS1PE1mfgfBtnJ0FQ8-vTJwZj1MBLD9u2dVKzYKrxAxXPtTSF20V-0cTAXUiymMtdM8CnoGdH1wuLx3vWAy-3uZcaFxv4-LUbUpUS-L3MVwb2MOE1k2CDN7wnUulen9WMH1tsPSo4Vn05xLeNdls2n1zMl_4cM8dYSvDZSZvoaXlDbVV-MjbVY1Wg2Q2JIlwC8qNYUBdpJLibb2nbTDHod1u11yJSkRNF_oxRfPMIIvaM0Wi-E4S9F-0lOQJDb3HITJWuMakHzIhgh3TVGlfptT9iI1EXiUKl32KmwXZ8AG6rzIWCsl8UQ2w69Rsj3vYsghHQv4kU_Up3aOLEkkE4fkQjsWzX2AeuTKx1gugFZAbzqQlQC9gg6z8warGbtMu6EdD8JrML6XexDwGwALrHoLMQTbgvxn7SFkvp_nhU750LYOZfHbiZny03H6tKoBRfRBel-VljZUi_mhj8pjqmBhr6ZmgepX-9D2Mvs9riEIAjDi0CAdN815yNEudLpHG76T2s92uey990ycJbw2I9FEVo2wbg_xTT2h01jepiKokibZw8SkxdQPWEeePpK2g22bUphhggUXnbm3qcToOWJgqVGHyCB0u-ZumTbEyP5JusP81x9LCz_ySGHjaM03JMcBa_LxLLUg4bG_3vsXk3IZxru1_KZH1z9C7IZqG3Hwe4ORJkFqbMGyPPCxqURIh5fDiLC4jiAGqflKB8CqPF-vvKpAO2isweaWnh0QjLM04wCro3DRyBF3CgR0FUcgfSR1W_Zm7bwsD2DQeYtCWKI5dNhzAejkAMPg6bLseUE9XroOPW6y4NGzXFrvLmGV-Kq5MbmP6ROaVMP_Mskd0j3twBnlsCREfc70lr1MDgtRh-rOtK9fG52xIL5-alG_jLhYzd1WfV-py_Hpi-eH1x-d0YeX8t7vpPeX016TzsdfSjp_WIHpW4u7PN9me_q2d7szr04VsTja4K1u2m9CZX3CScF74vFouMSYe9oJ_rlRNgLvxPh70T4OxH-ZyTCeBU6s6_P_hap2QVnz4BXwcUNnIt_h0U8vhZwR8XdwPc_K-4iq6-2hi70SiMovdI4IVB-qneQjbbwwY62xPT5hfLjYLN2GhdPWZDFb9lXIplR91EwBCcmuUe7yhGJbVnRt97a2a43lGHW5m22895w533zbT4agbJzVq-b2ywXOh0LiBmVcdzCmOo4XvXeiXjjOE54mb2YCP8qZpECbuCOU6nBbwesfBwfLU8PA2WLAuhYzQaDKN4JZ4cVpOKZO0bHkJItapepEiDC5wzqY7D79w29wUyJz39TkzxCsbvrwwg8cAxpMZpry2ylY_92GQ5Sf-PNOEmw4tkHw0r8t-YgG9rf_qDqOtpYVjcb2JvnWQE_H2GkV4g3z5qJZgQJBWRkAQrE2-VL7VzZCqZjloSF5EnmUQJxL0bK6SilrxUOwr7XhqUvqoxC5FBM9m-eCqo0euAm2SvL1tpYTIcy64kYXqxEtvWmIYNdQ_qN8yQKZUMizZMMWViqUOfGfHwpbI1drrL1gvgAkquSCuc8JRVliJDmOX29nUA0KZdirfy6i5tBrkBvlWb9NaNHPDucghWFSxhrCYBlFdMKQxu472whbxu9qS2ptpUIbr4MqtfOAhh148Uqt8QNSZ-EW0Rzt5TfLDZaaNsL8deAOTDlKcEdOdZ8BN1-sY12--9Oatv2ff-hD2q-MmwhnrZEsG39-n1r-M558rs91kDS-62xLIWlPICrcRFWE67s4qI_7JyXtvATz7DvSWjvKZSut_LSAfa9NDwVc4zxg1Ixb_H1iz0rxIWIxHXwLNUEry7-0ZlRqwj_z6P1GVIZe2_L2PPZesTmHvkNIjmdYsqRCvre7FAhxGCgkdpyrJVsoCEpS-c1PkE8r3SYwWAjIPO9akw_CHDDoOaO-Pq7Orz8LSZCPgtWbLM42zk0Fw1iLaGLOno25QtsYQ4ZSaXQ6vTbgYrXlYpNU63JK9CbhGTaBm3NMsljzDlHOGCLMhr2bTmEwWErBUInDHkTjlJgd2Jw3MR14fYVtNwgCDwnCD33Km75cdNv8iuTmgxaCMjKpTvsHhs5HwPTNhCUfwPxnGAAY7g2IrC4bCDLFvZ3C4TKMum-ztIJFD_iuMpV1kqMmdmfHnhd_IwxFc2HVbQ23thwWFzWC8_rIvQ5bSPdeqPW8K6SVjgcNv3Y94dBLXYb_hBGLq95vBH7DufD0L3KONpTkzYVzxPwzCwJbKNaV2nLczzPdTDna7qe41ahWeexG9ZdCD1w8HhacwA9PauSHFWpxleqZUUa5mOND7NUG715yLU9eljwiD7PTSJVqwtKUY3yleXdsrL_H5gNKXM">