Commit 7d69ae07 authored by da-woods's avatar da-woods Committed by Stefan Behnel

Don't crash when probing type of cimported module (GH-4001)

Closes https://github.com/cython/cython/issues/4000
parent 921cd966
...@@ -6049,7 +6049,7 @@ class PyMethodCallNode(SimpleCallNode): ...@@ -6049,7 +6049,7 @@ class PyMethodCallNode(SimpleCallNode):
# not an attribute itself, but might have been assigned from one (e.g. bound method) # not an attribute itself, but might have been assigned from one (e.g. bound method)
for assignment in self.function.cf_state: for assignment in self.function.cf_state:
value = assignment.rhs value = assignment.rhs
if value and value.is_attribute and value.obj.type.is_pyobject: if value and value.is_attribute and value.obj.type and value.obj.type.is_pyobject:
if attribute_is_likely_method(value): if attribute_is_likely_method(value):
likely_method = 'likely' likely_method = 'likely'
break break
...@@ -6851,6 +6851,10 @@ class AttributeNode(ExprNode): ...@@ -6851,6 +6851,10 @@ class AttributeNode(ExprNode):
# FIXME: this is way too redundant with analyse_types() # FIXME: this is way too redundant with analyse_types()
node = self.analyse_as_cimported_attribute_node(env, target=False) node = self.analyse_as_cimported_attribute_node(env, target=False)
if node is not None: if node is not None:
if node.entry.type and node.entry.type.is_cfunction:
# special-case - function converted to pointer
return PyrexTypes.CPtrType(node.entry.type)
else:
return node.entry.type return node.entry.type
node = self.analyse_as_type_attribute(env) node = self.analyse_as_type_attribute(env)
if node is not None: if node is not None:
......
...@@ -41,6 +41,8 @@ ctypedef int my_int ...@@ -41,6 +41,8 @@ ctypedef int my_int
######## a.pyx ######## ######## a.pyx ########
from other cimport ( from other cimport (
A, A,
foo, foo,
...@@ -48,7 +50,17 @@ from other cimport ( ...@@ -48,7 +50,17 @@ from other cimport (
print A, foo(10) print A, foo(10)
cimport other cimport other
print other.A, other.foo(10)
cdef call_fooptr(int (*fptr)(int)):
return fptr(10)
def call_other_foo():
x = other.foo # GH4000 - failed because other was untyped
return call_fooptr(x) # check that x is correctly resolved as a function pointer
print(other.A, other.foo(10), call_other_foo())
from pkg cimport sub from pkg cimport sub
cdef sub.my_int a = 100 cdef sub.my_int a = 100
......
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