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

    <tr>
        <th>Summary</th>
        <td>
            [Question] Get the number of template parameters of a un-speciliazed function template declaration
        </td>
    </tr>

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

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

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

<pre>
    Hello LLVM community. Please point me to a different direction if this is not the right place for submitting a help request.

Recently I'm experimenting AST parsing with the clang-C API. Everything worked well so far until I'm starting to process template function arguments, the usual `clang_Cursor_getNumTemplateArguments` doesn't seem to perform what it's expected to do. Here's a min repro:

```c++
//template.hpp
template<typename T, int i, template<typename> class C>
void foo(T t, C<T> c) {
 c.push_back(i);
}
```

```c++
#include <clang-c/Index.h>

#include <iostream>
#include <string>

int main()
{
    // Create translation unit
    CXIndex index = clang_createIndex(0, 1);
    CXTranslationUnit unit = clang_createTranslationUnitFromSourceFile(
        index,
 "template.hpp",
        0,
        nullptr,
        0,
 nullptr);

    // Get cursor
    CXCursor cursor = clang_getTranslationUnitCursor(unit);

    // Traverse
 clang_visitChildren(
        cursor,
        [](CXCursor c, CXCursor parent, CXClientData client_data) {
            CXCursorKind kind = clang_getCursorKind(c);
            CXString name = clang_getCursorSpelling(c);
            if (std::string(clang_getCString(name)) == "foo")
            {
 int num_params = clang_Cursor_getNumArguments(c);
 int num_template_params = clang_Cursor_getNumTemplateArguments(c);
 printf("%s %s %dargs %dtempargs\n",
 clang_getCString(name),
 clang_getCString(clang_getCursorKindSpelling(kind)),
 num_params,
                    num_template_params
 );
                clang_disposeString(name);
                return CXChildVisit_Break;
            }
            
            return CXChildVisit_Recurse;
        },
 nullptr);
}
```

What I expected to print:
```
foo FunctionTemplate 2args 3tempargs
```
Why I think this way: 2 args are the function parameters (`t` and `c`). 3 tempargs are the 3 template parameters `T, i, C`.

What I got:
```
foo FunctionTemplate -1args -1tempargs
```

Would appreciate any reply!
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyUVk2TozYT_jXypWtcWNiADz548frdqXeT2uw4u7m5ZGhAGSERScys8-tTEmD8FSehphgsqZ_up7_UzBheSsQVWXwgi82EtbZSesXNN8XzyUHlx9UnFELB58_ffoJM1XUruT1O4YtAZhAaxaWFGsEqYJDzokCN0kLONWaWKwm8AFtxA9yAVBZshaB5WVloBMsQCqXBtIeaW8tlCQwqFA1o_KNFY6ck2JBg3b2_YobSiiM8ExrXgD8a1LxG6eXWLztomDbu-53byuvJBJPlUwrrL89T-PiG-mgrf0DpV8zhHYUAo6BgGlppueiRjWXag1oFjVYZGgMW60Ywi1C0suPFdNk67YbQ1GtrTcsEkCjwavdpq43S-xLtz22968XXJ6EogFyhkYTGFgxi7bWhLpSu4b1iFrglNDaeZ2Yxd_u5msIn1Og3GNRcgsZGKxKuzz1FoqD7ywj94P66VboldDsQmVZN060PKyRM7bFByWqEnSPlIss9u9sTJPzo3GsMpCT82AG9KZ5DoRShyQ6sE0xJmO78UUKXQOLeEsimTWuq_YFlr4QmnNAlCQcr480ViX_DLOQyE22OQMK0i3pG6PZZ5vhjWp0MvHeaK2M1sno8dLFtrOayvELwKc-4JDRxpvd2D-QAoHM1pBpdyljNpBHMZ42rnvFc-ps3Ebh_k3DTpew-84J-j9AkcK6cnTupk92NuL9Kbj32DcjVoa1W9YtqdYZbLtAROAG6h3cq036VUHqRL5SOe_0T3KzIVojG6kcnT0fO4n7tvP-hhczX0Dnnrqr6jTOyJdorpt1JQhPv8keadpq9oTY4JKcHfOOG27TiItcob_zUG3ZNsWuihCajob4Mhl8Nc82xXxIcpd0wyyDzn_ucWXZZJ2fPgPF_LnN4da8L8uMmoUl2nSsjyIvPZ_BFfgfgpUEhXMI_AOEFEJoYm7uuE677CqHJCPUyLPlOQZeeVLhx-gilvkPQU-GcQ4_MXYnJtt43TLPanJl60VbHdnpt7yA_pO8_AN3252vARnNpC1_xlNCFgeGVM112H06X-0EWqbwolUeeeXDmTnDP4vPqY728ABk9dpOa588dx5wK_n7Mfc57c3JuGmXwhsjfSWm0rZYufV0tfXNVtf-gkb3elTh1_4vFm5V7oF_RFSXewDrIh43n4YXz3d3EzxeXsM-E8ca9lCqUgm0_IgxJBdSnSHjKj3uC36sjPLtJSb5289I7O5JwDRS8MNPoh4zT-OHDhha1y72ERIF1IwVzfcHdjlFA6HIKIQxKTwjhOMucY0RBd-d313YUTO94oVT_jffTzGt-mj1k3qtQrciBNY3GjDthJo9uuBFHQmeTfBXmy3DJJriaxUEYRPEiSSbVahnFES1iGgfxnCUsKWbz-YzOWRAuc5pEOOErGtBwRmkwC2bLeTLNWHGI2LyYhfNsFgZI5gHWjIupEG_1VOlywo1pcRVHQRhPBDugMH44plTiO_hNV9yLzUSvnMzToS0NmQeCG2tGFMut8FP1L26Q5UqSxcbfaS4Gsq0PqEEVd2OhCmDQyifTYMYFZ39iPsb9JJBjJpj2192k1WJVWdsYFx5_qZXcVu1hmqma0K0zqv_31Gj1O2aW0K2nYgjdeqp_BQAA__-61Z_T">