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

    <tr>
        <th>Summary</th>
        <td>
            [Clang] Segmentation fault in CXXNameMangler::mangleName due to infinite recursion
        </td>
    </tr>

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

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

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

<pre>
    
## Description
When compiling the following test case, Clang 20.1.8 crashes with a segmentation fault.
Here is the godbolt link: https://godbolt.org/z/Ee4rcYExj

## Clang Version
```bash
clang version 20.1.8
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /home/build/bin/llvm/bin
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/11
Selected GCC installation: /usr/lib/gcc/x86_64-linux-gnu/11
Candidate multilib: .;@m64
Selected multilib: .;@m64
```


## Stack Dump
```bash
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: /home/build/bin/llvm/bin/clang-20 -cc1 -triple x86_64-unknown-linux-gnu -emit-obj -dumpdir a- -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name test.cpp -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fdebug-compilation-dir=/home/cppfuzz -fcoverage-compilation-dir=/home/cppfuzz -resource-dir /home/build/bin/llvm/lib/clang/20 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/11/../../../../include/x86_64-linux-gnu/c++/11 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/backward -internal-isystem /home/build/bin/llvm/lib/clang/20/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/11/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include --std=c++23 -fdeprecated-macro -ferror-limit 19 -fgnuc-version=4.2.1 -fno-implicit-modules -fskip-odr-check-in-gmf -fcxx-exceptions -fexceptions -fcolor-diagnostics -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /tmp/test-4b1a75.o -x c++ /home/test.cpp
1.      <eof> parser at end of file
2.      /home/test.cpp:4:25: instantiating function definition 'tmain<int>'
  #0 0x000055e420763d40 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/home/build/bin/llvm/bin/clang-20+0x3e27d40)
  #1 0x000055e420761581 SignalHandler(int) Signals.cpp:0:0
  #2 0x00007f3ed70d4520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520)
  #3 0x000055e423ee4f9a (anonymous namespace)::CXXNameMangler::mangleName(clang::GlobalDecl) ItaniumMangle.cpp:0:0
  #4 0x000055e423ef39bd (anonymous namespace)::CXXNameMangler::mangleFunctionEncoding(clang::GlobalDecl) ItaniumMangle.cpp:0:0
  #5 0x000055e423ee477a (anonymous namespace)::CXXNameMangler::mangleLocalName(clang::GlobalDecl, llvm::SmallVector<llvm::StringRef, 4u> const*) ItaniumMangle.cpp:0:0
  #6 0x000055e423ee5687 (anonymous namespace)::CXXNameMangler::mangleName(clang::GlobalDecl) ItaniumMangle.cpp:0:0
  #7 0x000055e423ef39bd (anonymous namespace)::CXXNameMangler::mangleFunctionEncoding(clang::GlobalDecl) ItaniumMangle.cpp:0:0
  #8 0x000055e423ee477a (anonymous namespace)::CXXNameMangler::mangleLocalName(clang::GlobalDecl, llvm::SmallVector<llvm::StringRef, 4u> const*) ItaniumMangle.cpp:0:0
  #9 0x000055e423ee5687 (anonymous namespace)::CXXNameMangler::mangleName(clang::GlobalDecl) ItaniumMangle.cpp:0:0
 #10 0x000055e423ee6776 (anonymous namespace)::CXXNameMangler::mangleType(clang::QualType) ItaniumMangle.cpp:0:0
 #11 0x000055e423efb200 (anonymous namespace)::CXXNameMangler::mangleTemplateArg(clang::TemplateArgument, bool) ItaniumMangle.cpp:0:0
 #12 0x000055e423ef8840 (anonymous namespace)::CXXNameMangler::mangleTemplateArgs(clang::TemplateName, clang::TemplateArgumentList const&) ItaniumMangle.cpp:0:0
 #13 0x000055e423ee4f11 (anonymous namespace)::CXXNameMangler::mangleNameWithAbiTags(clang::GlobalDecl, llvm::SmallVector<llvm::StringRef, 4u> const*) ItaniumMangle.cpp:0:0
 #14 0x000055e423ee5687 (anonymous namespace)::CXXNameMangler::mangleName(clang::GlobalDecl) ItaniumMangle.cpp:0:0
...
#252 0x000055e423ef8840 (anonymous namespace)::CXXNameMangler::mangleTemplateArgs(clang::TemplateName, clang::TemplateArgumentList const&) ItaniumMangle.cpp:0:0
#253 0x000055e423ee4f11 (anonymous namespace)::CXXNameMangler::mangleNameWithAbiTags(clang::GlobalDecl, llvm::SmallVector<llvm::StringRef, 4u> const*) ItaniumMangle.cpp:0:0
#254 0x000055e423ee5687 (anonymous namespace)::CXXNameMangler::mangleName(clang::GlobalDecl) ItaniumMangle.cpp:0:0
#255 0x000055e423ee6776 (anonymous namespace)::CXXNameMangler::mangleType(clang::QualType) ItaniumMangle.cpp:0:0
clang++: error: unable to execute command: Segmentation fault (core dumped)
clang++: error: clang frontend command failed due to signal (use -v to see invocation)
clang version 20.1.8
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /home/build/bin/llvm/bin
clang++: note: diagnostic msg: 
********************

PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
Preprocessed source(s) and associated run script(s) are located at:
clang++: note: diagnostic msg: /tmp/test-a1a98e.cpp
clang++: note: diagnostic msg: /tmp/test-a1a98e.sh
clang++: note: diagnostic msg: 

********************
```
Here is the entire stack dump.
[dump.log](https://github.com/user-attachments/files/21479105/dump.log)

## Program
```cpp
#include <functional>
#include <memory>

template <typename T> T tmain() {
    while (true) {
      const int max_depth = 1000;
      int count = 0;
      std::function<void(int &, const std::shared_ptr<class B> &)>
          a_method =
              [&](int &count,
                  const std::shared_ptr<class B> &b_instance) {
 if (count >= max_depth)
                  return;
 ++count;
              };
    }
  return T();
}

int main() {
 return tmain<int>();
}
```

## Command 
```bash
clang++ test.cpp
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzcWV9z3CgS_zT4pYspCWn-PfhBnvEkqcpucrFvs_fkQqilYY1ABcge59NfgWTPZOz4nPhuN7dTY48ETfPrv0DDnZONRjwl0zMyXZ_w3m-NPf1dS25OSlPdnZKkICwjLIM1OmFl56XRJCk-b1GDMG0nldQN-C1CbZQyt_ENnQfBHRK2gpXiugGWTNLJAoTlbosObqXfAgeHTYva88AUat4rPyFJ8RYtgnSRaWOq0igPSuprkhWw9b5zJCsI2xC2GXsnxjaEbb4QtjnH3Ip_ne_-CMAfsA8YfkPrBvRklgzfkrstSQoR-2-G_hErSYpLbhv0YdrdYnY1y2mvr7W51VRJ3e9oo_tAtLXIK2hNhSqQdsbJHUmKd9p5rhRWa2lDO2GbrWmRsE3ZS1WFX6kJ2yh1044vSbExva5AcF3JinuEN6sVyIFRVNLIqHc2jJRl0IEQhG1GgHtgbJOmJCkuUKHwWL2e0-oBVNsrL8OQrIAJyc5InrSz_HCyb1I8KH40z4OFLjwX17Du2-4J83x8f15cnIPry1Z64FD2DVjsjPXgzbFLSL_ty4kw7V634Yd21vyBwhO2kc716AjbANcVSC1UX2H0tuieUHJx7S0X0X07i501Ap3DCpzp7dAcRnLnjJA8CGx7DUN4BAcehKmCMFmQMZnAR2say1vgtumDy7sXugTbRN-kLAEqRArUW9kp_KZDAsVWemrKP4AGAJW0wCnQSjpeKqS1RQQqFHJLufO0xNpYpEFk1NWeLqrsBq2sJdrYLLit6A1XPVLNW3RAWy41raUaGmLUT0TXAW0tKiOim9EYF9BJAbSTgiq8QQVseJGOdhKBtrXlLdLOSO3RkmzNlQJat9xvKVqrDdC67qgwOpjFk2xtNNBaG2pDvEjd0EALtBVGO2974Y2lXEnuAs6617dSV9QHyRzJ1gyoj6FNRdcHVdJZDtT3GmNDgxptAFxh2TcN2tAldUOydVOVQOvYTofsN0hZhRhf7-0puq7uv3wBWgtzg5Y3-DJyi4OLBYr_5B5D0Eb3IGwTHCSqT3NFpbtzHtvvCXC2mUwe_xuDI8xD2Fn8btL0fzvTE6P-vMkPZwoK5-L6ltvq6Um_xzr7WZ4VwAiuXkj6g7I-Qft4NtyFB_F41m-b6fnR3z8FUOp8RbL1aBKWxcjrLIqQcmnLhQ2JAa01lioZloZ0CbRudC_ouJaTbJ1P2CQdsoVsOyWF9CEp9SqmBnctO2oqS8UWxTWVmjZtHcJ2t6O4Exj3O4HwqxdhlLG0krzRxnkpQhuvKutkA3R9dfVmtbp6W_x2frX-XHzasKvV5t1VcfELydYpUBNE9W0X_qPzNC9TPp9ODNAdjLIeONd9ViVJkU4gfki2QlOT7Bw6bh1a4B5C8jY1hGxMkoLdUz5mkxU5yQo2DetP3A9oL7kPu7a61yJuxCqspZbxkbC5D2meZCupPcnOCZuTpAicswSSXZIkyXSKOUvms6zKE4jenxUkK9ydGx4-Wql9XBIvh0V1sSey_PbKOG-Rt4TNwsIapmFLIGzxXasjYWfJLkM2r_KEsOU9xvQIYzpdpHAhG83VW64rhZawxTjl0OxGLSXxb2TDRjbzOsNqnlT5lCUjxCEMnwgqJUsxcWYyi9ByNmWHwLJDYBliXi954Mi10Xet6R3ERbaLClsOylr9_vuvvMVfuG4C8NjWxpfQTNhiyDax_Y0yJVdrFCqI9s5zLft2GPmUgPnXcOpsWVY_DmczetK5Fiaszq-CNj3W1Hz-Ck29Dwn2eXWtDpz4ouVK_YZhP0Gy1UG7t1I3n7AO5HkfYjFuPQgrXiTU7Eio6Wwx_wvNP_95zb_4O5p_-fOYPyTJ5AjObD6f_Ticy7vuCM4_eq6G1heASY98sWRJ8gow2HaKeyzskRsedMQDWbBkaczLFMaOMC4W-X8Ho3sa5GDhFTyD_710_t4JZy8S4vESlKavc8LP0m-LUl7yYzn-zPgKouU_TXxNJpOhyMGm_-9OE4X4ezpNFO3ncZoI53jf81cl5fEIG0_FWQHxuBUees1LheAN4A5F7xGEaVuuq9B58aiwG6ALYzGWxbAatsLf4j3UY2trtA8Hm5Ex1FwqrKDq47Qu7tcD394h0JvYhghS34zFp4NJfobi7pG02ngMv_tjJLSuidyCC7ziGwurY9G0uLwsVm_h8u05bD68f__h87tf38Dm3fvzC7j8EJvP_vkGPp1__PDpcqhWfnyq4rlwwU--WfV8ILAIsfSHFXA_8Hu52F8di3nKlwscj76v47Gv8b9U-683wEGh-_A-A7WXFsE9VIjj8jA9i4_KNGS6JmzxTEm7d2gp956L7VBHZptw6A-_LM3nyzSZErZ5YBcjYF9mH8vQhwAHBROW3dddSLa6LwVwFY78x70ttsbejT1J4cdFJXT5uw5jMfgypN9LGIoH4aC8BDI_i_tfgNutVBgC19sev-6CIWeD1B5avruqsPNbINka0iRJSLanCxTC9NrH3q-6Yt0o5Lh7OUi2ujGyGs76MFYahokeaN2WW6yuOh9WFaG4c3AWhBhWxkFaePjwqxb91lRh8q86YtllehZGRVOOE0akhK0e0e5FfgmS8mqo2YhDtcl6SK6DLs6DOh5Ud19yOP5Y9L3Vo9KGqBggHqjxQZz5et8cXsLTwAAuB-MO_UMfSYrBeseWH4ccF5QejT-6Ixqv8MY14Fu3d2Ph7KBc9kB2Up1m1TJb8hM8TefTbD7Nl2x2sj2tltVskWSVmM2zbMoXaVZO5zlf8nReLiusTuQpS9g0mbNlwpJFPpukWTZdZiJJhVjM87wkeYItl2oSEv3E2OYkXi6dptM0mbMTxUtULt6uMjbCZGS6PrGn8YKl7BtH8kRJ592ehZdexSvZeG1JpuunllOp4fnNx_0yKXWs5iFYFH1cA096q05__NZslO3mlP07AAD__9KxVvs">