More redefinition/redeclaration warning message improvements

Replicate redefinition/redeclaration warning message improvements
in previous commit to nested classes.

Adding the symtab to all nodes in Swig_symbol_add() has also fixed some
warning displays with %extend 302 warnings, which were completely
missing before (extend_placement.i testcase).
This commit is contained in:
William S Fulton 2023-07-26 08:26:12 +01:00
parent 856d6f25e9
commit 526bc33376
4 changed files with 30 additions and 20 deletions

View File

@ -83,6 +83,8 @@ public:
// After the class // After the class
%warnfilter(SWIGWARN_PARSE_REDEFINED) BarT<int>::spam();
%inline %{ %inline %{
template<class T> template<class T>
class BarT { class BarT {

View File

@ -684,17 +684,8 @@ static void add_symbols(Node *n) {
String *n_name_stripped = SwigType_templateprefix(Getattr(n, "name")); String *n_name_stripped = SwigType_templateprefix(Getattr(n, "name"));
String *c_name_stripped = SwigType_templateprefix(Getattr(c, "name")); String *c_name_stripped = SwigType_templateprefix(Getattr(c, "name"));
int redefined = Swig_need_redefined_warn(n, c, inclass); 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); 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) { if (redefined) {
Printf(en, "Redefinition of identifier '%s' (ignored) as %s", symname_stripped, n_name_decl); 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); Printf(ec, "previous definition of '%s' as %s", symname_stripped, c_name_decl);

View File

@ -146,20 +146,25 @@ static void add_symbols_c(Node *n) {
String *e = NewStringEmpty(); String *e = NewStringEmpty();
String *en = NewStringEmpty(); String *en = NewStringEmpty();
String *ec = 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); 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) { if (redefined) {
Printf(en, "Identifier '%s' redefined (ignored)", symname); Printf(en, "Redefinition of identifier '%s' (ignored) as %s", symname_stripped, n_name_decl);
Printf(ec, "previous definition of '%s'", symname); Printf(ec, "previous definition of '%s' as %s", symname_stripped, c_name_decl);
} else { } else {
Printf(en, "Redundant redeclaration of '%s'", symname); Printf(en, "Redundant redeclaration of identifier '%s' as %s", symname_stripped, n_name_decl);
Printf(ec, "previous declaration of '%s'", symname); Printf(ec, "previous declaration of '%s' as %s", symname_stripped, c_name_decl);
} }
if (Cmp(symname, Getattr(n, "name"))) { if (!Equal(symname_stripped, n_name_stripped)) {
Printf(en, " (Renamed from '%s')", SwigType_namestr(Getattr(n, "name"))); Printf(en, " (Renamed from '%s')", SwigType_namestr(n_name_stripped));
} }
Printf(en, ","); Printf(en, ",");
if (Cmp(symname, Getattr(c, "name"))) { if (!Equal(symname_stripped, c_name_stripped)) {
Printf(ec, " (Renamed from '%s')", SwigType_namestr(Getattr(c, "name"))); Printf(ec, " (Renamed from '%s')", SwigType_namestr(c_name_stripped));
} }
Printf(ec, "."); Printf(ec, ".");
SWIG_WARN_NODE_BEGIN(n); SWIG_WARN_NODE_BEGIN(n);
@ -173,6 +178,11 @@ static void add_symbols_c(Node *n) {
SWIG_WARN_NODE_END(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); Printf(e, "%s:%d:%s\n%s:%d:%s\n", Getfile(n), Getline(n), en, Getfile(c), Getline(c), ec);
Setattr(n, "error", e); 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(e);
Delete(en); Delete(en);
Delete(ec); Delete(ec);

View File

@ -711,7 +711,7 @@ void Swig_symbol_cadd(const_String_or_char_ptr name, Node *n) {
* for namespace support, type resolution, and other issues. * 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; Hash *c, *cl = 0;
SwigType *decl, *ndecl; SwigType *decl, *ndecl;
String *cstorage, *nstorage; 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. */ /* No symbol name defined. We return. */
if (!symname) { if (!symname) {
Setattr(n, "sym:symtab", current_symtab);
return n; return n;
} }
@ -948,6 +947,14 @@ Node *Swig_symbol_add(const_String_or_char_ptr symname, Node *n) {
return 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() * symbol_lookup()
* *