<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/148610>148610</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[clang] Compiler fails to detect infinite recursion in `A<T, T>`-style nested templates
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
GitSparTV
</td>
</tr>
</table>
<pre>
```cpp
template <typename T, typename U = T>
class A {};
template <typename T>
void RecursiveFunction(T t) {
RecursiveFunction(A<T>());
}
int main() { RecursiveFunction(42); }
```
> Demo: https://godbolt.org/z/jbTWh1Kej
Compiler is able to detect recursion in cases like $\text{A<...A\<T\>...>}$, but not in $\text{A<...A\<T\>..., ...A\<T\>...>}$.
In other words this is what happens in the example: $T_0 = \texttt{B}, \quad T_{n+1} = \texttt{A<}T_n,\ T_n\texttt{>}$
All major compilers don't generate any information, just eating RAM and stack space.
Another example where the generated template can be examined: https://godbolt.org/z/MKdcqbqjW
Here you can see `Add` function is instantiated with:
`unique_ptr<D, D>` -> `unique_ptr<unique_ptr<D, D>, unique_ptr<D, D>>` -> `unique_ptr<unique_ptr<unique_ptr<D, D>, unique_ptr<D, D>>, unique_ptr<unique_ptr<D, D>, unique_ptr<D, D>>>` -> and so on
This bug was found when using real `std::unique_ptr`, since it has 2 parameters both of which are dependent on `T`, current recursion detection doesn't work.
Real example: https://godbolt.org/z/6TK94576j
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJycVU1v4zYQ_TXjyyCCRH3ZBx1kOW6LYC-p2j0GlDS26FCkQlLxpr--oORN3HTTBgsYkCxy3sx78zjk1oqjIiog3UK6W_HJ9doUvwj3-8hN_eeq0d1LAVm4_NpxhLB0NIySO0KIK_cykuIDYQ2swtd_fyDEO6whvoWwbCW3FkuEfAv5DuIthOXHMHPIsxYd3lM7GSueaT-p1gmtgK1rdMA2M1RYIuIPN5UQVzMQWwPb-N-SM98tmYVyOHChlnUP9kOYhC2heAn8rsICAvEt7mjQEJfYOzdaiEtge2D7o-4aLV2gzRHY_i9g-1NTf-2jOzotoZUeRiHJoLDIG0noNHbkqHVoljq0QqGw5ZYsSvFICCyBtHL0zUG-9fyCICghrWam_nEbBIGnnO_8VlZhMzlU2nmczwWzCv8TNICw_E2hdj0ZPGvTWXS9sJ7EuecOez6OpKxP6HpC-saHUZKXB1hSP4SzJS51OF_J7AZW-W9PE--wfoB8q4BtI8h3_9rt64Z8Vz8oYBWkFfq3q_U38rPGpZQ48JM22F7Uttj5tuYOj6TIeOdx9YJCHbQZ-NLzCk-TdUjcCXXE-_ILctWhdbx9RDvyloILulpkuJDEc0-GZtrfsTt89XfLFTaLIEJR9xnDfLnr2qfm6fR1SferR3_R0wxliRCysOw6yEI8XPzq2yCUdVw5Mac_C9f7DLNxJyWeJnoYnYG4mkXfeb2yEG-8j9_v-GA7q_CDlc9i_Qzw-8Wfwbiqb26oRq0WaWtv4WY64plbPOhJdb6ZCifrHWCIS8_IOt82iMurFFnoM1ihWkLh7W-R4cgNH8h5tzXa9agPeO5F2yM3hB2NpDpSDrXyqPUFo52M8V_fDv8yDeY3TXZx7Vmbx4v97n1ZVwfs_-yU1XebJM2z06or4m4Tb_iKiihPWbJhcZKs-iIMmzzmUZqu23zN1xml4ZooWxM_dPG6O6xEwUKWhnmURBFLkyRIm2adbKKmzQ5NyCMOSUgDFzKQ8nnwuVfC2omKKFlnUbiSvCFp53uGsVZydQTG_JVjCh9w00xHC0kohXX2DcIJJ-fLaYlId_g6Ow9cSHs1OYU6CCUc_XOE-oMyjzNWLXdLFt5Y9yIJFdnrU2pXk5HFOyGF66cmaPUAbO9rujxuRqNP1Dpg-5mjBba_0Hwu2N8BAAD__2ciQJo">