Fix template member variables wrapped by a smart pointer bug reported by Robert Lupton

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@10210 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
William S Fulton 2008-01-17 00:29:02 +00:00
commit b79e9a7d7e
4 changed files with 62 additions and 1 deletions

View file

@ -1,6 +1,10 @@
Version 1.3.34 (in progress) Version 1.3.34 (in progress)
============================ ============================
01/16/2007: wsfulton
Fix template member variables wrapped by a smart pointer. Bug reported
by Robert Lupton.
01/14/2008: mgossage 01/14/2008: mgossage
Substantial changes to configure script for detecting lua. Substantial changes to configure script for detecting lua.
Code can now link to liblua.a, liblua50.a or liblua51.a Code can now link to liblua.a, liblua50.a or liblua51.a

View file

@ -0,0 +1,17 @@
from smart_pointer_templatevariables import *
d = DiffImContainerPtr_D(create(1234, 5678))
if (d.id != 1234):
raise RuntimeError
#if (d.xyz != 5678):
# raise RuntimeError
d.id = 4321
#d.xyz = 8765
if (d.id != 4321):
raise RuntimeError
#if (d.xyz != 8765):
# raise RuntimeError

View file

@ -0,0 +1,39 @@
%module smart_pointer_templatevariables
%inline %{
template <class _CharT>
struct basic_string {
int npos;
};
template<class T>
struct Ptr {
Ptr(T *p = 0) : ptr(p) {}
~Ptr() { delete ptr; }
T *operator->() const { return ptr; }
private:
T *ptr;
};
template <typename KernelPixelT>
struct DiffImContainer {
int id;
// static members seem to be can of worms. Note that SWIG wraps them as non-static members. Why?
// Note CHANGES entry 10/14/2003. Static const variables are not wrapped as constants but as a read only variable. Why?
// static short xyz;
// static const short constvar = 555;
};
//template<typename KernelPixelT> short DiffImContainer<KernelPixelT>::xyz = 0;
DiffImContainer<double>* create(int id, short xyz) {
DiffImContainer<double> *d = new DiffImContainer<double>();
d->id = id;
// DiffImContainer<double>::xyz = xyz;
return d;
}
%}
%template(BasicString) basic_string<char>;
%template(DiffImContainer_D) DiffImContainer<double>;
%template(DiffImContainerPtr_D) Ptr<DiffImContainer<double> >;

View file

@ -974,6 +974,7 @@ int Language::cDeclaration(Node *n) {
return SWIG_OK; return SWIG_OK;
} else { } else {
/* Some kind of variable declaration */ /* Some kind of variable declaration */
String *declaration = Copy(decl);
Delattr(n, "decl"); Delattr(n, "decl");
if (Getattr(n, "nested")) if (Getattr(n, "nested"))
SetFlag(n, "feature:immutable"); SetFlag(n, "feature:immutable");
@ -1004,7 +1005,7 @@ int Language::cDeclaration(Node *n) {
Setattr(n, "type", ty); Setattr(n, "type", ty);
variableHandler(n); variableHandler(n);
Setattr(n, "type", type); Setattr(n, "type", type);
Setattr(n, "decl", decl); Setattr(n, "decl", declaration);
Delete(ty); Delete(ty);
Delete(type); Delete(type);
Delete(fullty); Delete(fullty);