<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/73389>73389</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[question] How to figure out if template argument is being passed to "Visit" callback?
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
harsszegi
</td>
</tr>
</table>
<pre>
Hello,
I have a strange issue. I have something like this:
```
template<typename T, int S>
class Test
{
public:
Test(T t) : t_{t} {}
private:
T t_;
};
static Test<int,2> aa{4};
static Test<double,3> bb{6.0};
void functionX(Test<int,2> a = aa, Test<double,3> b = bb);
void functionZ(Test<int,2> a, Test<double,3> b);
```
I am using libclang to parse the AST and using visitors obviously the use the AST.
I have issue with the "Test<int,2> a = aa".
It does the following (when I visit):
* calls VisitVarDecl
* calls VisitTemplateSpecializationTypeLoc, which calls VisitTemplateName, this will call back to my visitor code with the "Test"
template ref. so far so good
* Then it wants to visit the template arguments, which is understandable
* It calls VisitTemplateArgumentLoc to visit the template arguments, first it calls VisitBuiltinTypeLoc (because of "int"),
but that doesn't visit because type filtering in VisitBuiltinTypeLoc
* The second argument will be passed as TemplateArgument::Expression, which will be an integral literal (2).
So my "visitor" code first received a templateref, then an integer literal ("2")
How can I figure out that the literal "2" is actually "belonging" to the previously received templateref, e.g. it's not a "default argument", but the argument of the template.
Thanks,
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyMVc2OqzgTfRpnU7qImNAkiyzy09Ft6erbdNT6NJuRMQV42rEZ2yST-_SjMuRvOnc0UgvoUHVO1anjQnivGoO4ZPma5duJ6ENr3bIVzvuf2KhJaavz8jtqbRnfsHTL0tVwfYNWHBEE-OCEaRCU9z0mMP7u7QFDq0wDWn0ihFZ5lq3uAdhLOv7FfwMeOi0CsmwTzh0acUDYM74BZQK8s-x1CJNaeA979GFEKdbDQ9eXWskrBwwxfL6HwPgCWLaC8Dsr1oEVW6CsYjsmOnWMvLdMiszWF4Lt7TlefRBByQE_2ygTGN9wlr2CEKxYz-4THkMr25caGd9kFF2WrFi_JOlXgqNVFdS9kUFZ83_q4SsVsGxLhHzzC_QYUJaML67oD7i_Pcf9NeA90tMJXnwhDtD7YfKl1MI0ECx0wnmyAcLqfQ_CVGPMUXkVrPNgy6OyvdfnGNTfgpMHv0WXwUmFNr5nnP-bOPySHKCy6GNKbbW2J-JmfH5q0cDbUEVs8NGifAVSaO3hgwI-hNui1E_f7Uf7vncoldDqpyCR9-cOf1hJop5aJdtnGf8TBxI5HhE4Ka1jEJRCfpJwh_NFI5C2etI6548HCBzWCXgLtXB0a6ytbiXvqWEV4CRM8IQfwSPgFUC4pj-gCf5Wt_LQmwqdD8JUgmxxRXwLz7pajRg_rPwvLLVyPlBdd1DrXumgLhrStEqUgpxha-o-TpzT1C6bqeyJQwzDNowXYSS-JNJmgVrpgI4MoMwzpgexwKO0prpWO0yoROiE91iBoGX02DKZKFu9_tU59F5Zc1PxkisMbTVsnNCgVUC6Mz6nXpJ7_73H8TPORwcwzgcTDHI5lKiOVMRVVYf14CU0VxZ09ySMk2ZRtjum7_YEUtBRqFXTOwR7kZJmdkuPueQGIUMvtI7VlaitaZRp6F2wMaVzeDnP1zL_USQmTQJ07AoPxgY6tpxXWIteh6vesdQNDJO9mYYscO-mB9n2rTCfZKtJtcyqRbYQE1xOizRd8LTI80m7xKzis_ksn4r5PJ_n06JYLF5mVTYv0hRnLzhRS57ybDrl-TTLF9M8kWUxe6nyxSzPueRFzmYpHoTSidbHQ2JdM4mbaVlk2Xwx0aJE7eNHlXODp2FtUS_5duKWlPOt7BvPZqlWPvgbSlBBx6_xnz16WiEs3wJNJ9j70aj660GisZRIvh69GSwp-jHsNh6PFm0Vlu0mvdPLNoQufpT5jvFdo0Lbl4m0B8Z3VM54-9Y5-wfKwPguNuEZ38Um_w4AAP__-02auQ">