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

    <tr>
        <th>Summary</th>
        <td>
            Support DW_TAG_template_alias
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            debuginfo
      </td>
    </tr>

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

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

<pre>
    While experimenting with `-gsimple-template-names` our debugger folks discovered the following interesting case.

```
template<typename T, typename U>
struct X {
  T m1;
  U m2;
};
template<typename V>
using Y = X<V, int>;
Y<int> y = {1, 2};
```
produces (edited for size):
```
0x0000001e:   DW_TAG_variable
                DW_AT_name      ("y")
                DW_AT_type      (0x00000029 "Y<int>")

0x00000029:   DW_TAG_typedef
                DW_AT_type      (0x00000031 "X<int, int>")
                DW_AT_name      ("Y<int>")

0x00000031:   DW_TAG_structure_type
                DW_AT_name      ("X") // without -gsimple-template-names, this is "X<int,int>"

0x00000037:     DW_TAG_template_type_parameter
                  DW_AT_type    (0x00000056 "int")
                  DW_AT_name    ("T")

0x0000003d:     DW_TAG_template_type_parameter
                  DW_AT_type    (0x00000056 "int")
                  DW_AT_name    ("U")

0x00000043:     DW_TAG_member
                  DW_AT_name    ("m1")
                  DW_AT_type    (0x00000056 "int")

0x0000004c:     DW_TAG_member
                  DW_AT_name    ("m2")
                  DW_AT_type    (0x00000056 "int")
```
The only difference with/without `-gsimple-template-names` is as noted.  I'm a little surprised to see the typedef's DW_AT_type have a name with template parameters in it rather than just "X" but I guess llvm-dwarfdump does the reconstruction?

More to the point, in both cases we see DW_TAG_typedef with name `Y<int>` when it really seems like it ought to be DW_TAG_template_alias with name `Y`.  The alias could then have template parameters, and the name simplification would work like expected.

I don't see any support in clang/llvm at all for DW_TAG_template_alias, which is mildly surprising as it goes back to DWARF v4.  I guess we'd still have to emit DW_TAG_typedef for v2/v3.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzNlk1zozgQhn8NvnTZhcGYcOCQGY-3ctjLrjPJnFICGtBYIEoS9mR__bYE_lwnk63dw7gcOwi5--lX_UEmi9f0qeYCAX90qHiDreFtBXtuavCW_rTSvOkETg3SFzM4bVmDmu6A7BUUmPVVhQpKKbYaCq5zuUOFBZga7aKQe2uOt4ZWtTOdM40zz195_v34ufTHt7s8ePLCz-a1Q-sPNl7wGY5Xj174ZdirjepzA8_gxZ-GFYANNHMvPF4-QhMcL714dfz_lp-vR8u9tqzfwAtX8ExbvloCCsNuOFj4RuvDEry6jUQxt_uCcz9X4XVKFn2OGrzgDgtuSKtSKtD8L_SCxAtvi-L_8N1rTrgUFKyeXjb3v73smOIsE3gI9vJFm-43LzYwz0_InRcEr_Rn3byz34ox7D84DRKCDU7Rntu4xHMBnPCsqQLLf-ctnFtvz6O3k-o_Bb8I9CO04fyCdkimXuEI9UFPz4MDgl7T21WO7A28VTk2kWuugevLME-wt0jjgfSk7GjUob50TJFtKrHb0G9rHS0thAN4W92bUW_ekbX41WAf34ZdhFewDTbZz9gujFO3-QDPB8O5gsv_M1zwf8Jd9qQNtXjZildq-2VJ7b3N0WU_VcGhCN6fIFQCTEMrqQfOAB68IG6AgeDG0DzSveoU13aUSNCIbqIcGkoQ6zN0qNkO6ZeuhbvJdfAFx2SjgmuBG1CM7Cgyxlr43msDYwVDRrgPUPWoNQixa6bFnqmy6JsOCknt2rpXmMt2aBNctl64Pj-036VCy2o3dvLYuyCTBGSHnoY9ukguu-NA7NhJlLO-RQrtaxyokQkSmn7cEB3fol2UfVUb6zHDf1QaE5ykvbK89Elme2rD3Vz2wg3qdhDwhmg2BNYO09zZcWfJS54zqwDsnYm9VNuByj5E5PY4z4V5IAFbOjLjgmctxdF3nVTGqpML1laUMVZyYIbQhJuHNwOyOPua57VNnYaLwmoy5Imd1hQTyVLZ08pYvrXSrJ7u_1jDbmHzazzcPc3ZuAB6GCFXQ-ASsKFfXp2LxdhR9q934WxSpGGRhAmbGE7Zmf45RnATc9IrkdbGdNqOczcWKjqJPpvlshljHb-m9DjwnSSjS651b-fDOlosg8WkTpdJEEeJXybhYn7H4mQZlXGBd4wVd1Hsz4uJYBkKnXrRJ0pg9yjG21Laio1WE54GfhD4YZDQRxLGs6j0F1kSRIGfhFlRLL2Fjw3jYmY5ZlJVE5U6JLKj6abg2ujTTaY1r1rEg7t9JhjfchzdsZ4qXqWdrGSUTFwsqQvkb2bYAfg">