Fix for friend declarations, and other 'repeated' declarations.
Now, this doesn't generate warnings:
class A; class B*;
int foo(A*, B*);
struct A {
friend int foo(A*, B*);
};
but this generates
struct B {
friend double foo(A*, B*);
};
which is correct, since they have different return types.
See the redefined.i file for most cases where
repeated (but not redefined) declarations are
not generating warnings now, such as:
// no warning
#define REPEATED 1
#define REPEATED 1
// yes warning
#define REDEFINED 1
#define REDEFINED 2
this is following the C, C++ and preprocessor
standard behavior.
The function 'need_redefined_warn(..)' was added to
util.c, if some strange corner appears, and therefore,
the parser.y file doesn't need to be changed latter.
Also, the redefined warning format in parser.y
was changed, so now it respond to William's -Fmicrosoft
flag.
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@5633 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
parent
acee037c44
commit
eaa0062cd2
5 changed files with 205 additions and 11 deletions
|
|
@ -137,3 +137,87 @@ int need_name_warning(Node *n)
|
|||
}
|
||||
return need;
|
||||
}
|
||||
|
||||
|
||||
int are_equivalent_nodes(Node* a, Node* b, int a_inclass)
|
||||
{
|
||||
/* they must have the same type */
|
||||
SwigType *ta = nodeType(a);
|
||||
SwigType *tb = nodeType(b);
|
||||
if (Cmp(ta, tb) != 0) return 0;
|
||||
|
||||
/* cdecl case */
|
||||
if (Cmp(ta, "cdecl") == 0) {
|
||||
/* typedef */
|
||||
String *a_storage = Getattr(a,"storage");
|
||||
String *b_storage = Getattr(b,"storage");
|
||||
|
||||
if ((Cmp(a_storage,"typedef") == 0)
|
||||
|| (Cmp(b_storage,"typedef") == 0)) {
|
||||
if (Cmp(a_storage, b_storage) == 0) {
|
||||
String *a_type = (Getattr(a,"type"));
|
||||
String *b_type = (Getattr(b,"type"));
|
||||
if (Cmp(a_type, b_type) == 0) return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* static functions */
|
||||
if ((Cmp(a_storage, "static") == 0)
|
||||
|| (Cmp(b_storage, "static") == 0)) {
|
||||
if (Cmp(a_storage, b_storage) != 0) return 0;
|
||||
}
|
||||
|
||||
if (!a_inclass || (Cmp(a_storage,"friend") == 0)) {
|
||||
/* check declaration */
|
||||
String *a_decl = (Getattr(a,"decl"));
|
||||
String *b_decl = (Getattr(b,"decl"));
|
||||
if (Cmp(a_decl, b_decl) == 0) {
|
||||
/* check return type */
|
||||
String *a_type = (Getattr(a,"type"));
|
||||
String *b_type = (Getattr(b,"type"));
|
||||
if (Cmp(a_type, b_type) == 0) {
|
||||
/* check parameters */
|
||||
Parm *ap = (Getattr(a,"parms"));
|
||||
Parm *bp = (Getattr(b,"parms"));
|
||||
int la = Len(ap);
|
||||
int lb = Len(bp);
|
||||
|
||||
if (la != lb) return 0;
|
||||
while (ap && bp) {
|
||||
SwigType *at = Getattr(ap,"type");
|
||||
SwigType *bt = Getattr(bp,"type");
|
||||
if (Cmp(at, bt) != 0) return 0;
|
||||
ap = nextSibling(ap);
|
||||
bp = nextSibling(bp);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
/* %constant case */
|
||||
String *a_storage = Getattr(a,"storage");
|
||||
String *b_storage = Getattr(b,"storage");
|
||||
if ((Cmp(a_storage, "%constant") == 0)
|
||||
|| (Cmp(b_storage, "%constant") == 0)) {
|
||||
if (Cmp(a_storage, b_storage) == 0) {
|
||||
String *a_type = (Getattr(a,"type"));
|
||||
String *b_type = (Getattr(b,"type"));
|
||||
if ((Cmp(a_type, b_type) == 0)
|
||||
&& (Cmp(Getattr(a,"value"), Getattr(b,"value")) == 0))
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int need_redefined_warn(Node* a, Node* b, int InClass)
|
||||
{
|
||||
String *a_storage = Getattr(a,"storage");
|
||||
String *b_storage = Getattr(b,"storage");
|
||||
|
||||
return !are_equivalent_nodes(a, b, InClass);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue