Remove unnecessary Identifier redefined warning when a using statement redefines a symbol. Behaviour is now like a duplicate typedef of the same symbol.

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@12826 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
William S Fulton 2011-10-14 23:37:16 +00:00
commit fbd6d780b7
3 changed files with 30 additions and 4 deletions

View file

@ -287,6 +287,7 @@ CPP_TEST_CASES += \
protected_rename \
pure_virtual \
redefined \
redefined_not \
refcount \
reference_global_vars \
register_par \

View file

@ -0,0 +1,13 @@
%module redefined_not
// These should not emit an Identifer redefined warning
%inline %{
typedef unsigned int size_t;
namespace std {
using ::size_t;
}
using std::size_t;
typedef unsigned int size_t;
using std::size_t;
%}

View file

@ -893,11 +893,14 @@ static int nodes_are_equivalent(Node *a, Node *b, int a_inclass) {
/* they must have the same type */
String *ta = nodeType(a);
String *tb = nodeType(b);
if (Cmp(ta, tb) != 0)
return 0;
if (!Equal(ta, tb)) {
if (!(Equal(ta, "using") && Equal(tb, "cdecl"))) {
return 0;
}
}
/* cdecl case */
if (Cmp(ta, "cdecl") == 0) {
/* both cdecl case */
/* typedef */
String *a_storage = Getattr(a, "storage");
String *b_storage = Getattr(b, "storage");
@ -956,8 +959,17 @@ static int nodes_are_equivalent(Node *a, Node *b, int a_inclass) {
}
}
}
} else if (Equal(ta, "using")) {
/* using and cdecl case */
String *b_storage = Getattr(b, "storage");
if (Equal(b_storage, "typedef")) {
String *a_name = Getattr(a, "name");
String *b_name = Getattr(b, "name");
if (Equal(a_name, b_name))
return 1;
}
} else {
/* %constant case */
/* both %constant case */
String *a_storage = Getattr(a, "storage");
String *b_storage = Getattr(b, "storage");
if ((Cmp(a_storage, "%constant") == 0)