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

    <tr>
        <th>Summary</th>
        <td>
            [clangd/clang-format] Stack overflow when formatting a file with deep nested braces
        </td>
    </tr>

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

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

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

<pre>
    Create a head file `main.h` with deep nested braces (>= 6000 level), and open it with a code editor with clangd enabled.

```c
   #ifndef __riscv_vlsseg4e16_v_bf16mf4x4_tu
#define PUBLIC_H
#include "private.h"void pub() {...{
  return (v128_t)(-(__f32x4)__a);
}...}

#endif

```

Select all the code and format it. Clangd will crash when handling `textDocument/rangeFormatting`, with the following stack pattern.

```
 #5 0x000000000facca5f clang::format::(anonymous namespace)::ExpressionParser::parse(int) /src/clang/lib/Format/TokenAnnotator.cpp:3182:0
  #6 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::getCurrentPrecedence() /src/clang/lib/Format/TokenAnnotator.cpp:3329:9
  #7 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::parse(int) /src/clang/lib/Format/TokenAnnotator.cpp:3228:31
  #8 0x000000000fad05f0 clang::format::(anonymous namespace)::ExpressionParser::parseConditionalExpr() /src/clang/lib/Format/TokenAnnotator.cpp:3419:10
  #9 0x000000000fad05f0 clang::format::(anonymous namespace)::ExpressionParser::parse(int) /src/clang/lib/Format/TokenAnnotator.cpp:3196:7
 #10 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::getCurrentPrecedence() /src/clang/lib/Format/TokenAnnotator.cpp:3329:9
 #11 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::parse(int) /src/clang/lib/Format/TokenAnnotator.cpp:3228:31
 #12 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::getCurrentPrecedence() /src/clang/lib/Format/TokenAnnotator.cpp:3329:9
 #13 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::parse(int) /src/clang/lib/Format/TokenAnnotator.cpp:3228:31
 #14 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::getCurrentPrecedence() /src/clang/lib/Format/TokenAnnotator.cpp:3329:9
 #15 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::parse(int) /src/clang/lib/Format/TokenAnnotator.cpp:3228:31
 #16 0x000000000facf4cf clang::format::(anonymous namespace)::ExpressionParser::parse(int) /src/clang/lib/Format/TokenAnnotator.cpp:3278:16
 #17 0x000000000fad02c0 clang::format::(anonymous namespace)::ExpressionParser::parseUnaryOperator() /src/clang/lib/Format/TokenAnnotator.cpp:0:5
 #18 0x000000000fad02c0 clang::format::(anonymous namespace)::ExpressionParser::parse(int) /src/clang/lib/Format/TokenAnnotator.cpp:3203:7
 #19 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::getCurrentPrecedence() /src/clang/lib/Format/TokenAnnotator.cpp:3329:9
 #20 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::parse(int) /src/clang/lib/Format/TokenAnnotator.cpp:3228:31
 #21 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::getCurrentPrecedence() /src/clang/lib/Format/TokenAnnotator.cpp:3329:9
 #22 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::parse(int) /src/clang/lib/Format/TokenAnnotator.cpp:3228:31
 #23 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::getCurrentPrecedence() /src/clang/lib/Format/TokenAnnotator.cpp:3329:9
 #24 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::parse(int) /src/clang/lib/Format/TokenAnnotator.cpp:3228:31
 #25 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::getCurrentPrecedence() /src/clang/lib/Format/TokenAnnotator.cpp:3329:9
 #26 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::parse(int) /src/clang/lib/Format/TokenAnnotator.cpp:3228:31
 #27 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::getCurrentPrecedence() /src/clang/lib/Format/TokenAnnotator.cpp:3329:9
 #28 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::parse(int) /src/clang/lib/Format/TokenAnnotator.cpp:3228:31
 #29 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::getCurrentPrecedence() /src/clang/lib/Format/TokenAnnotator.cpp:3329:9
 #30 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::parse(int) /src/clang/lib/Format/TokenAnnotator.cpp:3228:31
 #31 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::getCurrentPrecedence() /src/clang/lib/Format/TokenAnnotator.cpp:3329:9
 #32 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::parse(int) /src/clang/lib/Format/TokenAnnotator.cpp:3228:31
 #33 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::getCurrentPrecedence() /src/clang/lib/Format/TokenAnnotator.cpp:3329:9
 #34 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::parse(int) /src/clang/lib/Format/TokenAnnotator.cpp:3228:31
 #35 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::getCurrentPrecedence() /src/clang/lib/Format/TokenAnnotator.cpp:3329:9
 #36 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::parse(int) /src/clang/lib/Format/TokenAnnotator.cpp:3228:31
...
Thread T132 created by T0 here:
    #0 0x585fd95 in pthread_create (/src/build/bin/clangd+0x585fd95) (BuildId: c3ce5beed26c9a8a)
    #1 0x5dfe568 in llvm::llvm_execute_on_thread_impl(void* (*)(void*), void*, std::optional<unsigned int>) /src/llvm/lib/Support/Unix/Threading.inc:96:17
 #2 0x92fa751 in llvm::thread::thread<clang::clangd::AsyncTaskRunner::runAsync(llvm::Twine const&, llvm::unique_function<void ()>)::$_1>(std::optional<unsigned int>, clang::clangd::AsyncTaskRunner::runAsync(llvm::Twine const&, llvm::unique_function<void ()>)::$_1&&) /src/llvm/include/llvm/Support/thread.h:131:12
    #3 0x92fa751 in clang::clangd::AsyncTaskRunner::runAsync(llvm::Twine const&, llvm::unique_function<void ()>) /src/clang-tools-extra/clangd/support/Threading.cpp:107:16
    #4 0x8fc1cba in clang::clangd::TUScheduler::runWithSemaphore(llvm::StringRef, llvm::StringRef, llvm::unique_function<void ()>, clang::clangd::Semaphore&) /src/clang-tools-extra/clangd/TUScheduler.cpp:1733:18
    #5 0x8fc286f in clang::clangd::TUScheduler::runQuick(llvm::StringRef, llvm::StringRef, llvm::unique_function<void ()>) /src/clang-tools-extra/clangd/TUScheduler.cpp:1719:3
    #6 0x8a8f6a0 in clang::clangd::ClangdServer::formatFile(llvm::StringRef, std::optional<clang::clangd::Range>, llvm::unique_function<void (llvm::Expected<clang::tooling::Replacements>)>) /src/clang-tools-extra/clangd/ClangdServer.cpp:550:18
    #7 0x89cad41 in clang::clangd::ClangdLSPServer::onDocumentRangeFormatting(clang::clangd::DocumentRangeFormattingParams const&, llvm::unique_function<void (llvm::Expected<std::vector<clang::clangd::TextEdit, std::allocator<clang::clangd::TextEdit>>>)>) /src/clang-tools-extra/clangd/ClangdLSPServer.cpp:957:11
    #8 0x8a365e3 in void clang::clangd::LSPBinder::method<clang::clangd::DocumentRangeFormattingParams, std::vector<clang::clangd::TextEdit, std::allocator<clang::clangd::TextEdit>>, clang::clangd::ClangdLSPServer>(llvm::StringLiteral, clang::clangd::ClangdLSPServer*, void (clang::clangd::ClangdLSPServer::*)(clang::clangd::DocumentRangeFormattingParams const&, llvm::unique_function<void (llvm::Expected<std::vector<clang::clangd::TextEdit, std::allocator<clang::clangd::TextEdit>>>)>))::'lambda'(llvm::json::Value, llvm::unique_function<void (llvm::Expected<llvm::json::Value>)>)::operator()(llvm::json::Value, llvm::unique_function<void (llvm::Expected<llvm::json::Value>)>) const /src/clang-tools-extra/clangd/LSPBinder.h:141:5
    #9 0x8a36175 in void llvm::detail::UniqueFunctionBase<void, llvm::json::Value, llvm::unique_function<void (llvm::Expected<llvm::json::Value>)>>::CallImpl<void clang::clangd::LSPBinder::method<clang::clangd::DocumentRangeFormattingParams, std::vector<clang::clangd::TextEdit, std::allocator<clang::clangd::TextEdit>>, clang::clangd::ClangdLSPServer>(llvm::StringLiteral, clang::clangd::ClangdLSPServer*, void (clang::clangd::ClangdLSPServer::*)(clang::clangd::DocumentRangeFormattingParams const&, llvm::unique_function<void (llvm::Expected<std::vector<clang::clangd::TextEdit, std::allocator<clang::clangd::TextEdit>>>)>))::'lambda'(llvm::json::Value, llvm::unique_function<void (llvm::Expected<llvm::json::Value>)>)>(void*, llvm::json::Value&, llvm::unique_function<void (llvm::Expected<llvm::json::Value>)>&) /src/llvm/include/llvm/ADT/FunctionExtras.h:222:12
    #10 0x8a3e190 in llvm::unique_function<void (llvm::json::Value, llvm::unique_function<void (llvm::Expected<llvm::json::Value>)>)>::operator()(llvm::json::Value, llvm::unique_function<void (llvm::Expected<llvm::json::Value>)>) /src/llvm/include/llvm/ADT/FunctionExtras.h:387:12
    #11 0x8a3e190 in clang::clangd::ClangdLSPServer::MessageHandler::onCall(llvm::StringRef, llvm::json::Value, llvm::json::Value) /src/clang-tools-extra/clangd/ClangdLSPServer.cpp:243:7
    #12 0x8d76b3c in clang::clangd::(anonymous namespace)::JSONTransport::handleMessage(llvm::json::Value, clang::clangd::Transport::MessageHandler&) /src/clang-tools-extra/clangd/JSONTransport.cpp:194:20
    #13 0x8d76b3c in clang::clangd::(anonymous namespace)::JSONTransport::loop(clang::clangd::Transport::MessageHandler&) /src/clang-tools-extra/clangd/JSONTransport.cpp:119:16
    #14 0x8a47cd9 in clang::clangd::ClangdLSPServer::run() /src/clang-tools-extra/clangd/ClangdLSPServer.cpp:1741:25
    #15 0x88915c9 in clang::clangd::clangdMain(int, char**) /src/clang-tools-extra/clangd/tool/ClangdMain.cpp:1049:28
    #16 0x7f4f29f5f5cf in __libc_start_call_main (/lib64/libc.so.6+0x295cf) (BuildId: 7a40a22c9a82854f3d66767232ae364a99174860)

```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzsW9ty2zgS_Rr4BRUVCfACPvhBlq2a2crseGNn95EFgU0REwjkgqBs__0WCFG3RB47DpOoNonKoiABOOd0o5u4kLetXGqASxRfofj6gne2qs1lBdo8VcL9v1jUxdPlzAC3gDmugBe4lAowSoIVl3pSoSTAD9JWuABosIbWQoEXhgtoMSIM0RtEr3ESBAFWsAaFSIbIDHNd4LoBjaX11TkWdQEYCmlr44uE4npZYNB8oaCYoGDqXkngXwIFU4wxIlSWuoAS57mRrVjna9W2sIwgTPJ1vijDZFVGj1FuO1eb0AJKqQHffrx6__ss_80XSi1UVwBGhDRGrrmFSYUIWdeywE23cERIhlF6NZlMUHrVd23AdkY7kuuQsNz2zNg7RFiel5Q8Rohkec5dMXU1UHrd177eECEUdCHLI1r-4x0oEBZzpbCtwEvjJCtrs-IWSzvBM6_Og1QKC8PbCj9UoHHFdaGkXjoLWXi017XoVqAtInPD9RLmfQtW6qXrjMy81K6TslaqfnBVW8vFJ9xwa8HoY90dd0RojIPHYPhXciF4XHqLITpFdOqR-mtEGNe1flrVXYs1X0HbcAG9MO7rm8fGQNvKWt9y04LxpY27RoRJhz3DiMxbIxCZ-z7IXMkFInNPB5H5ff0J9FTr2nJbm4loGkSnNGQE0WmP2YFOjkBDnMbfFPQS7KwzBrS9NSCgAO2qsK8nQPv-soFAOjaBb6I6ceN-SsMBNTtEXQRxGXx71LNaF9LKWnPlfvUm2aPQ9RduHSf7Lgze7O1Zgug03YzQMDhnb3cEwrPzdoeanLvs9Cxlj85d9uOMeh6yH6fUMhI_4X0ASR3qMBlQp8fxnIgR4vlHzc3Tnw0YB-UtrhIgOo0H7J9l01Gwv1nxgO7nouzMRycZPZmOMTrJ6Bl0bNlHT6ajyD56Bh1b9tGT6Siyj55Bx5Z99PnpKLKPPikdW3Z2lrKfe0qlZ5lS6bmnVHqWKZWee0qlZ5lSP1vmPTvZzy6lTiYTFEzvKwO8wPchJVj02y8FXjzh-wBXYMD13O9-OIoujMYsLossxlLjxvZVc1-r34MZIC06qQr3LvUAsEDkalvd42dX7me_F4hOsaAC4gVAQRKRcdZvZmw7dpEwLkqIE-Y6Vmq98pK4qxweQXQW8lrnG0Ry1ShE2LqWBSJTj2zqd002ZZvNoe2nGW5t4dusG7-0i-is0_22VYGd5PTmQPUexCD6Xdc0tXGqf9Ty0YnfA5F6OZFaOC9JEJ2GwyTVBcaMlDyNw0M-Hv_h9WzPhzZK9tfT9kmLe95--tBpPfiI6XRfjgjbtXr_IDVgUevWIpI4srvvOi3_20Fedlo42ojO-q0oPzA858FlozzsC9iLpJrhnwm3q558yX6b_bhdwc6U3gCTylmOhu4v2bkkPTThj-Z6FA3e2bpW7Tt4tIbvDcB5uyW3c1AfGMIg3a5beYYujbBShGLBn2F4__FOVFB0ao_df6St7mDFm6o2cMDyzhqplx-gPCR4ovjveZ90sr3uk5fLs0dmkCWl1L2xnS6x14WwpHylLv_qpPg0qh5vIdpvRNEdT5fPGGdlwoNnePrN4Tsw64Goz3NzqZ4x_ZciyIkOPnC9hI2xXyLF7jc3jw0IC0ch1Ckihw8foFFcwAq0bYeg8QoZ98lvdIzj4Mhf3KSVZYIX0XORwjf1_u52X8paD5vqH4521Ak70c6JCrfc8FX76vjyRTG3xluDsLU5bbp7eLQ3hbQHFudK1YK_rB692by-yi5bMTemyeI-xIU707DexWkSA3Wm6VmfwPT-7vZK6mKwzApsVT-TnJ81w4Ee30nE06HyM8-7-cK4fS8tGK5e0Yy_qxoc6TVev71X-7908b0bl1Tx1aLgiKQHOP9qHQF39W-uOngT0dOt7kPahOr97aUfi8hb-YXRYDt0_a1cFA57XHh74sIFgTCNt0FgB6IAy6Xy1x97JvMNkSvewobMIeHvrIZ79WOJK_W7m_hsmvwVyH4Fsl-B7CiQ3ewvATw7aN-m-0vgvGw-Or2-R2Q-BJ0bF9zaPpARQo7mpP05LMYphFlwuK7wEvQ_xBo_X2b5eoNQlh4bJDw0yGuCxx_QtnwJv3FdqN18wAX5l8wgn9Xtsy_fdl9Nou0BjA1t4mgXabKg4hnaf7MI-o-7P_95b7hu-xWLvqg_cgwbZf7OT04FrMMmj2R-zWrBAcBhGp1FTpFgTww6khiqrpvTuWVkmv7U6t5qUX8qjvEoFUX2Wlc3nf7iQvzr3DBM-zs7sndr1590YywLY_EcKH_9B5d6WF2fYVFxn_qnL8flirfwXHPbtbXIyUX2FgX602xpGZUkK-MyFv1SUp4ruRB5a7mxueBK5Ssu9WZhXclFEvl3MWnrSdKvp5MsFuXnq-kpjwJOiMg4IyyOSlokSZqkhBIONIl4loVpxJLAr7LvH7q_KC5pkdGMX8BlmEZJwDKWkovqkpY0IzFnLE7CBNIsSgjLGAQxT8sIQn4hL0lA4iAOwoDFaRxOSmAiDCELaBJFSZigKIAVl2rihu2kNssL2bYdXIaUBVl2ofgCVNs_IUKI13mzZUIIiq8vzKWr927RLVsUBUq2tt21ZKVV_dMlW2MctBBf47v-UYN6DaZU9YN_hKHc3nNh7p82OfGAyUVn1GVlbdP2Q3WOyHwpbdUtJqJe7W0GOICNqf8CYV3qcPRaROYbhutL8r8AAAD__-IJumA">