Commit 1befcd38 authored by Stefan Behnel's avatar Stefan Behnel

improve error message when trying to take address of Python variable/expression (see #1768)

parent c95ca9f2
......@@ -9990,7 +9990,10 @@ class AmpersandNode(CUnopNode):
self.error("Taking address of non-lvalue (type %s)" % argtype)
return self
if argtype.is_pyobject:
self.error("Cannot take address of Python variable")
self.error("Cannot take address of Python %s" % (
"variable '%s'" % self.operand.name if self.operand.is_name else
"object attribute '%s'" % self.operand.attribute if self.operand.is_attribute else
"object"))
return self
if not argtype.is_cpp_class or not self.type:
self.type = PyrexTypes.c_ptr_type(argtype)
......
# mode: error
cdef class Ext:
cdef int a
cdef object o
def f(int a):
cdef Ext e = Ext()
x = &a # ok
cdef object o = &a # pointer != object
po1 = &o # pointer to Python variable
po2 = &o.xyz # pointer to Python expression
po3 = &e.o # pointer to Python object
po4 = &e.a # ok (C attribute)
po5 = &(o + 1) # pointer to non-lvalue Python expression
po6 = &(a + 1) # pointer to non-lvalue C expression
_ERRORS="""
11:20: Cannot convert 'int *' to Python object
13:10: Cannot take address of Python variable 'o'
14:10: Cannot take address of Python object attribute 'xyz'
15:10: Cannot take address of Python object attribute 'o'
18:10: Taking address of non-lvalue (type Python object)
19:10: Taking address of non-lvalue (type long)
"""
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment