better error when user-declared type conflicts with builtin type (#170)
authorRobert Bradshaw <robertwb@math.washington.edu>
Wed, 25 Mar 2009 22:23:46 +0000 (15:23 -0700)
committerRobert Bradshaw <robertwb@math.washington.edu>
Wed, 25 Mar 2009 22:23:46 +0000 (15:23 -0700)
Cython/Compiler/Builtin.py
Cython/Compiler/Nodes.py
tests/errors/builtin_type_conflict_T170.pyx [new file with mode: 0644]

index 3140b5334f9a34c2e18c16b0c3e7df070035cbd2..30728d09b65d2968146e4d0beb7b0075c319288d 100644 (file)
@@ -340,10 +340,14 @@ def init_builtin_funcs():
     for desc in builtin_function_table:
         declare_builtin_func(*desc)
 
+builtin_types = {}
+
 def init_builtin_types():
+    global builtin_types
     for name, cname, funcs in builtin_types_table:
         utility = builtin_utility_code.get(name)
         the_type = builtin_scope.declare_builtin_type(name, cname, utility)
+        builtin_types[name] = the_type
         for name, args, ret, cname in funcs:
             sig = Signature(args, ret)
             the_type.scope.declare_cfunction(name, sig.function_type(), None, cname)
index b30e29f7217282a16eae4727dcb6a555e56b966f..dc766a31cc0f7f996d0ba8df515c3272af21af89 100644 (file)
@@ -2676,6 +2676,12 @@ class CClassDefNode(ClassDefNode):
                 return
         else:
             home_scope = env
+
+        if self.visibility == 'extern':
+            if self.module_name == '__builtin__' and self.class_name in Builtin.builtin_types:
+                error(self.pos, "%s already a builtin Cython type" % self.class_name)
+                return
+
         self.entry = home_scope.declare_c_class(
             name = self.class_name, 
             pos = self.pos,
diff --git a/tests/errors/builtin_type_conflict_T170.pyx b/tests/errors/builtin_type_conflict_T170.pyx
new file mode 100644 (file)
index 0000000..c1c8ac9
--- /dev/null
@@ -0,0 +1,8 @@
+cdef extern from *:
+    ctypedef class __builtin__.list [object PyListObject]:
+        pass
+
+cdef list foo = []
+_ERRORS = u"""
+:2:4: list already a builtin Cython type
+"""