diff --git a/Source/CParse/templ.c b/Source/CParse/templ.c index c4af4ef68..a59db7a6c 100644 --- a/Source/CParse/templ.c +++ b/Source/CParse/templ.c @@ -375,6 +375,7 @@ Swig_cparse_template_expand(Node *n, String *rname, ParmList *tparms, Symtab *ts String *name, *value, *valuestr, *tydef, *tmp, *tmpr; int sz, i; String *dvalue = 0; + String *qvalue = 0; name = Getattr(tp,k_name); value = Getattr(p,k_value); @@ -382,7 +383,8 @@ Swig_cparse_template_expand(Node *n, String *rname, ParmList *tparms, Symtab *ts if (name) { if (!value) value = Getattr(p,k_type); - dvalue = Swig_symbol_type_qualify(value,tsdecl); + qvalue = Swig_symbol_type_qualify(value,tsdecl); + dvalue = Swig_symbol_typedef_reduce(qvalue, tsdecl); if (SwigType_istemplate(dvalue)) { String *ty = Swig_symbol_template_deftype(dvalue, tscope); Delete(dvalue); @@ -434,6 +436,7 @@ Swig_cparse_template_expand(Node *n, String *rname, ParmList *tparms, Symtab *ts Delete(tmpr); Delete(valuestr); Delete(dvalue); + Delete(qvalue); } p = nextSibling(p); tp = nextSibling(tp); diff --git a/Source/Modules/perl5.cxx b/Source/Modules/perl5.cxx index c2849f941..b70c98b33 100644 --- a/Source/Modules/perl5.cxx +++ b/Source/Modules/perl5.cxx @@ -17,7 +17,7 @@ char cvsroot_perl5_cxx[] = "$Header$"; #include "swigmod.h" #include "cparse.h" -static int treduce = SWIG_cparse_template_reduce(1); +static int treduce = SWIG_cparse_template_reduce(0); #include diff --git a/Source/Modules/ruby.cxx b/Source/Modules/ruby.cxx index d94f4bac0..465a0dd84 100644 --- a/Source/Modules/ruby.cxx +++ b/Source/Modules/ruby.cxx @@ -14,7 +14,7 @@ char cvsroot_ruby_cxx[] = "$Header$"; #include "swigmod.h" #include "cparse.h" -static int treduce = SWIG_cparse_template_reduce(1); +static int treduce = SWIG_cparse_template_reduce(0); #define SWIG_PROTECTED_TARGET_METHODS 1 diff --git a/Source/Modules/tcl8.cxx b/Source/Modules/tcl8.cxx index 6a9701b80..ed13a33ce 100644 --- a/Source/Modules/tcl8.cxx +++ b/Source/Modules/tcl8.cxx @@ -24,7 +24,7 @@ char cvsroot_tcl8_cxx[] = "$Header$"; #include "swigmod.h" #include "cparse.h" -static int treduce = SWIG_cparse_template_reduce(1); +static int treduce = SWIG_cparse_template_reduce(0); static const char *usage = (char*)"\ Tcl 8 Options (available with -tcl)\n\ diff --git a/Source/Swig/symbol.c b/Source/Swig/symbol.c index 78d1d4139..46b884c31 100644 --- a/Source/Swig/symbol.c +++ b/Source/Swig/symbol.c @@ -1016,6 +1016,10 @@ symbol_lookup_qualified(String_or_char *name, Symtab *symtab, String *prefix, in * to get the real node. * ----------------------------------------------------------------------------- */ +static +SwigType *Swig_symbol_template_reduce(SwigType *qt, Symtab *ntab); + + Node * Swig_symbol_clookup(String_or_char *name, Symtab *n) { Hash *hsym = 0; @@ -1052,6 +1056,19 @@ Swig_symbol_clookup(String_or_char *name, Symtab *n) { } } } + if (!s) { + if (SwigType_istemplate(name)) { + SwigType *qt = Swig_symbol_type_qualify(name,hsym); + SwigType *rt = Swig_symbol_template_reduce(qt, hsym); + if (!Equal(rt,name)) { + s = Swig_symbol_clookup(rt, hsym); + } + Delete(qt); + Delete(rt); + } + + } + if (!s) { while (hsym) { s = symbol_lookup(name,hsym,0);