Fix #1819847 %template with just one default template parameter
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@10189 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
parent
a84f3dfa68
commit
b79ebf39fa
8 changed files with 117 additions and 11 deletions
|
|
@ -1,6 +1,12 @@
|
||||||
Version 1.3.34 (in progress)
|
Version 1.3.34 (in progress)
|
||||||
============================
|
============================
|
||||||
|
|
||||||
|
12/12/2007: wsfulton
|
||||||
|
Fix #1819847 %template with just one default template parameter
|
||||||
|
|
||||||
|
template<typename T = int> class Foo {...};
|
||||||
|
%template(FooDefault) Foo<>;
|
||||||
|
|
||||||
12/12/2007: mgossage
|
12/12/2007: mgossage
|
||||||
[Lua] Small correction on Lua.html
|
[Lua] Small correction on Lua.html
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -264,6 +264,7 @@ CPP_TEST_CASES += \
|
||||||
template_default \
|
template_default \
|
||||||
template_default2 \
|
template_default2 \
|
||||||
template_default_arg \
|
template_default_arg \
|
||||||
|
template_default_class_parms \
|
||||||
template_default_inherit \
|
template_default_inherit \
|
||||||
template_default_qualify \
|
template_default_qualify \
|
||||||
template_default_vw \
|
template_default_vw \
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,43 @@
|
||||||
|
|
||||||
|
|
||||||
|
import template_default_class_parms.*;
|
||||||
|
|
||||||
|
public class template_default_class_parms_runme {
|
||||||
|
|
||||||
|
static {
|
||||||
|
try {
|
||||||
|
System.loadLibrary("template_default_class_parms");
|
||||||
|
} catch (UnsatisfiedLinkError e) {
|
||||||
|
System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e);
|
||||||
|
System.exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String argv[]) {
|
||||||
|
{
|
||||||
|
DefaultBar bar = new DefaultBar(20.0, new SomeType(), 10);
|
||||||
|
double d = bar.getCType();
|
||||||
|
SomeType s = bar.getDType();
|
||||||
|
int i = bar.getEType();
|
||||||
|
d = bar.method(d, s, i);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
DefaultFoo foo = new DefaultFoo(new SomeType());
|
||||||
|
SomeType s = foo.getTType();
|
||||||
|
s = foo.method(s);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
BarAnotherTypeBool bar = new BarAnotherTypeBool(new AnotherType(), true, 10);
|
||||||
|
AnotherType a = bar.getCType();
|
||||||
|
boolean b = bar.getDType();
|
||||||
|
int i = bar.getEType();
|
||||||
|
a = bar.method(a, b, i);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
FooAnotherType foo = new FooAnotherType(new AnotherType());
|
||||||
|
AnotherType a = foo.getTType();
|
||||||
|
a = foo.method(a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
33
Examples/test-suite/template_default_class_parms.i
Normal file
33
Examples/test-suite/template_default_class_parms.i
Normal file
|
|
@ -0,0 +1,33 @@
|
||||||
|
%module template_default_class_parms
|
||||||
|
|
||||||
|
%inline %{
|
||||||
|
namespace Space {
|
||||||
|
struct SomeType {};
|
||||||
|
struct AnotherType {};
|
||||||
|
template<typename C, typename D = SomeType, typename E = int> class Bar {
|
||||||
|
public:
|
||||||
|
C CType;
|
||||||
|
D DType;
|
||||||
|
E EType;
|
||||||
|
Bar(C c, D d, E e) {}
|
||||||
|
C method(C c, D d, E e) { return c; }
|
||||||
|
};
|
||||||
|
template<typename T = SomeType> class Foo {
|
||||||
|
public:
|
||||||
|
T TType;
|
||||||
|
Foo(T t) {}
|
||||||
|
T method(T t) { return t; }
|
||||||
|
};
|
||||||
|
template<typename T = int> class ATemplate {};
|
||||||
|
}
|
||||||
|
%}
|
||||||
|
|
||||||
|
// Use defaults
|
||||||
|
%template(DefaultBar) Space::Bar<double>;
|
||||||
|
%template(DefaultFoo) Space::Foo<>;
|
||||||
|
|
||||||
|
// Don't use all defaults
|
||||||
|
%template(BarAnotherTypeBool) Space::Bar<Space::AnotherType, bool>;
|
||||||
|
%template(FooAnotherType) Space::Foo<Space::AnotherType>;
|
||||||
|
|
||||||
|
%template() Space::ATemplate<>;
|
||||||
|
|
@ -2537,7 +2537,8 @@ template_directive: SWIGTEMPLATE LPAREN idstringopt RPAREN idcolonnt LESSTHAN va
|
||||||
|
|
||||||
This is closer to the C++ (typedef) behavior.
|
This is closer to the C++ (typedef) behavior.
|
||||||
*/
|
*/
|
||||||
n = Swig_cparse_template_locate($5,$7,tscope);
|
Parm *parms = $7;
|
||||||
|
n = Swig_cparse_template_locate($5,parms,tscope);
|
||||||
|
|
||||||
/* Patch the argument types to respect namespaces */
|
/* Patch the argument types to respect namespaces */
|
||||||
p = $7;
|
p = $7;
|
||||||
|
|
@ -2588,7 +2589,7 @@ template_directive: SWIGTEMPLATE LPAREN idstringopt RPAREN idcolonnt LESSTHAN va
|
||||||
continue;
|
continue;
|
||||||
} else {
|
} else {
|
||||||
String *tname = Copy($5);
|
String *tname = Copy($5);
|
||||||
int def_supplied = 0;
|
int def_supplied = 0;
|
||||||
/* Expand the template */
|
/* Expand the template */
|
||||||
Node *templ = Swig_symbol_clookup($5,0);
|
Node *templ = Swig_symbol_clookup($5,0);
|
||||||
Parm *targs = templ ? Getattr(templ,"templateparms") : 0;
|
Parm *targs = templ ? Getattr(templ,"templateparms") : 0;
|
||||||
|
|
@ -2600,6 +2601,12 @@ template_directive: SWIGTEMPLATE LPAREN idstringopt RPAREN idcolonnt LESSTHAN va
|
||||||
/* Create typedef's and arguments */
|
/* Create typedef's and arguments */
|
||||||
p = $7;
|
p = $7;
|
||||||
tp = temparms;
|
tp = temparms;
|
||||||
|
if (!p && ParmList_len(p) != ParmList_len(temparms)) {
|
||||||
|
/* we have no template parameters supplied in %template for a template that has default args*/
|
||||||
|
p = tp;
|
||||||
|
def_supplied = 1;
|
||||||
|
}
|
||||||
|
|
||||||
while (p) {
|
while (p) {
|
||||||
String *value = Getattr(p,"value");
|
String *value = Getattr(p,"value");
|
||||||
if (def_supplied) {
|
if (def_supplied) {
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,7 @@ void Swig_cparse_debug_templates(int x) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -----------------------------------------------------------------------------
|
/* -----------------------------------------------------------------------------
|
||||||
* Swig_cparse_template_expand()
|
* cparse_template_expand()
|
||||||
*
|
*
|
||||||
* Expands a template node into a specialized version. This is done by
|
* Expands a template node into a specialized version. This is done by
|
||||||
* patching typenames and other aspects of the node according to a list of
|
* patching typenames and other aspects of the node according to a list of
|
||||||
|
|
@ -230,6 +230,10 @@ String *partial_arg(String *s, String *p) {
|
||||||
return newarg;
|
return newarg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* -----------------------------------------------------------------------------
|
||||||
|
* Swig_cparse_template_expand()
|
||||||
|
* ----------------------------------------------------------------------------- */
|
||||||
|
|
||||||
int Swig_cparse_template_expand(Node *n, String *rname, ParmList *tparms, Symtab *tscope) {
|
int Swig_cparse_template_expand(Node *n, String *rname, ParmList *tparms, Symtab *tscope) {
|
||||||
List *patchlist, *cpatchlist, *typelist;
|
List *patchlist, *cpatchlist, *typelist;
|
||||||
String *templateargs;
|
String *templateargs;
|
||||||
|
|
@ -429,6 +433,7 @@ static Node *template_locate(String *name, Parm *tparms, Symtab *tscope) {
|
||||||
Parm *p;
|
Parm *p;
|
||||||
Parm *parms;
|
Parm *parms;
|
||||||
Parm *targs;
|
Parm *targs;
|
||||||
|
ParmList *expandedparms;
|
||||||
|
|
||||||
tname = Copy(name);
|
tname = Copy(name);
|
||||||
parms = CopyParmList(tparms);
|
parms = CopyParmList(tparms);
|
||||||
|
|
@ -441,12 +446,14 @@ static Node *template_locate(String *name, Parm *tparms, Symtab *tscope) {
|
||||||
Symtab *tsdecl = Getattr(templ, "sym:symtab");
|
Symtab *tsdecl = Getattr(templ, "sym:symtab");
|
||||||
|
|
||||||
targs = Getattr(templ, "templateparms");
|
targs = Getattr(templ, "templateparms");
|
||||||
Swig_symbol_template_defargs(parms, targs, tscope, tsdecl);
|
expandedparms = Swig_symbol_template_defargs(parms, targs, tscope, tsdecl);
|
||||||
|
} else {
|
||||||
|
expandedparms = parms;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* reduce the typedef */
|
/* reduce the typedef */
|
||||||
p = parms;
|
p = expandedparms;
|
||||||
while (p) {
|
while (p) {
|
||||||
SwigType *ty = Getattr(p, "type");
|
SwigType *ty = Getattr(p, "type");
|
||||||
if (ty) {
|
if (ty) {
|
||||||
|
|
@ -457,7 +464,7 @@ static Node *template_locate(String *name, Parm *tparms, Symtab *tscope) {
|
||||||
p = nextSibling(p);
|
p = nextSibling(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
SwigType_add_template(tname, parms);
|
SwigType_add_template(tname, expandedparms);
|
||||||
|
|
||||||
if (template_debug) {
|
if (template_debug) {
|
||||||
Printf(stdout, "\n%s:%d: template_debug: Searching for %s\n", cparse_file, cparse_line, tname);
|
Printf(stdout, "\n%s:%d: template_debug: Searching for %s\n", cparse_file, cparse_line, tname);
|
||||||
|
|
|
||||||
|
|
@ -222,7 +222,7 @@ extern "C" {
|
||||||
extern String *Swig_symbol_string_qualify(String *s, Symtab *tab);
|
extern String *Swig_symbol_string_qualify(String *s, Symtab *tab);
|
||||||
extern SwigType *Swig_symbol_typedef_reduce(SwigType *ty, Symtab *tab);
|
extern SwigType *Swig_symbol_typedef_reduce(SwigType *ty, Symtab *tab);
|
||||||
|
|
||||||
extern void Swig_symbol_template_defargs(Parm *parms, Parm *targs, Symtab *tscope, Symtab *tsdecl);
|
extern ParmList *Swig_symbol_template_defargs(Parm *parms, Parm *targs, Symtab *tscope, Symtab *tsdecl);
|
||||||
extern SwigType *Swig_symbol_template_deftype(const SwigType *type, Symtab *tscope);
|
extern SwigType *Swig_symbol_template_deftype(const SwigType *type, Symtab *tscope);
|
||||||
extern SwigType *Swig_symbol_template_param_eval(const SwigType *p, Symtab *symtab);
|
extern SwigType *Swig_symbol_template_param_eval(const SwigType *p, Symtab *symtab);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1669,10 +1669,14 @@ String *Swig_symbol_string_qualify(String *s, Symtab *st) {
|
||||||
* Swig_symbol_template_defargs()
|
* Swig_symbol_template_defargs()
|
||||||
*
|
*
|
||||||
* Apply default arg from generic template default args
|
* Apply default arg from generic template default args
|
||||||
|
* Returns a parameter list which contains missing default arguments (if any)
|
||||||
|
* Note side effects: parms will also contain the extra parameters in its list
|
||||||
|
* (but only if non-zero).
|
||||||
* ----------------------------------------------------------------------------- */
|
* ----------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
|
||||||
void Swig_symbol_template_defargs(Parm *parms, Parm *targs, Symtab *tscope, Symtab *tsdecl) {
|
ParmList *Swig_symbol_template_defargs(Parm *parms, Parm *targs, Symtab *tscope, Symtab *tsdecl) {
|
||||||
|
ParmList *expandedparms = parms;
|
||||||
if (Len(parms) < Len(targs)) {
|
if (Len(parms) < Len(targs)) {
|
||||||
Parm *lp = parms;
|
Parm *lp = parms;
|
||||||
Parm *p = lp;
|
Parm *p = lp;
|
||||||
|
|
@ -1713,7 +1717,10 @@ void Swig_symbol_template_defargs(Parm *parms, Parm *targs, Symtab *tscope, Symt
|
||||||
}
|
}
|
||||||
/* Printf(stderr,"value %s %s %s\n",value,ntr,ntq); */
|
/* Printf(stderr,"value %s %s %s\n",value,ntr,ntq); */
|
||||||
cp = NewParm(ntq, 0);
|
cp = NewParm(ntq, 0);
|
||||||
set_nextSibling(lp, cp);
|
if (lp)
|
||||||
|
set_nextSibling(lp, cp);
|
||||||
|
else
|
||||||
|
expandedparms = CopyParm(cp);
|
||||||
lp = cp;
|
lp = cp;
|
||||||
tp = nextSibling(tp);
|
tp = nextSibling(tp);
|
||||||
Delete(cp);
|
Delete(cp);
|
||||||
|
|
@ -1724,6 +1731,7 @@ void Swig_symbol_template_defargs(Parm *parms, Parm *targs, Symtab *tscope, Symt
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return expandedparms;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -----------------------------------------------------------------------------
|
/* -----------------------------------------------------------------------------
|
||||||
|
|
@ -1795,6 +1803,7 @@ SwigType *Swig_symbol_template_deftype(const SwigType *type, Symtab *tscope) {
|
||||||
#endif
|
#endif
|
||||||
if (tempn) {
|
if (tempn) {
|
||||||
ParmList *tnargs = Getattr(tempn, "templateparms");
|
ParmList *tnargs = Getattr(tempn, "templateparms");
|
||||||
|
ParmList *expandedparms;
|
||||||
Parm *p;
|
Parm *p;
|
||||||
Symtab *tsdecl = Getattr(tempn, "sym:symtab");
|
Symtab *tsdecl = Getattr(tempn, "sym:symtab");
|
||||||
|
|
||||||
|
|
@ -1802,8 +1811,8 @@ SwigType *Swig_symbol_template_deftype(const SwigType *type, Symtab *tscope) {
|
||||||
Printf(stderr, "deftype type %s %s %s\n", tprefix, targs, tsuffix);
|
Printf(stderr, "deftype type %s %s %s\n", tprefix, targs, tsuffix);
|
||||||
#endif
|
#endif
|
||||||
Append(tprefix, "<(");
|
Append(tprefix, "<(");
|
||||||
Swig_symbol_template_defargs(tparms, tnargs, tscope, tsdecl);
|
expandedparms = Swig_symbol_template_defargs(tparms, tnargs, tscope, tsdecl);
|
||||||
p = tparms;
|
p = expandedparms;
|
||||||
tscope = tsdecl;
|
tscope = tsdecl;
|
||||||
while (p) {
|
while (p) {
|
||||||
SwigType *ptype = Getattr(p, "type");
|
SwigType *ptype = Getattr(p, "type");
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue