[Cython] Cannot assign type 'set<size_t> &' to 'set<size_t>'

mark florisson markflorisson88 at gmail.com
Mon Jan 16 19:09:47 CET 2012


Dear Dimitri,

Sorry for the delay, many developers are busy with their lives. Thanks
for the report, it think that this was broken in
464923673475879fedc103ef2ee0260ba88d1493, the culprit is
https://github.com/cython/cython/blob/master/Cython/Compiler/ExprNodes.py#L603
, I think it should read 'if dst_type.is_reference and not
self.type.is_reference:'. If you want you could substitute that line
with this line and write a simple test and make a new pull request, we
will merge it.

Cheers,

Mark

On 15 January 2012 18:01, Dimitri Tcaciuc <dtcaciuc at gmail.com> wrote:
> Hi folks,
>
> Since the original question, I've created a pull request with a
> failing test and tried to get some discussion going, but so far no
> answer. I'm a tad discouraged, since obviously there's movement on
> mail list and with pull requests. Is a pull request a proper way to do
> this? I completely understand if you guys don't have enough available
> time to deal with it right now, however at least some acknowledgement
> and feedback would be much appreciated.
>
> Thanks,
>
>
> Dimitri.
>
> On Sun, Dec 18, 2011 at 8:17 PM, Dimitri Tcaciuc <dtcaciuc at gmail.com> wrote:
>> Hello everyone,
>>
>> Here's a small test case I'm trying to compile. I'm trying to pass a
>> STL set reference to a method in a template class.
>>
>> x.pyx:
>>
>>    from libcpp.set cimport set as cpp_set
>>
>>    cdef extern from "x.hh":
>>
>>        cdef cppclass Foo [T]:
>>            Foo()
>>            void set_x(cpp_set[size_t] & x)
>>
>>    cpdef func():
>>        cdef Foo[int] foo
>>
>>        cdef cpp_set[size_t] x
>>        cdef cpp_set[size_t] & xref = x
>>
>>        foo.set_x(xref)
>>
>> x.hh:
>>
>>    #include <set>
>>
>>    template <typename T>
>>    struct Foo {
>>        void set_x(const std::set<size_t> & x) { /* do nothing */ }
>>    };
>>
>> To compile,
>>
>>    bash $ cython --cplus x.pyx
>>
>> Which results in
>>
>>    foo.set_x(xref)
>>                 ^
>> ------------------------------------------------------------
>> x.pyx:15:18: Cannot assign type 'set<size_t> &' to 'set<size_t>'
>>
>>
>> However, if I remove the template parameter from Foo, everything works.
>>
>>
>> y.pyx:
>>
>>    from libcpp.set cimport set as cpp_set
>>
>>    cdef extern from "y.hh":
>>
>>        cdef cppclass Foo:
>>            Foo()
>>            void set_x(cpp_set[size_t] & x)
>>
>>    cpdef func():
>>        cdef Foo foo
>>
>>        cdef cpp_set[size_t] x
>>        cdef cpp_set[size_t] & xref = x
>>
>>        foo.set_x(xref)
>>
>> y.hh:
>>
>>    #include <set>
>>
>>    struct Foo {
>>        void set_x(const std::set<size_t> & x) { /* do nothing */ }
>>    };
>>
>>
>> From what I can tell, the CppClassType instance the CReferenceType is
>> pointing to has the correct name "set<size_t>", however it's a
>> different class instance. The particular failing expression is in
>> `ExprNode.coerce_to`
>>
>>    if not (str(src.type) == str(dst_type) or
>> dst_type.assignable_from(src_type))
>>
>>
>> I wish I could suggest a patch, but unfortunately I'm a complete
>> newbie to Cython internals. Perhaps someone could give a few pointers
>> as to what should be done to fix this?
>>
>> Thanks,
>>
>>
>> Dimitri
> _______________________________________________
> cython-devel mailing list
> cython-devel at python.org
> http://mail.python.org/mailman/listinfo/cython-devel


More information about the cython-devel mailing list