From: William Stein Date: Sun, 22 Oct 2006 01:53:34 +0000 (-0700) Subject: Added a "Warning" class, and changed it so redeclaring or re-importing is a warning... X-Git-Tag: 0.9.6.14~29^2~226 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=a686fdc49d4813cfccd637697e6155b3e262bf6e;p=cython.git Added a "Warning" class, and changed it so redeclaring or re-importing is a warning rather than an error. 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. --- diff --git a/Cython/Compiler/Errors.py b/Cython/Compiler/Errors.py index 0ff98cb5..9120587a 100644 --- a/Cython/Compiler/Errors.py +++ b/Cython/Compiler/Errors.py @@ -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 diff --git a/Cython/Compiler/Symtab.py b/Cython/Compiler/Symtab.py index ab111299..b84a91ae 100644 --- a/Cython/Compiler/Symtab.py +++ b/Cython/Compiler/Symtab.py @@ -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)