make sure the cname really is unique when overriding its signature
authorStefan Behnel <scoder@users.berlios.de>
Wed, 3 Nov 2010 20:24:09 +0000 (21:24 +0100)
committerStefan Behnel <scoder@users.berlios.de>
Wed, 3 Nov 2010 20:24:09 +0000 (21:24 +0100)
Cython/Compiler/Symtab.py

index 8f176c8e4d77922fc8e7ddcc532dd3f350e95d2a..fb84b836c6a0a9b409c5c2204bc073ce8d1e7add 100644 (file)
@@ -552,7 +552,18 @@ class Scope(object):
                 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':
-                    if self.is_cpp() or (cname and entry.cname and cname != entry.cname):
+                    can_override = False
+                    if self.is_cpp():
+                        can_override = True
+                    elif cname:
+                        # if all alternatives have different cnames,
+                        # it's safe to allow signature overrides
+                        for alt_entry in entry.all_alternatives():
+                            if not alt_entry.cname or cname == alt_entry.cname:
+                                break # cname not unique!
+                        else:
+                            can_override = True
+                    if can_override:
                         temp = self.add_cfunction(name, type, pos, cname, visibility, modifiers)
                         temp.overloaded_alternatives = entry.all_alternatives()
                         entry = temp