Fix lots of tests errors, all tests pass.
authorRobert Bradshaw <robertwb@math.washington.edu>
Sun, 16 Aug 2009 04:26:43 +0000 (21:26 -0700)
committerRobert Bradshaw <robertwb@math.washington.edu>
Sun, 16 Aug 2009 04:26:43 +0000 (21:26 -0700)
Cython/Compiler/ExprNodes.py
Cython/Compiler/Nodes.py
Cython/Compiler/PyrexTypes.py
Cython/Compiler/Symtab.py
tests/errors/e_bufaccess.pyx
tests/errors/e_del.pyx

index 1134cdce1e9af4fce497fb322296a4f61e5887c3..d3e1278641c051f96158012078d1a8a31b7159db 100755 (executable)
@@ -2429,14 +2429,6 @@ class SimpleCallNode(CallNode):
         self.function.entry = entry
         self.function.type = entry.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
         max_nargs = len(func_type.args)
         expected_nargs = max_nargs - func_type.optional_arg_count
@@ -2479,7 +2471,7 @@ class SimpleCallNode(CallNode):
     
     def c_call_code(self):
         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>"
         formal_args = func_type.args
         arg_list_code = []
@@ -3772,8 +3764,8 @@ class UnopNode(ExprNode):
             self.type = py_object_type
             self.gil_check(env)
             self.is_temp = 1
-        elif self.is_cpp_operation:
-            self.analyse_cpp_operation
+        elif self.is_cpp_operation():
+            self.analyse_cpp_operation(env)
         else:
             self.analyse_c_operation(env)
     
index ff316178d2de3d8b1208ea495c4303894a4eef7f..8b2d8afab766ac5209aac9209079719044bcf68b 100644 (file)
@@ -775,9 +775,6 @@ class TemplatedTypeNode(CBaseTypeNode):
         
         else:
         
-            if not isinstance(env, Symtab.LocalScope):
-                error(self.pos, ERR_BUF_LOCALONLY)
-        
             import Buffer
 
             options = Buffer.analyse_buffer_options(
@@ -5817,4 +5814,3 @@ proto="""
 
 #------------------------------------------------------------------------------------
 
-ERR_BUF_LOCALONLY = 'Buffer types only allowed as function local variables'
index 01fba6a5890f52fc2d51073c45cecbff649c460e..6480f9281a157cbd9508db3f2368e6a22282f38e 100755 (executable)
@@ -1458,6 +1458,8 @@ class CppClassType(CType):
             if self == other_type:
                 return 1
             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):
                     if not t1.same_as_resolved_type(t2):
                         return 0
@@ -1770,14 +1772,27 @@ def best_match(args, functions, pos):
         func_type = func.type
         if func_type.is_ptr:
             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
         max_nargs = len(func_type.args)
         min_nargs = max_nargs - func_type.optional_arg_count
         if actual_nargs < min_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
         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
             dst_type = func_type.args[i].type
             if dst_type.assignable_from(src_type):
@@ -1804,8 +1819,7 @@ def best_match(args, functions, pos):
         # This will raise the right error.
         return func
     else:
-        error(pos, "Call with wrong number of arguments (expected %s, got %s)"
-                            % (expected_str, actual_nargs))
+        error(pos, error_str)
     return None
 
 
index 6d7b305d79938fcc1d212600ee93039edf823da9..ec207487db74374d1fede0e423165ac18dfe9578 100644 (file)
@@ -301,26 +301,22 @@ class Scope(object):
         # Create new entry, and add to dictionary if
         # name is not None. Reports a warning if already 
         # 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):
             # 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)
         entries = self.entries
-        overloaded = False
         if name and name in entries:
             if visibility == 'extern':
                 warning(pos, "'%s' redeclared " % name, 0)
             elif visibility != 'ignore':
-                overloaded = True
-                #error(pos, "'%s' redeclared " % name)
+                error(pos, "'%s' redeclared " % name)
         entry = Entry(name, cname, type, pos = pos)
         entry.in_cinclude = self.in_cinclude
         if name:
             entry.qualified_name = self.qualify_name(name)
-            if overloaded:
-                entries[name].overloaded_alternatives.append(entry)
-                #print entries[name].overloaded_alternatives
-            else:
-                entries[name] = entry
+            entries[name] = entry
         entry.scope = self
         entry.visibility = visibility
         return entry
@@ -464,13 +460,14 @@ class Scope(object):
                 cname = self.mangle(Naming.func_prefix, name)
         entry = self.lookup_here(name)
         if entry:
-            entry.overloaded_alternatives.append(self.add_cfunction(name, type, pos, cname, visibility, modifiers))
             if visibility != 'private' and visibility != entry.visibility:
                 warning(pos, "Function '%s' previously declared as '%s'" % (name, entry.visibility), 1)
             if not entry.type.same_as(type):
                 if visibility == 'extern' and entry.visibility == 'extern':
                     warning(pos, "Function signature does not match previous declaration", 1)
                     #entry.type = type
+                    entry.overloaded_alternatives.append(
+                        self.add_cfunction(name, type, pos, cname, visibility, modifiers))
                 else:
                     error(pos, "Function signature does not match previous declaration")
         else:
@@ -1113,6 +1110,10 @@ class ModuleScope(Scope):
         #
         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,
             pos, cname = None, base_classes = [],
             visibility = 'extern', templates = None):
@@ -1626,6 +1627,11 @@ class CppClassScope(Scope):
                 "C++ class member cannot be a Python object")
         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):
         # Declare entries for all the C++ attributes of an
         # inherited type, with cnames modified appropriately
@@ -1638,7 +1644,7 @@ class CppClassScope(Scope):
                 self.inherited_var_entries.append(entry)
         for base_entry in base_scope.cfunc_entries:
             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)
             entry.is_inherited = 1
     
@@ -1699,3 +1705,7 @@ static PyObject* __Pyx_Method_ClassMethod(PyObject *method) {
     return NULL;
 }
 """)
+
+#------------------------------------------------------------------------------------
+
+ERR_BUF_LOCALONLY = 'Buffer types only allowed as function local variables'
index d541103a478a634e9389d6ad9182dfa5a3ad149a..916013abaf93495aa7334e6a5b6d51b1a65a410e 100644 (file)
@@ -12,8 +12,8 @@ def f():
     cdef object[int, 2, well] buf6
 
 _ERRORS = u"""
-1:11: Buffer types only allowed as function local variables
-3:15: Buffer types only allowed as function local variables
+1:17: 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
 """
 #TODO:
index befed049bb1b26c761988ab6ec0c080da2b77ce8..21e560600d50807f73edf0b2678a6b0c2e4e224b 100644 (file)
@@ -13,8 +13,8 @@ def f(a):
        del s.m # error: deletion of non-Python object
 _ERRORS = u"""
 8:6: Cannot assign to or delete this
-9:45: Deletion of non-Python object
-12:6: Deletion of non-Python object
-13:6: Deletion of non-Python object
+9:45: Deletion of non-Python, non-C++ object
+12:6: Deletion of non-Python, non-C++ object
+13:6: Deletion of non-Python, non-C++ object
 11:52: Deletion of local or C global name not supported
 """