<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/63138>63138</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
LibTooling: TypeName::getFullyQualifiedTypeName no longer respecting 'SuppressDefaultTemplateArgs' in PrintingPolicy
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
ansonmiu0214
</td>
</tr>
</table>
<pre>
### Context
The [`clang::TypeName::getFullyQualifiedName` class method](https://clang.llvm.org/doxygen/namespaceclang_1_1TypeName.html#aa956321ff24d3b3d1265b8ee4dc031c0) generates and returns the fully qualified name for the parametrized `type`, based on the parametrized AST context and [`PrintingPolicy`](https://clang.llvm.org/doxygen/structclang_1_1PrintingPolicy.html).
The `PrintingPolicy` is a record that "describes how types, statements, expressions, and declarations should be printed". One of the record fields is [`SuppressDefaultTemplateArgs`](https://clang.llvm.org/doxygen/structclang_1_1PrintingPolicy.html#a198855bf8d8d508ebb5f729616a1380a), which "[attempts] to suppress template arguments that match the default argument for the parameter".
### Problem
When using the Clang-**12** libTooling API, the `getFullyQualifiedTypeName` class method correctly respects the `SuppressDefaultTemplateArgs` flag in the `PrintingPolicy`:
- if we have some type `std::string`,
- the canonical type is resolved to be `std::basic_string<char, std::char_traits<char>, std::allocator<char>>`
- but calling `getFullyQualifiedTypeName` with `SuppressDefaultTemplateArgs` _enabled_ correctly prints `std::basic_string<char>`, because the trailing template arguments match the [defaults](https://en.cppreference.com/w/cpp/string/basic_string)
When using the latest Clang libTooling API, the behavior above is no longer the case - even with `SuppressDefaultTemplateArgs` enabled in the `PrintingPolicy` passed to the `getFullyQualifiedTypeName` class method, invoking this class method on `std::basic_string<char, std::char_traits<char>, std::allocator<char>>` incorrectly returns `std::basic_string<char, std::char_traits<char>, std::allocator<char>>`.
I've traced the regression back to first occurring in the Clang-13 release:
Clang version | `type` argument to `getFullyQualifiedTypeName` | `policy` argument to `getFullyQualifiedTypeName` | output
--- | --- | --- | ---
< 13 | `std::basic_string<char, std::char_traits<char>, std::allocator<char>>` | `SuppressDefaultTemplateArgs: 1` | `std::basic_string<char>`
\>= 13 | `std::basic_string<char, std::char_traits<char>, std::allocator<char>>` | `SuppressDefaultTemplateArgs: 1` | `std::basic_string<char, std::char_traits<char>, std::allocator<char>>`
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy8VlFv2zgS_jX0y8CGRFqy9OAH166BAoe7HBrgHgOKGkm8UqSWpJx6f_2ClJzYTTZpgW4Aw4I05Mw333wzJHdOthpxS7JPJDss-Og7Y7dcO6N7OSY0XS8qU5-3hLLpB3ujPX73JDmQZDf933cIwUGeCMV1S9iOsN39ecB_8x6ntxb9cVTq_N-RK9lIrKMpT0Ao7hz06DtTk-xAaNF5P7iwix4JPUaPK6VO_crYltBjbb6fW9SEHjXv0Q1cYFzzkD6kl5irzveKUMZ5meWMpk1D1zWrWJ3SPKsKxHUtEpaKhNASWtRouUcHXNdg0Y9WO_AdQhMQwx8XyBACQmNsNA7c8h69lX9iDSRP_HkICRG6h4o7rMHol-t2X-9BTATGaBNrd1ZqL3V7Z5QU5-Dk14hw3o7CP7Fw627moly9qNgrgUE64GBRGFuD77gHQmmNTlhZoYPOPELI04Usnecee9Q-vuH3waJz0uj4GpKrQ2Es9-EbuM6MqoYKYQhBsSaUruA_GsE0kac5aCNR1S7gmLj5Og7R8QEbPip_j_2guMedbd0_QxTjaVkUWVY1RV3UWVJgVWXNhpZ5mvOUFQkntAwpPnZSdIEfkn3i3mM_eEeyA3gDbgYNfoYL3LZj5GpitededDHtesrracGP-kIbiLqu3XMr3llTKeyvjf_rUMPopG6jk31IdUnojtBdSqcnKFndG6PCmt3dl5CKn-TwokmfeviHRgVhrEXh1RksugGFdxcfb9cLGsVbkPqy-qXy2e46nSXIBh4ROn5CcKbHKL-w0_l6mizOW6nbqfMum4J3wbXRUnA1bZEuQDXqhHWoUHXrpOJOiofZFduLjttJ4rM9fHjwlkvvLmb2-WYFV8oI7o29srPPAdaMqRo9CK4i7e9x_Sh99xNkPqDmlcL64aoesbvcu8lN0MKsQsFHh5GykGDE94psnxVLsk-zaN1r7Yd6JQLqBi1qgSthekKPj6Exh2HqwYCDHm9g0fINFQcozk9i_hv1VtjxkzQWeGVOsdragDK6RTurwSEsAU-of5bdmdy31AoDd24S1K-2UAAu9cl8m5KU7rbBjP4ofYLU1908nX4fFPtmrn0hdHOKIhSB0ngktPOZAhUX3wLNjbTOgxFitAHPpTjTnEsZWFTIHf4wRiblnNBGX2SzvzqwnyevN-9WcN46PAngVzeb0Q_jfHlaLpfx2yvPGTzbQ8ouQT9EDHOst1qD7SC9WvoTY2ZKJtvHMIePTul35_SbcC3qLatLVvIFbtO8yBO2KYtk0W2ZYKzi9TrDkhd03eQ5y5qNyJKMFmVZlgu5pQllSZ7kySZjSbJap8ValJTRPNs0uOFknWDPpXq6BC2kcyNuc5ayYqF4hcrFGz-lGh8hGuM95rCw27BnWY2tI-tESefdsxcvvcLtv54GcKDtnWv-xXw1jucbQzwH6eatqtBN6O_bqbsYrdrenjit9N1YzQdNADs_loM1_0fhCT3GFB2hx0jBXwEAAP__8PA3jQ">