Added a "Warning" class, and changed it so redeclaring or re-importing is a warning...
authorWilliam Stein <wstein@gmail.com>
Sun, 22 Oct 2006 01:53:34 +0000 (18:53 -0700)
committerWilliam Stein <wstein@gmail.com>
Sun, 22 Oct 2006 01:53:34 +0000 (18:53 -0700)
    Because Pyrex has no #ifndef macro, it is impossibly painful to use
    pxi files for declarations in a large project.  SAGE is a large project.
    Also, in Python it is not an error to import a module twice.  Thus
    more in line with Python's behavior, multiple declarations of the same
    symbol is no longer an error.

Cython/Compiler/Errors.py
Cython/Compiler/Symtab.py

index 0ff98cb5f1d1849eb06b955f28c8311f3efc9714..9120587add2c89cc04087f5c87f1cf51c5bed0c4 100644 (file)
@@ -9,6 +9,8 @@ from Pyrex.Utils import open_new_file
 class PyrexError(Exception):
     pass
 
+class PyrexWarning(Exception):
+    pass
 
 class CompileError(PyrexError):
     
@@ -21,6 +23,17 @@ class CompileError(PyrexError):
             pos_str = ""
         Exception.__init__(self, pos_str + message)
 
+class CompileWarning(PyrexWarning):
+    
+    def __init__(self, position = None, message = ""):
+        self.position = position
+        self.message = message
+        if position:
+            pos_str = "%s:%d:%d: " % position
+        else:
+            pos_str = ""
+        Exception.__init__(self, pos_str + message)
+
 
 class InternalError(Exception):
     # If this is ever raised, there is a bug in the compiler.
@@ -65,3 +78,12 @@ def error(position, message):
         echo_file.write(line)
     num_errors = num_errors + 1
     return err
+
+def warning(position, message):
+    warn = CompileWarning(position, message)
+    line = "%s\n" % warn
+    if listing_file:
+        listing_file.write(line)
+    if echo_file:
+        echo_file.write(line)
+    return warn
index ab1112992acdffb0b761cf4505eae44749df8e5a..b84a91ae63b8377e5db0762bcecd9b8193605af5 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 import re
-from Errors import error, InternalError
+from Errors import error, InternalError, warning
 import Options
 import Naming
 from PyrexTypes import c_int_type, \
@@ -195,7 +195,7 @@ class Scope:
         # declared.
         dict = self.entries
         if name and dict.has_key(name):
-            error(pos, "'%s' redeclared" % name)
+            warning(pos, "'%s' redeclared (ignoring second declaration)" % name)
         entry = Entry(name, cname, type, pos = pos)
         entry.in_cinclude = self.in_cinclude
         if name:
@@ -243,9 +243,9 @@ class Scope:
             self.sue_entries.append(entry)
         else:
             if not (entry.is_type and entry.type.is_struct_or_union):
-                error(pos, "'%s' redeclared" % name)
+                warning(pos, "'%s' redeclared  (ignoring second declaration)" % name)
             elif scope and entry.type.scope:
-                error(pos, "'%s' already defined" % name)
+                warning(pos, "'%s' already defined  (ignoring second definition)" % name)
             else:
                 self.check_previous_typedef_flag(entry, typedef_flag, pos)
                 if scope:
@@ -556,7 +556,7 @@ class ModuleScope(Scope):
         if entry not in self.entries:
             self.entries[name] = entry
         else:
-            error(pos, "'%s' redeclared" % name)
+            warning(pos, "'%s' redeclared  (ignoring second declaration)" % name)
     
     def declare_module(self, name, scope, pos):
         # Declare a cimported module. This is represented as a
@@ -574,7 +574,7 @@ class ModuleScope(Scope):
                 # name to appear again, and indeed the generated
                 # code compiles fine. 
                 return entry
-                error(pos, "'%s' redeclared" % name)
+                warning(pos, "'%s' redeclared  (ignoring second declaration)" % name)
                 return None
         else:
             entry = self.declare_var(name, py_object_type, pos)
@@ -822,7 +822,7 @@ class LocalScope(Scope):
     def declare_global(self, name, pos):
         # Pull entry from global scope into local scope.
         if self.lookup_here(name):
-            error(pos, "'%s' redeclared")
+            warning(pos, "'%s' redeclared  (ignoring second declaration)")
         else:
             entry = self.global_scope().lookup_target(name)
             self.entries[name] = entry
@@ -996,7 +996,7 @@ class CClassScope(ClassScope):
         entry = self.lookup_here(name)
         if entry:
             if not entry.is_cfunction:
-                error(pos, "'%s' redeclared" % name)
+                warning(pos, "'%s' redeclared  (ignoring second declaration)" % name)
             else:
                 if defining and entry.func_cname:
                     error(pos, "'%s' already defined" % name)