diff --git a/Examples/test-suite/extend_placement.i b/Examples/test-suite/extend_placement.i index b95e82145..4ec0d4813 100644 --- a/Examples/test-suite/extend_placement.i +++ b/Examples/test-suite/extend_placement.i @@ -83,6 +83,8 @@ public: // After the class +%warnfilter(SWIGWARN_PARSE_REDEFINED) BarT::spam(); + %inline %{ template class BarT { diff --git a/Source/CParse/parser.y b/Source/CParse/parser.y index 596142b89..6009054de 100644 --- a/Source/CParse/parser.y +++ b/Source/CParse/parser.y @@ -684,17 +684,8 @@ static void add_symbols(Node *n) { String *n_name_stripped = SwigType_templateprefix(Getattr(n, "name")); String *c_name_stripped = SwigType_templateprefix(Getattr(c, "name")); int redefined = Swig_need_redefined_warn(n, c, inclass); - String *n_name_decl = 0; + String *n_name_decl = Swig_name_decl(n); String *c_name_decl = Swig_name_decl(c); - { - /* As symbol add failed, temporarily add in missing symbol table for Swig_name_decl */ - Symtab *n_symtab = Getattr(n, "sym:symtab"); - if (!n_symtab) - Setattr(n, "sym:symtab", Swig_symbol_current()); - n_name_decl = Swig_name_decl(n); - if (!n_symtab) - Delattr(n, "sym:symtab"); - } if (redefined) { Printf(en, "Redefinition of identifier '%s' (ignored) as %s", symname_stripped, n_name_decl); Printf(ec, "previous definition of '%s' as %s", symname_stripped, c_name_decl); diff --git a/Source/Modules/nested.cxx b/Source/Modules/nested.cxx index d027eebe5..eda76b06e 100644 --- a/Source/Modules/nested.cxx +++ b/Source/Modules/nested.cxx @@ -146,20 +146,25 @@ static void add_symbols_c(Node *n) { String *e = NewStringEmpty(); String *en = NewStringEmpty(); String *ec = NewStringEmpty(); + String *symname_stripped = SwigType_templateprefix(symname); + String *n_name_stripped = SwigType_templateprefix(Getattr(n, "name")); + String *c_name_stripped = SwigType_templateprefix(Getattr(c, "name")); int redefined = Swig_need_redefined_warn(n, c, true); + String *n_name_decl = Swig_name_decl(n); + String *c_name_decl = Swig_name_decl(c); if (redefined) { - Printf(en, "Identifier '%s' redefined (ignored)", symname); - Printf(ec, "previous definition of '%s'", symname); + Printf(en, "Redefinition of identifier '%s' (ignored) as %s", symname_stripped, n_name_decl); + Printf(ec, "previous definition of '%s' as %s", symname_stripped, c_name_decl); } else { - Printf(en, "Redundant redeclaration of '%s'", symname); - Printf(ec, "previous declaration of '%s'", symname); + Printf(en, "Redundant redeclaration of identifier '%s' as %s", symname_stripped, n_name_decl); + Printf(ec, "previous declaration of '%s' as %s", symname_stripped, c_name_decl); } - if (Cmp(symname, Getattr(n, "name"))) { - Printf(en, " (Renamed from '%s')", SwigType_namestr(Getattr(n, "name"))); + if (!Equal(symname_stripped, n_name_stripped)) { + Printf(en, " (Renamed from '%s')", SwigType_namestr(n_name_stripped)); } Printf(en, ","); - if (Cmp(symname, Getattr(c, "name"))) { - Printf(ec, " (Renamed from '%s')", SwigType_namestr(Getattr(c, "name"))); + if (!Equal(symname_stripped, c_name_stripped)) { + Printf(ec, " (Renamed from '%s')", SwigType_namestr(c_name_stripped)); } Printf(ec, "."); SWIG_WARN_NODE_BEGIN(n); @@ -173,6 +178,11 @@ static void add_symbols_c(Node *n) { SWIG_WARN_NODE_END(n); Printf(e, "%s:%d:%s\n%s:%d:%s\n", Getfile(n), Getline(n), en, Getfile(c), Getline(c), ec); Setattr(n, "error", e); + Delete(c_name_decl); + Delete(n_name_decl); + Delete(symname_stripped); + Delete(c_name_stripped); + Delete(n_name_stripped); Delete(e); Delete(en); Delete(ec); diff --git a/Source/Swig/symbol.c b/Source/Swig/symbol.c index e44585f6f..daf813649 100644 --- a/Source/Swig/symbol.c +++ b/Source/Swig/symbol.c @@ -711,7 +711,7 @@ void Swig_symbol_cadd(const_String_or_char_ptr name, Node *n) { * for namespace support, type resolution, and other issues. * ----------------------------------------------------------------------------- */ -Node *Swig_symbol_add(const_String_or_char_ptr symname, Node *n) { +static Node *symbol_add(const_String_or_char_ptr symname, Node *n) { Hash *c, *cl = 0; SwigType *decl, *ndecl; String *cstorage, *nstorage; @@ -750,7 +750,6 @@ Node *Swig_symbol_add(const_String_or_char_ptr symname, Node *n) { /* No symbol name defined. We return. */ if (!symname) { - Setattr(n, "sym:symtab", current_symtab); return n; } @@ -948,6 +947,14 @@ Node *Swig_symbol_add(const_String_or_char_ptr symname, Node *n) { return n; } +Node *Swig_symbol_add(const_String_or_char_ptr symname, Node *n) { + Node *nn = symbol_add(symname, n); + /* Always set the symtab to have correct scope in case of error reporting */ + if (!Getattr(n, "sym:symtab")) + Setattr(n, "sym:symtab", current_symtab); + return nn; +} + /* ----------------------------------------------------------------------------- * symbol_lookup() *