<div dir="ltr">Dear all,<div><br></div><div>I tried to declare an external c++ class that includes an operator() function in a pxd file. When I then call a class instance, cython generates faulty c++ code. It includes a call to "operator()()", and not a call to the instance object. Here is a minimum working example:</div><div><br></div><div>call_operator.pxd:</div><div>----</div><div><div>cdef extern from "call_operator.hpp" nogil:</div><div>    cdef cppclass OperatorTest:</div><div>        int operator()()</div></div><div>----</div><div><br></div><div>test_call_operator.pyx:</div><div>----</div><div><div>from call_operator cimport OperatorTest</div><div>def test():</div><div>    cdef OperatorTest t</div><div>    t()</div></div><div>----</div><div><br></div><div>Running "cython --cplus test_call_operator.pyx" generates the following code for the test() function:</div><div><br></div><div>---- (relevant part only)</div><div><div>  /* "test_call_operator.pyx":4</div><div> * def test():</div><div> *     cdef OperatorTest t</div><div> *     t()             # <<<<<<<<<<<<<<</div><div> */</div><div>  operator()();  </div><div><span style="font-size:13.1999998092651px">----</span><br></div><div><span style="font-size:13.1999998092651px">As you can see, the code that is generated is a call to "operator()()" and not "t()" as it should be.</span></div><div><br></div></div><div>From what I've been able to work out, the problem seems to be that the call to "t()" is treated as a NameNode in ExprNodes.py and not an AttributeNode. However, I don't know enough about Cython's internals to track where exactly this decision is made.</div><div><br></div><div>Curiously, this bug isn't always triggered in more complex situations. I had a larger pxd file with multiple external declarations where one class operator() was treated correctly, while others weren't. I haven't been able to find out why this was the case.</div><div><br></div><div>Ulrich</div><div><br></div></div>