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

    <tr>
        <th>Summary</th>
        <td>
            libclang python bindings give different result for template overloading
        </td>
    </tr>

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

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

    <tr>
      <th>Reporter</th>
      <td>
          wouter-heerwegh
      </td>
    </tr>
</table>

<pre>
    I'm trying to parse some C++ code with the clang python bindings, but I seem to get some weird behaviour when a function template is overloaded in different ways.

For example:
```python
import clang.cindex

def walk(node, t):

    print(f'{"    "*t} name: {node.spelling or node.displayname}, type: {node.type.spelling}, kind {node.kind}' )
 if(node.referenced):
        print(f"{"    "*t} Has a definition: {node.referenced.location.line}")
    for c in node.get_children():
 walk(c, t + 1)

s = """
    #include "stdio.h"

 template <class T>
    void foo(T bar)
    {
        bar++;
 }

    int main(int argv, char** argc){
        foo(10);
 }
"""

index = clang.cindex.Index.create()
tu = index.parse('tmp.cpp', unsaved_files=[('tmp.cpp', s)])
print('Translation unit:', tu.spelling)

walk(tu.cursor, 0)

```

This returns
```
name: foo, type: void, kind CursorKind.CALL_EXPR
Has a definition: 5
     name: foo, type: void (*)(int), kind CursorKind.UNEXPOSED_EXPR
     Has a definition: 5
         name: foo, type: void (int), kind CursorKind.DECL_REF_EXPR
         Has a definition: 5
```

 This is indeed what I would expect. However if the foo function is called `foo<int>(10)`, the result changes to
```
name: , type: void, kind CursorKind.UNEXPOSED_EXPR
    name: , type: <overloaded function type>, kind CursorKind.DECL_REF_EXPR
    Has a definition: 11
 name: foo, type: , kind CursorKind.OVERLOADED_DECL_REF
 Has a definition: 11
```

Is there a big difference between overloading the function with a template argument vs not?
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyUVl-P2ygQ_zTkZVTLwck6echDNn_U1a2uVW_v1LcVhrHNFYMFOO5--xPY6yTbdNuLLGLD8JuZ38wwMOdkpRE3ZHlPlvsZ63xt7KY3nUf7oUa0PVb1rDDiZfNAaN6Aty9SV-ANtMw6BGcahB2h94TeAzcCoZe-Bl8jcMV0Be2Lr42GQmohdeUI3UHReXgAh9gEnAr9gNKjtAIKrNlJms5CX6MGBmWnuZdGg8emVcwjSAfmhFYZJlCA1CBkWaJF7aFnLy4h6Z6k22E8Ggv4nTWtQpKNc-QuHZ7BtmFSNq2xfjA64VIL_H6JI7CEnqlvhK60ERjc8ISuz5hxBABordSe0FVJaE7ye0JpmCWUErr1JN-DZk2wBUh-H6AS16JSgVRjIU4I6VrFXqJcvo-qXtqrLeF72jfKfJNaTALhI87nEKwcjJPlaH1iMfLFUVz6AOPvwgN604OPzAEDgaXUMoTm0rQzdKIMZ2E5UVIPntCzMQBQGgs8xC9urNA_81oqYVETuroybGSeRy4gpNp8QhpGByTbDzbGZ1JCaCY1V53AsOq8kCapJ4lRbkotku24Ys7BE8kOZ5CTkQJKYwhdPUHB7JUbgaIr_qJAKAiSva4E79_kidQeGiaDr-GV2eoU3ON12L0ldBumeND0Fn8wZJ5Gin7UcM3BmN0hnyNFlwmePMSRW2QeR86juO-i7CAUCz2u5r5pE962IbPpDjrt2AnFcykVOpLtwyFyQ8wF2OV-An9NL0LzJ8u0UzFJoNPSh4gPm3x3zu_rSI-54LuEd9YZG6TTNzJThV9OPtXSgUXfWe1uir0WZuT3XHQh-FOB7aLOP6QWyW77-Ph8-Pr5y7D7VlEsLwL3DjpENrbBiZgM8eVHhX__efj6-dNfh_2F1gj9K9W_of7nWveH3ePzl8PxrdJfKL4ZAogxCI8WiAL6moVW0JtOCcDvLXKfwEfT4wktyDK2kdKYcw-QDjhTCgWQuzS4ku2C5dlhKoi7NLpXI1h0nfKhoHSFDrx5N-i_E_GfBeAWBsl2F03q3MTi8uF_EH2L4_l8XP9JVG_Bf_rn8OXx03Z_2D-_ahpB3tNwM4wPLhBsERgUspraL0co0PeIeurP8a4Qgvjqf7wdsPOBy2zVNaFznxxo40l2nIlNJtbZms1wM89TerdY0Pl6Vm9Smq15zvgyFYsyY4KtVozlKU8Xi6IoWDGTG5rSbE7nyzldZFme0MV8nq1XyHG9nhfFmixSbJhUiVKnJjG2mknnOtzky-V6PVOsQOXiVYhSjT3ExXCQLvczuwl7PhRd5cgiVdJ5d0bx0ivcKFncvPJAJU94cUcZ8zJ0v4mGC75mnVWb2vvWxdPwSOixkr7uioSbhtBj0Dr-fWit-Re5J_QYbXWEHqMv_wUAAP__oH_tdA">