From b79e9a7d7e1da2f801e06e657f18ef058c65ced0 Mon Sep 17 00:00:00 2001 From: William S Fulton Date: Thu, 17 Jan 2008 00:29:02 +0000 Subject: [PATCH] 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 --- CHANGES.current | 4 ++ .../smart_pointer_templatevariables_runme.py | 17 ++++++++ .../smart_pointer_templatevariables.i | 39 +++++++++++++++++++ Source/Modules/lang.cxx | 3 +- 4 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 Examples/test-suite/python/smart_pointer_templatevariables_runme.py create mode 100644 Examples/test-suite/smart_pointer_templatevariables.i 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);