diff --git a/CHANGES.current b/CHANGES.current index 605d7d6d0..1b4e375e2 100644 --- a/CHANGES.current +++ b/CHANGES.current @@ -1,6 +1,10 @@ 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 Substantial changes to configure script for detecting lua. Code can now link to liblua.a, liblua50.a or liblua51.a diff --git a/Examples/test-suite/python/smart_pointer_templatevariables_runme.py b/Examples/test-suite/python/smart_pointer_templatevariables_runme.py new file mode 100644 index 000000000..367dcf3b2 --- /dev/null +++ b/Examples/test-suite/python/smart_pointer_templatevariables_runme.py @@ -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 + diff --git a/Examples/test-suite/smart_pointer_templatevariables.i b/Examples/test-suite/smart_pointer_templatevariables.i new file mode 100644 index 000000000..fd705eb28 --- /dev/null +++ b/Examples/test-suite/smart_pointer_templatevariables.i @@ -0,0 +1,39 @@ +%module smart_pointer_templatevariables + +%inline %{ +template +struct basic_string { + int npos; +}; + +template +struct Ptr { + Ptr(T *p = 0) : ptr(p) {} + ~Ptr() { delete ptr; } + T *operator->() const { return ptr; } +private: + T *ptr; +}; + +template +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 short DiffImContainer::xyz = 0; + +DiffImContainer* create(int id, short xyz) { + DiffImContainer *d = new DiffImContainer(); + d->id = id; +// DiffImContainer::xyz = xyz; + return d; +} +%} + +%template(BasicString) basic_string; +%template(DiffImContainer_D) DiffImContainer; +%template(DiffImContainerPtr_D) Ptr >; + diff --git a/Source/Modules/lang.cxx b/Source/Modules/lang.cxx index 4cc07e46a..279e25a80 100644 --- a/Source/Modules/lang.cxx +++ b/Source/Modules/lang.cxx @@ -974,6 +974,7 @@ int Language::cDeclaration(Node *n) { return SWIG_OK; } else { /* Some kind of variable declaration */ + String *declaration = Copy(decl); Delattr(n, "decl"); if (Getattr(n, "nested")) SetFlag(n, "feature:immutable"); @@ -1004,7 +1005,7 @@ int Language::cDeclaration(Node *n) { Setattr(n, "type", ty); variableHandler(n); Setattr(n, "type", type); - Setattr(n, "decl", decl); + Setattr(n, "decl", declaration); Delete(ty); Delete(type); Delete(fullty);