Commit c35599ce authored by Robert Bradshaw's avatar Robert Bradshaw

Fix lots of tests errors, all tests pass.

parent f77650eb
...@@ -2429,14 +2429,6 @@ class SimpleCallNode(CallNode): ...@@ -2429,14 +2429,6 @@ class SimpleCallNode(CallNode):
self.function.entry = entry self.function.entry = entry
self.function.type = entry.type self.function.type = entry.type
func_type = self.function_type() func_type = self.function_type()
# Check function type
if not func_type.is_cfunction:
if not func_type.is_error:
error(self.pos, "Calling non-function type '%s'" %
func_type)
self.type = PyrexTypes.error_type
self.result_code = "<error>"
return
# Check no. of args # Check no. of args
max_nargs = len(func_type.args) max_nargs = len(func_type.args)
expected_nargs = max_nargs - func_type.optional_arg_count expected_nargs = max_nargs - func_type.optional_arg_count
...@@ -2479,7 +2471,7 @@ class SimpleCallNode(CallNode): ...@@ -2479,7 +2471,7 @@ class SimpleCallNode(CallNode):
def c_call_code(self): def c_call_code(self):
func_type = self.function_type() func_type = self.function_type()
if self.args is None or not func_type.is_cfunction: if self.type is PyrexTypes.error_type or not func_type.is_cfunction:
return "<error>" return "<error>"
formal_args = func_type.args formal_args = func_type.args
arg_list_code = [] arg_list_code = []
...@@ -3772,8 +3764,8 @@ class UnopNode(ExprNode): ...@@ -3772,8 +3764,8 @@ class UnopNode(ExprNode):
self.type = py_object_type self.type = py_object_type
self.gil_check(env) self.gil_check(env)
self.is_temp = 1 self.is_temp = 1
elif self.is_cpp_operation: elif self.is_cpp_operation():
self.analyse_cpp_operation self.analyse_cpp_operation(env)
else: else:
self.analyse_c_operation(env) self.analyse_c_operation(env)
......
...@@ -775,9 +775,6 @@ class TemplatedTypeNode(CBaseTypeNode): ...@@ -775,9 +775,6 @@ class TemplatedTypeNode(CBaseTypeNode):
else: else:
if not isinstance(env, Symtab.LocalScope):
error(self.pos, ERR_BUF_LOCALONLY)
import Buffer import Buffer
options = Buffer.analyse_buffer_options( options = Buffer.analyse_buffer_options(
...@@ -5817,4 +5814,3 @@ proto=""" ...@@ -5817,4 +5814,3 @@ proto="""
#------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------
ERR_BUF_LOCALONLY = 'Buffer types only allowed as function local variables'
...@@ -1458,6 +1458,8 @@ class CppClassType(CType): ...@@ -1458,6 +1458,8 @@ class CppClassType(CType):
if self == other_type: if self == other_type:
return 1 return 1
elif self.template_type == other_type.template_type: elif self.template_type == other_type.template_type:
if self.templates == other_type.templates:
return 1
for t1, t2 in zip(self.templates, other_type.templates): for t1, t2 in zip(self.templates, other_type.templates):
if not t1.same_as_resolved_type(t2): if not t1.same_as_resolved_type(t2):
return 0 return 0
...@@ -1770,14 +1772,27 @@ def best_match(args, functions, pos): ...@@ -1770,14 +1772,27 @@ def best_match(args, functions, pos):
func_type = func.type func_type = func.type
if func_type.is_ptr: if func_type.is_ptr:
func_type = func_type.base_type func_type = func_type.base_type
# Check function type
if not func_type.is_cfunction:
if not func_type.is_error:
error(pos, "Calling non-function type '%s'" % func_type)
return None
# Check no. of args # Check no. of args
max_nargs = len(func_type.args) max_nargs = len(func_type.args)
min_nargs = max_nargs - func_type.optional_arg_count min_nargs = max_nargs - func_type.optional_arg_count
if actual_nargs < min_nargs \ if actual_nargs < min_nargs \
or (not func_type.has_varargs and actual_nargs > max_nargs): or (not func_type.has_varargs and actual_nargs > max_nargs):
if max_nargs == min_nargs and not func_type.has_varargs:
expectation = max_nargs
elif actual_nargs < min_nargs:
expectation = "at least %s" % min_nargs
else:
expectation = "at most %s" % max_nargs
error_str = "Call with wrong number of arguments (expected %s, got %s)" \
% (expectation, actual_nargs)
continue continue
score = [0,0,0] score = [0,0,0]
for i in range(len(args)): for i in range(min(len(args), len(func_type.args))):
src_type = args[i].type src_type = args[i].type
dst_type = func_type.args[i].type dst_type = func_type.args[i].type
if dst_type.assignable_from(src_type): if dst_type.assignable_from(src_type):
...@@ -1804,8 +1819,7 @@ def best_match(args, functions, pos): ...@@ -1804,8 +1819,7 @@ def best_match(args, functions, pos):
# This will raise the right error. # This will raise the right error.
return func return func
else: else:
error(pos, "Call with wrong number of arguments (expected %s, got %s)" error(pos, error_str)
% (expected_str, actual_nargs))
return None return None
......
...@@ -301,26 +301,22 @@ class Scope(object): ...@@ -301,26 +301,22 @@ class Scope(object):
# Create new entry, and add to dictionary if # Create new entry, and add to dictionary if
# name is not None. Reports a warning if already # name is not None. Reports a warning if already
# declared. # declared.
if type.is_buffer and not isinstance(self, LocalScope):
error(pos, ERR_BUF_LOCALONLY)
if not self.in_cinclude and cname and re.match("^_[_A-Z]+$", cname): if not self.in_cinclude and cname and re.match("^_[_A-Z]+$", cname):
# See http://www.gnu.org/software/libc/manual/html_node/Reserved-Names.html#Reserved-Names # See http://www.gnu.org/software/libc/manual/html_node/Reserved-Names.html#Reserved-Names
warning(pos, "'%s' is a reserved name in C." % cname, -1) warning(pos, "'%s' is a reserved name in C." % cname, -1)
entries = self.entries entries = self.entries
overloaded = False
if name and name in entries: if name and name in entries:
if visibility == 'extern': if visibility == 'extern':
warning(pos, "'%s' redeclared " % name, 0) warning(pos, "'%s' redeclared " % name, 0)
elif visibility != 'ignore': elif visibility != 'ignore':
overloaded = True error(pos, "'%s' redeclared " % name)
#error(pos, "'%s' redeclared " % name)
entry = Entry(name, cname, type, pos = pos) entry = Entry(name, cname, type, pos = pos)
entry.in_cinclude = self.in_cinclude entry.in_cinclude = self.in_cinclude
if name: if name:
entry.qualified_name = self.qualify_name(name) entry.qualified_name = self.qualify_name(name)
if overloaded: entries[name] = entry
entries[name].overloaded_alternatives.append(entry)
#print entries[name].overloaded_alternatives
else:
entries[name] = entry
entry.scope = self entry.scope = self
entry.visibility = visibility entry.visibility = visibility
return entry return entry
...@@ -464,13 +460,14 @@ class Scope(object): ...@@ -464,13 +460,14 @@ class Scope(object):
cname = self.mangle(Naming.func_prefix, name) cname = self.mangle(Naming.func_prefix, name)
entry = self.lookup_here(name) entry = self.lookup_here(name)
if entry: if entry:
entry.overloaded_alternatives.append(self.add_cfunction(name, type, pos, cname, visibility, modifiers))
if visibility != 'private' and visibility != entry.visibility: if visibility != 'private' and visibility != entry.visibility:
warning(pos, "Function '%s' previously declared as '%s'" % (name, entry.visibility), 1) warning(pos, "Function '%s' previously declared as '%s'" % (name, entry.visibility), 1)
if not entry.type.same_as(type): if not entry.type.same_as(type):
if visibility == 'extern' and entry.visibility == 'extern': if visibility == 'extern' and entry.visibility == 'extern':
warning(pos, "Function signature does not match previous declaration", 1) warning(pos, "Function signature does not match previous declaration", 1)
#entry.type = type #entry.type = type
entry.overloaded_alternatives.append(
self.add_cfunction(name, type, pos, cname, visibility, modifiers))
else: else:
error(pos, "Function signature does not match previous declaration") error(pos, "Function signature does not match previous declaration")
else: else:
...@@ -1113,6 +1110,10 @@ class ModuleScope(Scope): ...@@ -1113,6 +1110,10 @@ class ModuleScope(Scope):
# #
return entry return entry
def check_for_illegal_incomplete_ctypedef(self, typedef_flag, pos):
if typedef_flag and not self.in_cinclude:
error(pos, "Forward-referenced type must use 'cdef', not 'ctypedef'")
def declare_cpp_class(self, name, scope, def declare_cpp_class(self, name, scope,
pos, cname = None, base_classes = [], pos, cname = None, base_classes = [],
visibility = 'extern', templates = None): visibility = 'extern', templates = None):
...@@ -1626,6 +1627,11 @@ class CppClassScope(Scope): ...@@ -1626,6 +1627,11 @@ class CppClassScope(Scope):
"C++ class member cannot be a Python object") "C++ class member cannot be a Python object")
return entry return entry
def declare_cfunction(self, name, type, pos,
cname = None, visibility = 'extern', defining = 0,
api = 0, in_pxd = 0, modifiers = ()):
entry = self.declare_var(name, type, pos, cname, visibility)
def declare_inherited_cpp_attributes(self, base_scope): def declare_inherited_cpp_attributes(self, base_scope):
# Declare entries for all the C++ attributes of an # Declare entries for all the C++ attributes of an
# inherited type, with cnames modified appropriately # inherited type, with cnames modified appropriately
...@@ -1638,7 +1644,7 @@ class CppClassScope(Scope): ...@@ -1638,7 +1644,7 @@ class CppClassScope(Scope):
self.inherited_var_entries.append(entry) self.inherited_var_entries.append(entry)
for base_entry in base_scope.cfunc_entries: for base_entry in base_scope.cfunc_entries:
entry = self.declare_cfunction(base_entry.name, base_entry.type, entry = self.declare_cfunction(base_entry.name, base_entry.type,
base_entry.pos, adapt(base_entry.cname), base_entry.pos, base_entry.cname,
base_entry.visibility, base_entry.func_modifiers) base_entry.visibility, base_entry.func_modifiers)
entry.is_inherited = 1 entry.is_inherited = 1
...@@ -1699,3 +1705,7 @@ static PyObject* __Pyx_Method_ClassMethod(PyObject *method) { ...@@ -1699,3 +1705,7 @@ static PyObject* __Pyx_Method_ClassMethod(PyObject *method) {
return NULL; return NULL;
} }
""") """)
#------------------------------------------------------------------------------------
ERR_BUF_LOCALONLY = 'Buffer types only allowed as function local variables'
...@@ -12,8 +12,8 @@ def f(): ...@@ -12,8 +12,8 @@ def f():
cdef object[int, 2, well] buf6 cdef object[int, 2, well] buf6
_ERRORS = u""" _ERRORS = u"""
1:11: Buffer types only allowed as function local variables 1:17: Buffer types only allowed as function local variables
3:15: Buffer types only allowed as function local variables 3:21: Buffer types only allowed as function local variables
6:27: "fakeoption" is not a buffer option 6:27: "fakeoption" is not a buffer option
""" """
#TODO: #TODO:
......
...@@ -13,8 +13,8 @@ def f(a): ...@@ -13,8 +13,8 @@ def f(a):
del s.m # error: deletion of non-Python object del s.m # error: deletion of non-Python object
_ERRORS = u""" _ERRORS = u"""
8:6: Cannot assign to or delete this 8:6: Cannot assign to or delete this
9:45: Deletion of non-Python object 9:45: Deletion of non-Python, non-C++ object
12:6: Deletion of non-Python object 12:6: Deletion of non-Python, non-C++ object
13:6: Deletion of non-Python object 13:6: Deletion of non-Python, non-C++ object
11:52: Deletion of local or C global name not supported 11:52: Deletion of local or C global name not supported
""" """
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