Add warnings for badly named destructors. Fix %extend and destructors for templates - they weren't always being wrapped. Fix destructor "name" attribute.

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@12804 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
William S Fulton 2011-09-13 06:15:29 +00:00
commit 4c6f66577a
10 changed files with 226 additions and 28 deletions

View file

@ -0,0 +1,104 @@
%module xxx
/////////////////////////////
%extend AStruct {
~AStruct() {}
}
struct AStruct {
~AStruct() {}
};
/////////////////////////////
struct BStruct {
~BStruct() {}
~BStruct() {}
};
/////////////////////////////
struct CStruct {
};
%extend CStruct {
~NOT_CStruct() {
delete $self;
}
}
%extend DStruct {
~NOT_DStruct() {
delete $self;
}
}
struct DStruct {
};
/////////////////////////////
struct EStruct {
~EStruct() {}
};
%extend EStruct {
~NOT_EStruct() {
delete $self;
}
}
%extend FStruct {
~NOT_FStruct() {
delete $self;
}
}
struct FStruct {
~FStruct() {}
};
/////////////////////////////
struct GStruct {
};
%extend GStruct {
~GStruct() {}
~NOT_GStruct() {
delete $self;
}
}
%extend HStruct {
~HStruct() {}
~NOT_HStruct() {
delete $self;
}
}
struct HStruct {
};
/////////////////////////////
struct IStruct {
~IStruct() {}
~NOT_IStruct() {}
};
struct JStruct {
~JStruct() {}
~NOT_JStruct() {}
~JStruct() {}
};
/////////////////////////////
struct KStruct {
~NOT_KStruct() {}
};
/////////////////////////////
template<typename T>
struct LStruct {
~LStruct() {}
~NOT_LStruct() {}
~LStruct() {}
};
%template(LStructInt) LStruct<int>;
%template(LStructShort) LStruct<short>;

View file

@ -209,6 +209,27 @@ Doc/Manual/Typemaps.html for complete details.
cpp_bad_extern.i:5: Warning 313: Unrecognized extern type "INTERCAL".
cpp_bad_extern.i:7: Warning 313: Unrecognized extern type "INTERCAL".
:::::::::::::::::::::::::::::::: cpp_extend_destructors.i :::::::::::::::::::::::::::::::::::
cpp_extend_destructors.i:8: Warning 302: Identifier '~AStruct' redefined by %extend (ignored),
cpp_extend_destructors.i:5: Warning 302: %extend definition of '~AStruct'.
cpp_extend_destructors.i:14: Warning 302: Identifier '~BStruct' redefined (ignored),
cpp_extend_destructors.i:13: Warning 302: previous definition of '~BStruct'.
cpp_extend_destructors.i:87: Warning 302: Identifier '~JStruct' redefined (ignored),
cpp_extend_destructors.i:85: Warning 302: previous definition of '~JStruct'.
cpp_extend_destructors.i:100: Warning 302: Identifier '~LStruct' redefined (ignored),
cpp_extend_destructors.i:98: Warning 302: previous definition of '~LStruct'.
cpp_extend_destructors.i:24: Warning 521: Illegal destructor name ~NOT_CStruct. Ignored.
cpp_extend_destructors.i:30: Warning 521: Illegal destructor name ~NOT_DStruct. Ignored.
cpp_extend_destructors.i:44: Warning 521: Illegal destructor name ~NOT_EStruct. Ignored.
cpp_extend_destructors.i:50: Warning 521: Illegal destructor name ~NOT_FStruct. Ignored.
cpp_extend_destructors.i:65: Warning 521: Illegal destructor name ~NOT_GStruct. Ignored.
cpp_extend_destructors.i:72: Warning 521: Illegal destructor name ~NOT_HStruct. Ignored.
cpp_extend_destructors.i:81: Warning 521: Illegal destructor name ~NOT_IStruct. Ignored.
cpp_extend_destructors.i:86: Warning 521: Illegal destructor name ~NOT_JStruct. Ignored.
cpp_extend_destructors.i:92: Warning 521: Illegal destructor name ~NOT_KStruct. Ignored.
cpp_extend_destructors.i:99: Warning 521: Illegal destructor name ~NOT_LStruct< int >. Ignored.
cpp_extend_destructors.i:99: Warning 521: Illegal destructor name ~NOT_LStruct< short >. Ignored.
:::::::::::::::::::::::::::::::: cpp_extend_redefine.i :::::::::::::::::::::::::::::::::::
cpp_extend_redefine.i:9: Warning 302: Identifier 'bar' redefined by %extend (ignored),
cpp_extend_redefine.i:5: Warning 302: %extend definition of 'bar'.

View file

@ -63,6 +63,7 @@ swig_typemap_old
# Files run in C++ mode
CPPFILES='
cpp_bad_extern
cpp_extend_destructors
cpp_extend_redefine
cpp_extend_undefined
cpp_inline_namespace

View file

@ -20,20 +20,21 @@ namespace Space {
typedef struct {
int ivar;
} DStruct;
}
typedef struct tagEStruct {
int ivar;
} EStruct;
namespace Space {
template<typename T>
struct FFStruct {
int ivar;
};
}
%}
%extend Junk {
void thingy() {}
}
%inline %{
struct Junk {};
%}
namespace Space {
%extend tagAStruct {
@ -103,3 +104,22 @@ namespace Space {
}
}
namespace Space {
%extend FFStruct {
FFStruct(int ivar0) {
Space::FFStruct<T> *s = new Space::FFStruct<T>();
s->ivar = ivar0;
global = ivar0;
return s;
}
~FFStruct() {
global = -$self->ivar;
delete $self;
}
}
}
%template(FStruct) Space::FFStruct<long>;
%template(GStruct) Space::FFStruct<char>;

View file

@ -20,6 +20,12 @@ public class extend_constructor_destructor_runme {
checkGlobal(30);
DStruct d = new DStruct(40);
checkGlobal(40);
EStruct e = new EStruct(50);
checkGlobal(50);
FStruct f = new FStruct(60);
checkGlobal(60);
GStruct g = new GStruct(70);
checkGlobal(70);
a.delete();
checkGlobal(-10);
@ -29,6 +35,12 @@ public class extend_constructor_destructor_runme {
checkGlobal(-30);
d.delete();
checkGlobal(-40);
e.delete();
checkGlobal(-50);
f.delete();
checkGlobal(-60);
g.delete();
checkGlobal(-70);
}
public static void checkGlobal(int val) {