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

    <tr>
        <th>Summary</th>
        <td>
            LLDB crashes when printing a `clang::TemplateDecl` object
        </td>
    </tr>

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

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

    <tr>
      <th>Reporter</th>
      <td>
          kasuga-fj
      </td>
    </tr>
</table>

<pre>
    LLDB crashed when I tried printing an object while debugging clang++.

Here is the stack trace.

```
$ /path/to/lldb /path/to/clang++
(lldb) target create "/path/to/clang++"
Current executable set to '/path/to/clang++' (x87_64).
(lldb) b Sema::DeclareImplicitDeductionGuides
Breakpoint 1: no locations (pending).
WARNING:  Unable to resolve breakpoint to any actual locations.
(lldb) run -cc1 main.cpp
Process 3231335 launched: '/path/to/clang++' (x86_64)
1 location added to breakpoint 1
Process 3231335 stopped
* thread #1, name = 'clang++', stop reason = breakpoint 1.1
    frame #0: 0x00007ffff05c5ce3 libclang-cpp.so.18git`clang::Sema::DeclareImplicitDeductionGuides(this=0x000055555569fd10, Template=0x00005555556b34d0, Loc=(ID = 76)) at SemaTemplate.cpp:2617:75
 2614 void Sema::DeclareImplicitDeductionGuides(TemplateDecl *Template,
 2615                                           SourceLocation Loc) {
 2616   if (CXXRecordDecl *DefRecord =
-> 2617 cast<CXXRecordDecl>(Template->getTemplatedDecl())->getDefinition()) {
 2618     if (TemplateDecl *DescribedTemplate = DefRecord->getDescribedClassTemplate())
   2619       Template = DescribedTemplate;
   2620   }
(lldb) p *Template
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.      Program arguments: /path/to/lldb /path/to/clang++
1.      HandleCommand(command = "p *Template")
2. <eof> parser at end of file
3.      <lldb wrapper prefix>:43:16: Generating code for declaration 'clang::Sema::$__lldb_expr'
  #0 0x00007f76d0569c40 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/path/to/libLLVM-18git.so+0x7f5c40)
  #1 0x00007f76d056720e SignalHandler(int) Signals.cpp:0:0
  #2 0x00007f76cf954520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520)
  #3 0x00007f76cc9da68b clang::ASTContext::getASTRecordLayout(clang::RecordDecl const*) const (/path/to/libclang-cpp.so.18git+0xfb368b)
  #4 0x00007f76cc9da915 clang::ASTContext::getASTRecordLayout(clang::RecordDecl const*) const (/path/to/libclang-cpp.so.18git+0xfb3915)
  #5 0x00007f76cc9da915 clang::ASTContext::getASTRecordLayout(clang::RecordDecl const*) const (/path/to/libclang-cpp.so.18git+0xfb3915)
  #6 0x00007f76cc9da915 clang::ASTContext::getASTRecordLayout(clang::RecordDecl const*) const (/path/to/libclang-cpp.so.18git+0xfb3915)
  #7 0x00007f76cc9da915 clang::ASTContext::getASTRecordLayout(clang::RecordDecl const*) const (/path/to/libclang-cpp.so.18git+0xfb3915)
  #8 0x00007f76cc9da915 clang::ASTContext::getASTRecordLayout(clang::RecordDecl const*) const (/path/to/libclang-cpp.so.18git+0xfb3915)
  #9 0x00007f76cc9da915 clang::ASTContext::getASTRecordLayout(clang::RecordDecl const*) const (/path/to/libclang-cpp.so.18git+0xfb3915)
 #10 0x00007f76cc9da915 clang::ASTContext::getASTRecordLayout(clang::RecordDecl const*) const (/path/to/libclang-cpp.so.18git+0xfb3915)
 #11 0x00007f76cc9da915 clang::ASTContext::getASTRecordLayout(clang::RecordDecl const*) const (/path/to/libclang-cpp.so.18git+0xfb3915)
 #12 0x00007f76cc9da915 clang::ASTContext::getASTRecordLayout(clang::RecordDecl const*) const (/path/to/libclang-cpp.so.18git+0xfb3915)
 ...... (omitted since the stack frame is the same)
#245 0x00007f76cc9da915 clang::ASTContext::getASTRecordLayout(clang::RecordDecl const*) const (/path/to/libclang-cpp.so.18git+0xfb3915)
#246 0x00007f76cc9da915 clang::ASTContext::getASTRecordLayout(clang::RecordDecl const*) const (/path/to/libclang-cpp.so.18git+0xfb3915)
#247 0x00007f76cc9da915 clang::ASTContext::getASTRecordLayout(clang::RecordDecl const*) const (/path/to/libclang-cpp.so.18git+0xfb3915)
#248 0x00007f76cc9da915 clang::ASTContext::getASTRecordLayout(clang::RecordDecl const*) const (/path/to/libclang-cpp.so.18git+0xfb3915)
#249 0x00007f76cc9da915 clang::ASTContext::getASTRecordLayout(clang::RecordDecl const*) const (/path/to/libclang-cpp.so.18git+0xfb3915)
#250 0x00007f76cc9da915 clang::ASTContext::getASTRecordLayout(clang::RecordDecl const*) const (/path/to/libclang-cpp.so.18git+0xfb3915)
#251 0x00007f76cc9da915 clang::ASTContext::getASTRecordLayout(clang::RecordDecl const*) const (/path/to/libclang-cpp.so.18git+0xfb3915)
#252 0x00007f76cc9da915 clang::ASTContext::getASTRecordLayout(clang::RecordDecl const*) const (/path/to/libclang-cpp.so.18git+0xfb3915)
#253 0x00007f76cc9da915 clang::ASTContext::getASTRecordLayout(clang::RecordDecl const*) const (/path/to/libclang-cpp.so.18git+0xfb3915)
#254 0x00007f76cc9da915 clang::ASTContext::getASTRecordLayout(clang::RecordDecl const*) const (/path/to/libclang-cpp.so.18git+0xfb3915)
#255 0x00007f76cc9da915 clang::ASTContext::getASTRecordLayout(clang::RecordDecl const*) const (/path/to/libclang-cpp.so.18git+0xfb3915)
LLDB diagnostics will be written to /tmp/diagnostics-f465ea
Please include the directory content when filing a bug report
Segmentation fault (core dumped)
```

LLDB diagnostics is as follows.

```
$ ls /tmp/diagnostics-f465ea/
diagnostics.log
$ cat /tmp/diagnostics-f465ea/diagnostics.log
$
```

The `main.cpp` I passed to clang++ is as follows.

```cpp
struct X {
  X(const T&);
};

void f() {
  auto x = X(42);
}
```

The versions of lldb/clang++ are

```
$ /path/to/lldb --version
lldb version 18.0.0git (${upstream url} revision f8f934e22c4a9dc7abaaddf422c8725bacf2048a)
  clang revision f8f934e22c4a9dc7abaaddf422c8725bacf2048a
  llvm revision f8f934e22c4a9dc7abaaddf422c8725bacf2048a

$ /path/to/clang++ --version
clang version 18.0.0 (${upstream url} f8f934e22c4a9dc7abaaddf422c8725bacf2048a)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /path/to 
```

GDB prints the object correctly.

```
...
(gdb) p *Template
$1 = {<clang::NamedDecl> = {<clang::Decl> = {_vptr.Decl = 0x7ffff7f47df0 <vtable for clang::ClassTemplateDecl+16>, NextInContextAndBits = {Value = {Data = "h:kUUU\000"}},
      DeclCtx = {<llvm::pointer_union_detail::PointerUnionMembers<llvm::PointerUnion<clang::DeclContext*, clang::Decl::MultipleDC*>, llvm::PointerIntPair<void*, 1, int, llvm::pointer_union_detail::PointerUnionUIntTraits<clang::DeclContext*, clang::Decl::MultipleDC*>, llvm::PointerIntPairInfo<void*, 1, llvm::pointer_union_detail::PointerUnionUIntTraits<clang::DeclContext*, clang::Decl::MultipleDC*> > >, 0, clang::DeclContext*, clang::Decl::MultipleDC*>> = {<llvm::pointer_union_detail::PointerUnionMembers<llvm::PointerUnion<clang::DeclContext*, clang::Decl::MultipleDC*>, llvm::PointerIntPair<void*, 1, int, llvm::pointer_union_detail::PointerUnionUIntTraits<clang::DeclContext*, clang::Decl::MultipleDC*>, llvm::PointerIntPairInfo<void*, 1, llvm::pointer_union_detail::PointerUnionUIntTraits<clang::DeclContext*, clang::Decl::MultipleDC*> > >, 1, clang::Decl::MultipleDC*>> = {<llvm::pointer_union_detail::PointerUnionMembers<llvm::PointerUnion<clang::DeclContext*, clang::Decl::MultipleDC*>, llvm::PointerIntPair<void*, 1, int, llvm::pointer_union_detail::PointerUnionUIntTraits<clang::DeclContext*, clang::Decl::MultipleDC*>, llvm::PointerIntPairInfo<void*, 1, llvm::pointer_union_detail::PointerUnionUIntTraits<clang::DeclContext*, clang::Decl::MultipleDC*> > >, 2>> = {Val = {Value = {Data = "p\243fUUU\000"}}}, <No data fields>}, <No data fields>}, <No data fields>}, Loc = {ID = 31}, DeclKind = 30, InvalidDecl = 0, HasAttrs = 0, Implicit = 0, Used = 0,
      Referenced = 0, TopLevelDeclInObjCContainer = 0, static StatisticsEnabled = false, Access = 3, FromASTFile = 0, IdentifierNamespace = 38, CacheValidAndLinkage = 0}, Name = {Ptr = 93824993767936}},
  TemplatedDecl = 0x5555556b3440, TemplateParams = 0x5555556b3428}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsWltv27jy_zTMyyCGTN3shzz40nSDf7b_YpP09C2gqJHNDU0KJJW43_6ApGzLTprt9uDgrIEauVjiXH4zGs6IQzJrxUohXpF8TvLlBevcWpurJ2a7Fbts_ryodP3t6vZ2OQdumF1jDS9rVHADzgisoTVCOaFWwBTo6k_kDl7WQiLUWHWrlR_hkqkVoXNC5yOSLEkyi39_Q4MgLLg1gnWMP4EzjOMRDSmS_ide0gwIvW6ZWxN67TSh11LW1em9gcYd38TTEToFx8wKHXCDzCEQSt_hpTSyLzpjUDnALfLOsUoiWHTgNBBavsdfAqGT7aR8LDJCp6NXYCq4ww0j6YyksyVyyQzebFopuHBLrDvuhFYfO1Gjjaxzg-yp1UI5GJN0BkqD1Jx5MutVtahq4dXvdP1r9senm08fPS08qIDcaTBotXxGqA7inAamvgHjrmPyIPQ1ZNMpuOR8DBsm1Ii3baT4bDRHayGl6ThNc5CsU3yNtdf8Y04qopOiuPEeArC6xtrjq4bGv6nUOt22WO8wz8CtDbIaCE3HhC5AsQ0CSZce0TEEP-q5wSCzWgWiob5RrxEAoDFBDE0Tb1yyTZIkKZumaZKc5xxTkKIK0i95246sHo0nK-FIkUSV4WH_8GOnE7cWlqTLqCcPn2La1OPEY77HTSuZw1OCKs3qQHCrOUmXhE5ulsGosvA-plNgLsTeTkB4kumMFuOSpLMy782lxTiDZy3qHw9UOtnJ9IRA6GwPki4OYnP48c-d7gzH211EeJvoFEg5P4grAEA0PpIWX7_-gVybeqd-iU284R0QOS5J-sFzlcCZdSRdHDGR9MPACk-7Qre7jBR0Et3YDy6xEUp4cPuRY3iTYEcEeOqeJVpuRIX1biA8qD3qvYqeaiGZtQeX9ur24UmL8bR324m8Ey0knQ-YaAIApFy-mu_t0ROM0-72w-zuA9iu2ggHDKpuBQZbbUIaWTvXWh8p9JrQ65Vw664acb0Jufp59--yNdpXC0KvhbWdj5trYKoGobjsagxVIVQcqBh_GlaGu1Ar6m7jAzbeSkbR4s9GrwzbADOrboPK2Zh-_n7BGPcCf2OqlrjQmw1TNaETHr_1SYQeO8fXkv5B0BGQdIG68YHWMmPR-BmHqgbdQCNk78q010PSRcD1YljbooHWYCO2PhDTWZaSdDYuvCkfUaFhod5yXSM02kAdpmOcGfu8dpJkCM0eH72CR9y2xue7_sn7LLZPYWVRJ3kx5VkC4UkFVvvNxi-ffaUPvr_3DyOEyI7IsJdHbZ1BtiG08HlHKBcmgY_PY_eL6vb2y--XISmOrCZ0nmzLJudZMghjn7FPcJU0QbgTK8VkfCqG0EmvJt62fRJLwu9BEh1I4s00z3Ka9MikqAi9jsXnUgrVbS9XqosD3OfuIuDLaE5P4KVDoXxas2JSwcD5s7v7hVYOty5er9DN7u7jlL5l33TnfDgd6Ac5i2tlHaEzb1n4_rYb36gxHmtTpcWkOgabnYKdjvN_CtjpOD8Gm58T2OKcwJbnBHZyTmCn5wLWJ9bknMCOzwksPRewo_DxIvRGOIc1WKE4DtbicZWzW56zDe6ZfUXNziVJB7DnkqQD2HNJ0gHsuSTpAPZckrQHm59Lkg5gzyVJB7DnkqQD2FfLjH8y2HNZZgSw51LBQu-9FmyltHWCW3gRUkKF8GJ85VaxDX3tNi2h1wO6yyYrcmR9y0Yis3jUXKmFQe60-eYhOlQuNvYbIUM7f9DV6dsuuNqgcrHR0LBOBqu4Nhh6MVgf3HvStH_bDGGBWWi0lPrF_lXTX9p3baTXkXQwNJJ6deDnzP2FgO-xvmPS_RqBFMm-EV4kcAMtszb2qwdNpR8xdt9Kt8503MHXQQcRvgZX-0i6Dw2W6b57R8rl4Xv4G9q1TewMDmWwzmnYhtaVF5fRUzHvW_qMxoZ9Bt1AbA4O22bADP7Exs3lZS82koV7_R0YT0bJKFmJfvZkpJx3bWwyQWckKZdg8FkE2mbSTNMMKeUZm9a8ZBVjdd1klPJJSfOK8YYm2YQNVm0B_E9I6NmlfN78LPd3fTJ06IlrItxj33zfMX_bH_dhW4ykM-ibYZ16UvpFDZpifSSEHZWNrlF66lZbsY1DN8o6JiXWS2FO-67wTnB9XM7jNmJca_S7iFwbn5_kt_dSw2h02KBafbdfTWg2jh3bck7SxSBnf2Ib3LX836Y4GXx8bp0Zxc59uoRkGzZ-yiYr6yYBki6e4_Zgo82wlhz17OMGwnxchH2GBXzCrbtRfa2ZqXounN3p-8Jkh7uLJXNs13lek3T29PDwQPJFkiSEUj-By-VhiyV8vKqF2w5MO_Rsw84WmsdOCa0ea3RMyL7TG0ce_MDvuKnQ2CPO4fhrb-2Kpi9_C3jlSv_t90460UpcLjxV9MIr8TfKfWY-khY-ofXixvve8pDjx0x5uFHu3jDh7H8d9I1q9BvA_8eIof_1DMkbXD_jhKN58yu4fgXXHs-v-PkVPz8ZP_Q4Mr4w-Zf1sCX5gmZp80ZJDFXR1-ZPGmrP0giUtfU6_pOhW813QPqzFem4H_JW_p_ot4nTkGpv1DOToj68OfibvzE7c87Yw53doYrDnQe_mthdDWv7H9igQcUHw3Cv21t8RunV3Kj_r_5c-CfBhEJzILJ-Dcfhzv8L650P4WBQFNMwadFTzXg4WhMs8NfXRm9md_fXQuIAbo3KiUag8W9StmU8DqYTP7pgfI1fvNkzVd8K9cRWO97op0_78zjl_LOLEKfphGbTaVoW5TQtXr3VHB3D6N_BDmdesqNDMZ-ZYRv7iohOXi92LuqrtJ6mU3aBV-NimhVlmebji_VVVqV5wotxMuF1zVhZFwnNkybFnE-SgvILcUUTmibTcZaUGU3HoyltWMrzIi2raUPrCckS3DAhR36CjbRZXYQDD1dFkab5hWQVShtO31Hav_5Tby-lCl8gkPo7-fLCXIWDE1W3siRLpLDOHmQ64SQOz-nZuJw_nM-D4xNIR2-jRdK_dl90Rl79_AmOYNO_AwAA___rMBPl">