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

    <tr>
        <th>Summary</th>
        <td>
            cindex.py TranslationUnit skips std::string::operator+=
        </td>
    </tr>

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

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

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

<pre>
    I try to find all occurrences of `std::string::operator+=` in my C++ source files using clang's Python cindex. Here is my sample code:
```
#include <iostream>

class A {
public:
  A &operator+=(const int &arg) {
    number += arg;
    return *this;
  }

private:
  int number = 0;
};

int main() {
  std::string str = "test";
  str += "a";

  A obj;
  obj += 3;
}
```

In this example I would like cindex to find `str += "a"` and point to it using it's `Cursor` object. However, it gets skipped. Here is Python code I used:
 ```
from clang.cindex import Cursor, TranslationUnit

translationUnit: TranslationUnit = TranslationUnit.from_source( "main.cpp" )

cursor: Cursor
for cursor in translationUnit.cursor.walk_preorder():
    for token in cursor.get_tokens():
        print( token.spelling, end=" " )
    print()
```

Interestingly, occurrence of `A::operator+=` as ` obj += 3;` was found and printed. Here is output of the script (ignoring `iostream` include that was printed too):
```
class A { public : A & operator += ( const int & arg ) { number += arg ; return * this ; } private : int number = 0 ; } 
public : 
A & operator += ( const int & arg ) { number += arg ; return * this ; } 

const int & arg 
{ number += arg ; return * this ; } 
number += arg 
number 
arg 
arg 
return * this 
* this 
this 
private : 
int number = 0 

int main ( ) { std :: string str = "test" ; str += "a" ; A obj ; obj += 3 ; } 
{ std :: string str = "test" ; str += "a" ; A obj ; obj += 3 ; } 
std :: string str = "test" ; 
std :: string str 
std 
string 
A obj ; 
A obj 

obj 
obj += 3 
obj += 3 
obj 
+= 
+= 


```
As can be seen, only declaration of `std::string str` gets printed, but addition of character "t" on next line gets skipped.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy9Vl1v6zYM_TXOCzHDtZMmefBD2u5ifRgwYNtzIdtMolWRDElum38_UnLij-ReDAO2xLAlUqQOKepIlWnO5St4ewZvYC91A0IpMHXdWYu6RgdmD8lj5nyTFDt6nLdSH2LbtGiFNzbJn5LihUaB1HA6wzML8idwprM1kltFfjpHdlArQdb52sFvZ380GmqaE79S-AUtgnRs7sSpVQi1aZDnyV6SbEfO-yd280LqWnUNQlI8S0OoUJyS4udeHd40l3Owg2T9FAVtVylZX30C6_LHWRT5pjbaeQrFs1ZYgrsdfAD9dHeq0EI0AB5RjLQWfWc1aXf-KN1IlaxfxvBaKz-ExxEcnvLimxxnV1u2vLbDm4eehNQEdwZvtlLUj96SPPfoPH1GkIIyhkEKMVYOOTLVXyMT6l1MignAu-sU3q8aOBWAX3FlX-HTdKoBJd-xL4Br-YVauwFFpSVI2RqOm4ZK39eT9KGYaMBzZx0tIo0khFh7KinziR9I6_rM4w_oHbh32bbYDOV2qUKqNYLVOWyG9ZjFsrfmFOs37THLU2ush35mmuYPK7RTwkuj_9QEbZQDP1MVu_nosEozWcqTvsV9REvN-eBVT-u2pSZ1t5OCj0DIdQ8p4jYWooa35wxHGjXpp1Dvb61FYxvOGBfVqDAB2Ik376jZR29DGX0LMnfHgH9U4doz7DAqdS0qxeRBmULdhM3GMYziGFsNwd2vKU9L6Dz5U2f2OHBWT1m775GUCPVyU8gk-iTV3nTMglxtDGRcLKbzbefZvT8iuNrKljliIw_ahL1GPq5cFNgwUpQ_Ch989x4pH2acr1mAI96CSFnAaxrICi7hDDtkAxPCYj6CnhNumYo8PY0YKu5LltEOhp6RwmxzLroOGlNpGBkF_z266zwxSbdeeyb6d37v2EzkoTOIh9aN2_6AmnRHzXGSBy6fpjqIs5GaNz1EAoipI5aHWN_wXZ4PEd6SaRDvYvlTa7wNZjn53yb6x5P8cPig61txT_Zlc4Ex6U9KapBMof5Q1K92jPu2U8y-s62-c1ALDRWxCaIONKbVGRokDrCBpO_fvzhgZphwqPWswtYV0ZNoGnmxrI_kpvahsPOQRZJr_PJ09mqcnomLpiyabbEVCy-9wrK_mbXnm4OKLdz8onGPbRedVeXR-9axNv9Gz0H6Y1eltTlRR6mPy-en1ho-tqkrneuQzpRvq-W6WC6O5RbXuN9s6v1a4H673mRi2dT4UDVila83YrtQokLlymRF185c4ycEF3xxWL0sZJlneZ4t6b9aPuRFun3YYlM9YpU95FmVL5NlhrTBVMo4UmMPC1sGSFV3cKRU0nk3KImcifARw3TkX3R0hbDlr8LSYeR-P0mrzYdbBAhlCOFviNpO6g">