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

    <tr>
        <th>Summary</th>
        <td>
            `-ast-dump` provides incomplete content of template type alias declaration
        </td>
    </tr>

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

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

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

<pre>
    Consider this simple example:

```cpp
template<class C> struct A { using type = C; };
template<class C> using t = typename A<C>::type;
```

With `-ast-dump` or `-ast-dump=json`, the type `TypeAliasDecl` does not contain information of each part of the alias value:

```console
$ clang -fsyntax-only -Xclang -ast-dump test.cpp
TranslationUnitDecl 0x557305bbed48 <<invalid sloc>> <invalid sloc>
|-TypedefDecl 0x557305bbf5b0 <<invalid sloc>> <invalid sloc> implicit __int128_t '__int128'
| `-BuiltinType 0x557305bbf310 '__int128'
|-TypedefDecl 0x557305bbf620 <<invalid sloc>> <invalid sloc> implicit __uint128_t 'unsigned __int128'
| `-BuiltinType 0x557305bbf330 'unsigned __int128'
|-TypedefDecl 0x557305bbf998 <<invalid sloc>> <invalid sloc> implicit __NSConstantString '__NSConstantString_tag'
| `-RecordType 0x557305bbf710 '__NSConstantString_tag'
|   `-CXXRecord 0x557305bbf678 '__NSConstantString_tag'
|-TypedefDecl 0x557305bbfa30 <<invalid sloc>> <invalid sloc> implicit __builtin_ms_va_list 'char *'
| `-PointerType 0x557305bbf9f0 'char *'
|   `-BuiltinType 0x557305bbedf0 'char'
|-TypedefDecl 0x557305c06128 <<invalid sloc>> <invalid sloc> implicit __builtin_va_list '__va_list_tag[1]'
| `-ConstantArrayType 0x557305c060d0 '__va_list_tag[1]' 1 
|   `-RecordType 0x557305bbfb20 '__va_list_tag'
|     `-CXXRecord 0x557305bbfa88 '__va_list_tag'
|-ClassTemplateDecl 0x557305c062d0 <test.cpp:1:1, col:46> col:26 A
| |-TemplateTypeParmDecl 0x557305c06180 <col:10, col:16> col:16 referenced class depth 0 index 0 C
| `-CXXRecordDecl 0x557305c06240 <col:19, col:46> col:26 struct A definition
|   |-DefinitionData empty aggregate standard_layout trivially_copyable pod trivial literal has_constexpr_non_copy_move_ctor can_const_default_init
|   | |-DefaultConstructor exists trivial constexpr needs_implicit defaulted_is_constexpr
|   | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
|   | |-MoveConstructor exists simple trivial needs_implicit
|   | |-CopyAssignment simple trivial has_const_param needs_implicit implicit_has_const_param
|   | |-MoveAssignment exists simple trivial needs_implicit
|   | `-Destructor simple irrelevant trivial needs_implicit
|   |-CXXRecordDecl 0x557305c06520 <col:19, col:26> col:26 implicit struct A
|   `-TypeAliasDecl 0x557305c065c0 <col:30, col:43> col:36 type 'C'
|     `-TemplateTypeParmType 0x557305c06200 'C' dependent depth 0 index 0
|       `-TemplateTypeParm 0x557305c06180 'C'
`-TypeAliasTemplateDecl 0x557305c06880 <line:2:1, col:44> col:19 t
 |-TemplateTypeParmDecl 0x557305c06638 <col:10, col:16> col:16 referenced class depth 0 index 0 C
  `-TypeAliasDecl 0x557305c06820 <col:19, col:44> col:25 t 'typename A<C>::type'
    `-DependentNameType 0x557305c067b0 'typename A<C>::type' dependent
```

```json
{
 ....
          "name": "t",
          "type": {
 "qualType": "typename A<C>::type"
          },
          "inner": [
            {
              "id": "0x55a7efb20170",
 "kind": "DependentNameType",
              "type": {
 "qualType": "typename A<C>::type"
              },
 "isDependent": true,
              "isInstantiationDependent": true
            }
          ]
        }
```

The `inner` part, which should refer to `A`, `C` and `type`, is missing.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0WE-T2j4S_TTm0gUlZGzDgQNjflO1h02lNrO1ublkqwFlZckryWT49lvyvzEGZpKpX1JJsCX169evpZZkZq04KsRtED0F0X7GanfSZvtDK-ZOTFUaJapZrvllm2plBUcD7iQsWFFWEgFfmf8Nwl1A9gHp_49J-7eoqrbFYVlJ5jAI00IyayENwr_AOlMXDnYQJE9QW6GO4C4VQhDu_YAnCJJ9ED69B9FZNSbeVrESYReEqe_1tMKdbx5QBmpjvv8R7gRBTObMujmvyyqICWhz3RTuf1itvCVNwZ2woxqTl0uFOymY3WMhvSXXaEFpB4VWjgkFQh20KZkTWoE-ALLiBBUzzr94JOat4cxk_VhJrayW2LXSFRSSqSPMD_aiHHudayUvMP_etfakwaF1iyELL4YpKxse_1bCeb5AXqMoCUmU58hXawjCNAhToc5MCg5W6qLR8S-409pySdK5V4DjYYJ3iHLyO3jgp5QohIMsE8ot6TpzENCkfwtoMrhsUvNUC-mE8t7HbsMleWT2iGlMP820HlOtVbOcOPw255B8aP-I_GbzW2kbk__yza9qx5T75oxfSI1u09bMseNNIP_CQhs-jSPptf8QAxqU9Pv3FugqG8n610AeKcLCT6czb_OTlTY7s0wK2-S1ODEDAd3dqPBVC-XQTGXYHMhDM3hnHiB_M_ww0ILES_rp1PeBjqLM-pdG5-hpGUT7m4j7jOyMYZcr-gWJCSfvAMESpjLcn0U5vQNzreE704et1-9az1O_fbx028lUUsqbuTMUznC3bP7RFAotg3C3ir2S7TONYTeSxyeqg_UhfWWmvMnYuoFvzZfkDXY5gl3GYPCABlWBHNrdjmPlTkBAKI6vQCCdpKVX4iae1djh5mEcw17M8SCU8HvEVbKSdL4fevbMMcCychdgx6PBI3MIflpwZngm2UXXDpwRZ8GkvGSFri4slwiV5n0zSOHQMAknZjO_uzl8rUymtGqGZ6U-Y1Y4baBgqh2QcTywWrrMs5iQ6wn6_maK-mi0AXwV1tnB6eAIFCK32bAgOmjkmRjRueck1dVl7KE7CfUehnCyihlWTv30D9lk3D1P_9RnvBPLxOG1g0eMd81Br0Tl_jDhkaNP8Y3JfI9TcYUxKPHMlPs1mMfLIaIPlgO9Xg5D_P26mFauq1PflYdi5CEcrfBV-OYhjLvjI03Su5VtWkemlZYS0hv70oCKe8UnReIa9j7wTXG6YjQO9FHFXLclTQrlT690Ui1Xo7K2gS5Rv1Qq43D9t5bKD_K2fjQzxiHQCJqt8r2rRi9er_i-T88XVuI0j0lOPsZ7y_A7l5ihsbmmdJnvbj2wWCwWb6y62UCpdxlQnzL_5vwjTe-Ma3m04wbMgNL_1Uy-jPrakQ8DoTfQyf6-Q6EUmh41epqOgBGNqz_elL-x8UKzBP2BYpmQq_ACSv8r1GjsTZruq_GHFblRxUdkB24drDM1PuYm7D_aM5pornp3je8Iur_JQzRpGsbcnYAvp-Y63KYuJs0N16-inydRnMCedC15u1jBaT9y112mg5ik3oAp7p8bZdoeYaEU1l_xFzO-Dfkm3LAZbpfxJorIJo7I7LTNl6s8PxDOooSHOV9FyFfLPCkKRmJ2CA8zsaWEhmRDQ0qj1ZIsMIn4chVHDHOyzjdhsCJYMiEXUp7LhTbHmbC2xm2c0NV6JlmO0jYfSChV-BOaTq9ltJ-ZrbeZ5_XRBiviT5v2DcUJJ3E7_a5QGX0WHC0IVWi_uzlsPhT4-q0P0H_maPeH9ssAx0Iy0yRzVhu5PTlXWT-N6HNAn4_Cnep8UegyoM_eefczr4z-gYUL6HND2Qb0uQnp_wEAAP__67pXHA">