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

    <tr>
        <th>Summary</th>
        <td>
            Python binding detects parsed function's arguments incorrectly
        </td>
    </tr>

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

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

    <tr>
      <th>Reporter</th>
      <td>
          0x4b6579
      </td>
    </tr>
</table>

<pre>
    Hi everyone,

I'm trying to parse some header files to extract signatures using `clang.cindex` in Python. Sometimes it detects types as names wrongly.

The following code from musl is an example:
```c
ssize_t recvfrom (int, void *__restrict, size_t, int, struct sockaddr *__restrict, socklen_t *__restrict);
```
from: https://git.musl-libc.org/cgit/musl/tree/include/sys/socket.h#n397

And I get `size_t` as the name of the next argument! ->

```c
ssize_t recvfrom(int , void *restrict , int size_t, int , struct sockaddr *restrict , socklen_t *restrict )
```

My code:
```python
import sys
import clang.cindex


header_file = sys.argv[1]

index = clang.cindex.Index.create()
tu = index.parse(header_file)

for cursor in tu.cursor.get_children():
    if cursor.kind == clang.cindex.CursorKind.FUNCTION_DECL:

 print(cursor.result_type.spelling, cursor.spelling, end='(')

 is_first_arg = False
        for arg in cursor.get_arguments():
 if not is_first_arg:
                is_first_arg = True
 else:
                print(', ', end='')

 print(arg.type.spelling, arg.spelling, end='')

 print(')')
```

My command:

```shell
python poc.py musl-1.2.5/include/sys/socket.h
```

The output:
```c
__uint16_t __bswap_16(__uint16_t __bsx)
__uint32_t __bswap_32(__uint32_t __bsx)
__uint64_t __bswap_64(__uint64_t __bsx)
__uint16_t __uint16_identity(__uint16_t __x)
__uint32_t __uint32_identity(__uint32_t __x)
__uint64_t __uint64_identity(__uint64_t __x)
int select(int __nfds, fd_set *restrict __readfds, fd_set *restrict __writefds, fd_set *restrict __exceptfds, struct timeval *restrict __timeout)
int pselect(int __nfds, fd_set *restrict __readfds, fd_set *restrict __writefds, fd_set *restrict __exceptfds, const struct timespec *restrict __timeout, const __sigset_t *restrict __sigmask)
struct cmsghdr * __cmsg_nxthdr(struct msghdr * __mhdr, struct cmsghdr * __cmsg)
int socket(int , int , int )
int socketpair(int , int , int , int[2] )
int shutdown(int , int )
int bind(int , const struct sockaddr * , socklen_t )
int connect(int , const struct sockaddr * , socklen_t )
int listen(int , int )
int accept(int , struct sockaddr *restrict , socklen_t *restrict )
int accept4(int , struct sockaddr *restrict , socklen_t *restrict , int )
int getsockname(int , struct sockaddr *restrict , socklen_t *restrict )
int getpeername(int , struct sockaddr *restrict , socklen_t *restrict )
ssize_t send(int , const void * , int size_t, int )
ssize_t recv(int , void * , int size_t, int )
ssize_t sendto(int , const void * , int size_t, int , const struct sockaddr * , socklen_t )
ssize_t recvfrom(int , void *restrict , int size_t, int , struct sockaddr *restrict , socklen_t *restrict )
ssize_t sendmsg(int , const struct msghdr * , int )
ssize_t recvmsg(int , struct msghdr * , int )
int getsockopt(int , int , int , void *restrict , socklen_t *restrict )
int setsockopt(int , int , int , const void * , socklen_t )
int sockatmark(int )
```

The result of clang looks to be fine when I try this command:
```shell
clang -Xclang -ast-dump=json -fsyntax-only include/sys/socket.h
```

The issue is in the [Python binding](https://github.com/llvm/llvm-project/tree/main/clang/bindings/python) probably.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMWE1v4zYT_jX0hbAgU7YcH3xI4jXe4G23BboFehNoaiRxQ5ECOUrs_vqClOzIH0qz2wXaIKAozgdnHg2HM-bOyVIDrMnigSw2E95iZew63s936WK5muxMflj_T1J4AXswGgh7JPGGxPfd-ETYsqZoD1KXFA1tuHVAnamBVsBzsLSQCpwnwR4tF0j9fhxbC462zouRNBaK6zISUuewJ2lMpaa_HrAyOqK_mRpQ1uCoRJoDgkBH8dCAo9xRzT3l1RpdqkM0tOxLBbQwSplXv4cwOdDCmprWrVNUOso1hT2vGwUk6UVIGnf_ont3Tv4JGVIL4iXIEnYnNRL2SF-MzClh91lmwaGVIqx2_H7Wszm0rXfZiGee5_aGhBHPCnSGl6QVSR4urOpevSEkuacVYuO86WxL2LaUGHnPpkruRGRsSdhWlBIJ2_plwrZoAQjbSi1Um_uZOzg_GvEMGFWEJTpZLYcI3uucPtES0H-h3rU09qhjBQF5aopuDnuk3JZtDd7vGZ2S5NNQ1d8h2wFLh8geoaA9nOfg0hF0z6TOwB1QVjeB7cafDyFWrmOiCfHYLcq6MRapR3D4fhbFQ-_D2J2HzJ8HSpKNl464LV_I4mFGFpsha9AQmIYqo6cwCgscgbC7kyPYBt6OKZxAwu4G27153EWQsVS01hnrzxm2UfcSlYCZqKTKLehe_REFSimVRS8VPUud-x2vDHwM9P9LnUfb3z8_fnn65XO2-fT40xuanbbGhvNx1-uz4FqFmT_UkWtAKalL__168nAJdO43Zstg4PLCMypdVkjrMOO2DJhsuXLw5oP_8-57stR04Pgxet2l57Kg2uCZ5jNYhn9X23-x7XF38IaMCR4BCS490v4xcPbK06MEt2V0BZxfHEFtVFFPGjKMno-65l7j_c0j7ipQqlvrzgxtjIiaQ8i801nEosV7eWh8a5_RTYtNi6MZO8taqXGWZkizbOdeeZPNUsLuLtb3Jx87QsIGAgk7CZzWLwXS-UAgnZ8ETuuXAv3W_VTmoFHi4dKyEbv66ZVUTx4xrp9eSfXkN6mQXEGBv3ZCGs4yXeTOB06RZw7O06e_pHj-Hv3VSoT3GGAvoMGeo0_i_op_4eqC06-aFs9Mbf49W4XRDocWuwbEmMlH9ixzsnSA2aVqJ8uau-eTc71eUbuy6m4zmmX-LdN7rHJL2F3PcsZRB9IJyGvx8w8dztngvj1_XnE2XNpR7q7OWTwwsthcCFct5uZVX4kOeHZS5wP6GbjDO_3qLh_oEEbrt2D4bjVKOoR3jeXCx8GA4x8WH2865z9A6Q2DS0DP7cu0H2t1CdgA2B-r-FgQOrgRE8eScLQUXF1XlTcqyo-KexvQfLsV3xF7_4k6eOh3SBe3z9Igr7yL_LmKDwgPotU046lpBJIPRKz7iPIbH3kkWQScseb2-aTuvYrJly1dhevbpVAvU2XMc2iKd0ALqYG-VqDpk2-kKVbSXddYN6qrTtX0j_7JHU7ztm5IsvnqjKbTwh008v3UaHWg31lvSedaP4ZOoQJKFg9dYx6yty8vFxvfbFw2o1W7i4SP561SL8fHtLHma8jWx2605lL7TtV7QNi21-nt69sttqKNNTu-U4dokq-TfJWs-ATWsyVbJOlivlxOqnWxEgXMklXKWTpLk4UocsGSxRJgfrcDkU_kmsVsHq_iZMZms9kymjPYpTxP43iRw3IXk3kMNZcq8mb69nkSHF_P4mW8Wk4U34Fy4ScSxjS8drAQ5u-9iV0H33Zt6cg89jeJe1ODEhWszyE7_YoRWrWcFq0WKL2zS3fqoj3iwlgLAtVh0lq1_maMg5Eey96LlzX7KwAA__-OIKrB">