fix for template+default template params, better warnings, better management of extern "java"
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@6424 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
parent
9d9580639a
commit
ced0d5e023
3 changed files with 116 additions and 25 deletions
|
|
@ -55,6 +55,7 @@ extern int need_redefined_warn(Node* a, Node* b, int InClass);
|
||||||
|
|
||||||
|
|
||||||
/* templ.c */
|
/* templ.c */
|
||||||
|
extern void Swig_cparse_template_defargs(Parm *parms, Parm *targs);
|
||||||
extern int Swig_cparse_template_expand(Node *n, String *rname, ParmList *tparms);
|
extern int Swig_cparse_template_expand(Node *n, String *rname, ParmList *tparms);
|
||||||
extern Node *Swig_cparse_template_locate(String *name, ParmList *tparms);
|
extern Node *Swig_cparse_template_locate(String *name, ParmList *tparms);
|
||||||
extern void Swig_cparse_debug_templates(int);
|
extern void Swig_cparse_debug_templates(int);
|
||||||
|
|
|
||||||
|
|
@ -57,6 +57,16 @@ static int dirprot_mode = 0;
|
||||||
* Assist Functions
|
* Assist Functions
|
||||||
* ----------------------------------------------------------------------------- */
|
* ----------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#define SWIG_WARN_NODE_BEGIN(Node) \
|
||||||
|
{ \
|
||||||
|
String *wrn = Getattr(Node,"feature:warnfilter"); \
|
||||||
|
if (wrn) Swig_warnfilter(wrn,1)
|
||||||
|
|
||||||
|
#define SWIG_WARN_NODE_END(Node) \
|
||||||
|
if (wrn) Swig_warnfilter(wrn,0); \
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Called by the parser (yyparse) when an error is found.*/
|
/* Called by the parser (yyparse) when an error is found.*/
|
||||||
static void yyerror (const char *e) {
|
static void yyerror (const char *e) {
|
||||||
(void)e;
|
(void)e;
|
||||||
|
|
@ -407,6 +417,7 @@ static void add_symbols(Node *n) {
|
||||||
Printf(ec," (Renamed from '%s')", SwigType_namestr(Getattr(c,"name")));
|
Printf(ec," (Renamed from '%s')", SwigType_namestr(Getattr(c,"name")));
|
||||||
}
|
}
|
||||||
Printf(ec,".");
|
Printf(ec,".");
|
||||||
|
SWIG_WARN_NODE_BEGIN(n);
|
||||||
if (redefined) {
|
if (redefined) {
|
||||||
Swig_warning(WARN_PARSE_REDEFINED,Getfile(n),Getline(n),"%s\n",en);
|
Swig_warning(WARN_PARSE_REDEFINED,Getfile(n),Getline(n),"%s\n",en);
|
||||||
Swig_warning(WARN_PARSE_REDEFINED,Getfile(c),Getline(c),"%s\n",ec);
|
Swig_warning(WARN_PARSE_REDEFINED,Getfile(c),Getline(c),"%s\n",ec);
|
||||||
|
|
@ -414,6 +425,7 @@ static void add_symbols(Node *n) {
|
||||||
Swig_warning(WARN_PARSE_REDUNDANT,Getfile(n),Getline(n),"%s\n",en);
|
Swig_warning(WARN_PARSE_REDUNDANT,Getfile(n),Getline(n),"%s\n",en);
|
||||||
Swig_warning(WARN_PARSE_REDUNDANT,Getfile(c),Getline(c),"%s\n",ec);
|
Swig_warning(WARN_PARSE_REDUNDANT,Getfile(c),Getline(c),"%s\n",ec);
|
||||||
}
|
}
|
||||||
|
SWIG_WARN_NODE_END(n);
|
||||||
Printf(e,"%s:%d:%s\n%s:%d:%s\n",Getfile(n),Getline(n),en,
|
Printf(e,"%s:%d:%s\n%s:%d:%s\n",Getfile(n),Getline(n),en,
|
||||||
Getfile(c),Getline(c),ec);
|
Getfile(c),Getline(c),ec);
|
||||||
Setattr(n,"error",e);
|
Setattr(n,"error",e);
|
||||||
|
|
@ -559,8 +571,10 @@ static void merge_extensions(Node *cls, Node *am) {
|
||||||
String *ec = NewString("");
|
String *ec = NewString("");
|
||||||
Printf(ec,"Identifier '%s' redefined by %%extend (ignored),",symname);
|
Printf(ec,"Identifier '%s' redefined by %%extend (ignored),",symname);
|
||||||
Printf(en,"%%extend definition of '%s'.",symname);
|
Printf(en,"%%extend definition of '%s'.",symname);
|
||||||
|
SWIG_WARN_NODE_BEGIN(n);
|
||||||
Swig_warning(WARN_PARSE_REDEFINED,Getfile(csym),Getline(csym),"%s\n",ec);
|
Swig_warning(WARN_PARSE_REDEFINED,Getfile(csym),Getline(csym),"%s\n",ec);
|
||||||
Swig_warning(WARN_PARSE_REDEFINED,Getfile(n),Getline(n),"%s\n",en);
|
Swig_warning(WARN_PARSE_REDEFINED,Getfile(n),Getline(n),"%s\n",en);
|
||||||
|
SWIG_WARN_NODE_END(n);
|
||||||
Printf(e,"%s:%d:%s\n%s:%d:%s\n",Getfile(csym),Getline(csym),ec,
|
Printf(e,"%s:%d:%s\n%s:%d:%s\n",Getfile(csym),Getline(csym),ec,
|
||||||
Getfile(n),Getline(n),en);
|
Getfile(n),Getline(n),en);
|
||||||
Setattr(csym,"error",e);
|
Setattr(csym,"error",e);
|
||||||
|
|
@ -583,7 +597,9 @@ static void merge_extensions(Node *cls, Node *am) {
|
||||||
if (!extendhash) return;
|
if (!extendhash) return;
|
||||||
for (ki = First(extendhash); ki.key; ki = Next(ki)) {
|
for (ki = First(extendhash); ki.key; ki = Next(ki)) {
|
||||||
if (!Strstr(ki.key,"<")) {
|
if (!Strstr(ki.key,"<")) {
|
||||||
|
SWIG_WARN_NODE_BEGIN(ki.item);
|
||||||
Swig_warning(WARN_PARSE_EXTEND_UNDEF,Getfile(ki.item), Getline(ki.item), "%%extend defined for an undeclared class %s.\n", ki.key);
|
Swig_warning(WARN_PARSE_EXTEND_UNDEF,Getfile(ki.item), Getline(ki.item), "%%extend defined for an undeclared class %s.\n", ki.key);
|
||||||
|
SWIG_WARN_NODE_END(ki.item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -2004,6 +2020,7 @@ template_directive: SWIGTEMPLATE LPAREN idstringopt RPAREN idcolonnt LESSTHAN va
|
||||||
Node *tnode = 0;
|
Node *tnode = 0;
|
||||||
Symtab *tscope = 0;
|
Symtab *tscope = 0;
|
||||||
int specialized = 0;
|
int specialized = 0;
|
||||||
|
|
||||||
$$ = 0;
|
$$ = 0;
|
||||||
|
|
||||||
tscope = Swig_symbol_current(); /* Get the current scope */
|
tscope = Swig_symbol_current(); /* Get the current scope */
|
||||||
|
|
@ -2024,8 +2041,8 @@ template_directive: SWIGTEMPLATE LPAREN idstringopt RPAREN idcolonnt LESSTHAN va
|
||||||
Swig_error(cparse_file,cparse_line,"'%s' is not defined as namespace.\n", prefix);
|
Swig_error(cparse_file,cparse_line,"'%s' is not defined as namespace.\n", prefix);
|
||||||
ns = 0;
|
ns = 0;
|
||||||
} else {
|
} else {
|
||||||
/* Swig_symbol_setscope(Getattr(ns,"symtab"));
|
/* Swig_symbol_setscope(Getattr(ns,"symtab"));
|
||||||
Namespaceprefix = Swig_symbol_qualifiedscopename(0); */
|
Namespaceprefix = Swig_symbol_qualifiedscopename(0); */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2084,14 +2101,22 @@ template_directive: SWIGTEMPLATE LPAREN idstringopt RPAREN idcolonnt LESSTHAN va
|
||||||
/* Patch the argument types to respect namespaces */
|
/* Patch the argument types to respect namespaces */
|
||||||
p = $7;
|
p = $7;
|
||||||
while (p) {
|
while (p) {
|
||||||
if (!Getattr(p,"value")) {
|
SwigType *value = Getattr(p,"value");
|
||||||
|
if (!value) {
|
||||||
SwigType *ty = Getattr(p,"type");
|
SwigType *ty = Getattr(p,"type");
|
||||||
if (ty) {
|
if (ty) {
|
||||||
ty = Swig_symbol_type_qualify(ty,0);
|
SwigType *rty = Swig_symbol_typedef_reduce(ty,0);
|
||||||
/* ty = Swig_symbol_typedef_reduce(ty,0); */
|
ty = Swig_symbol_type_qualify(rty,0);
|
||||||
Setattr(p,"type",ty);
|
Setattr(p,"type",ty);
|
||||||
|
Delete(rty);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
SwigType *rty = Swig_symbol_typedef_reduce(value,0);
|
||||||
|
value = Swig_symbol_type_qualify(rty,0);
|
||||||
|
Setattr(p,"value",value);
|
||||||
|
Delete(rty);
|
||||||
}
|
}
|
||||||
|
|
||||||
p = nextSibling(p);
|
p = nextSibling(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2295,8 +2320,10 @@ c_declaration : c_decl {
|
||||||
Setattr($$,"name",$2);
|
Setattr($$,"name",$2);
|
||||||
appendChild($$,firstChild($4));
|
appendChild($$,firstChild($4));
|
||||||
} else {
|
} else {
|
||||||
Swig_warning(WARN_PARSE_UNDEFINED_EXTERN,cparse_file, cparse_line,"Unrecognized extern type \"%s\" (ignored).\n", $2);
|
Swig_warning(WARN_PARSE_UNDEFINED_EXTERN,cparse_file, cparse_line,"Unrecognized extern type \"%s\" (using extern \"C\").\n", $2);
|
||||||
$$ = 0;
|
$$ = new_node("extern");
|
||||||
|
Setattr($$,"name","C");
|
||||||
|
appendChild($$,firstChild($4));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
@ -2851,7 +2878,9 @@ cpp_template_decl : TEMPLATE LESSTHAN template_parms GREATERTHAN { template_para
|
||||||
String *tbase = SwigType_templateprefix(tname);
|
String *tbase = SwigType_templateprefix(tname);
|
||||||
tempn = Swig_symbol_clookup_local(tbase,0);
|
tempn = Swig_symbol_clookup_local(tbase,0);
|
||||||
if (!tempn || (Strcmp(nodeType(tempn),"template") != 0)) {
|
if (!tempn || (Strcmp(nodeType(tempn),"template") != 0)) {
|
||||||
|
SWIG_WARN_NODE_BEGIN(tempn);
|
||||||
Swig_warning(WARN_PARSE_TEMPLATE_SP_UNDEF, Getfile($$),Getline($$),"Specialization of non-template '%s'.\n", tbase);
|
Swig_warning(WARN_PARSE_TEMPLATE_SP_UNDEF, Getfile($$),Getline($$),"Specialization of non-template '%s'.\n", tbase);
|
||||||
|
SWIG_WARN_NODE_END(tempn);
|
||||||
tempn = 0;
|
tempn = 0;
|
||||||
error = 1;
|
error = 1;
|
||||||
}
|
}
|
||||||
|
|
@ -2980,11 +3009,13 @@ cpp_template_decl : TEMPLATE LESSTHAN template_parms GREATERTHAN { template_para
|
||||||
ffname = SwigType_templateprefix(fname);
|
ffname = SwigType_templateprefix(fname);
|
||||||
Append(ffname,"<(");
|
Append(ffname,"<(");
|
||||||
for (tt = First(tparms); tt.item; ) {
|
for (tt = First(tparms); tt.item; ) {
|
||||||
SwigType *ttr = Swig_symbol_typedef_reduce(tt.item,0);
|
SwigType *rtt = Swig_symbol_typedef_reduce(tt.item,0);
|
||||||
ttr = Swig_symbol_type_qualify(ttr,0);
|
SwigType *ttr = Swig_symbol_type_qualify(rtt,0);
|
||||||
Append(ffname,ttr);
|
Append(ffname,ttr);
|
||||||
tt = Next(tt);
|
tt = Next(tt);
|
||||||
if (tt.item) Putc(',',ffname);
|
if (tt.item) Putc(',',ffname);
|
||||||
|
Delete(rtt);
|
||||||
|
Delete(ttr);
|
||||||
}
|
}
|
||||||
Append(ffname,")>");
|
Append(ffname,")>");
|
||||||
}
|
}
|
||||||
|
|
@ -3006,18 +3037,22 @@ cpp_template_decl : TEMPLATE LESSTHAN template_parms GREATERTHAN { template_para
|
||||||
} else {
|
} else {
|
||||||
/* Need to resolve exact specialization name */
|
/* Need to resolve exact specialization name */
|
||||||
/* This needs to be rewritten */
|
/* This needs to be rewritten */
|
||||||
List *tparms;
|
ParmList *tparms;
|
||||||
String *fname;
|
String *fname;
|
||||||
Iterator tt;
|
Parm *p;
|
||||||
fname = SwigType_templateprefix(tname);
|
fname = SwigType_templateprefix(tname);
|
||||||
tparms = SwigType_parmlist(tname);
|
tparms = SwigType_function_parms(tname);
|
||||||
|
/* add default args from generic template */
|
||||||
|
Swig_cparse_template_defargs(tparms, Getattr(tempn,"templateparms"));
|
||||||
Append(fname,"<(");
|
Append(fname,"<(");
|
||||||
for (tt = First(tparms); tt.item; ) {
|
p = tparms;
|
||||||
SwigType *ttr = Swig_symbol_typedef_reduce(tt.item,0);
|
while (p){
|
||||||
|
SwigType *type = Getattr(p,"type");
|
||||||
|
SwigType *ttr = Swig_symbol_typedef_reduce(type ? type : Getattr(p,"value") ,0);
|
||||||
ttr = Swig_symbol_type_qualify(ttr,0);
|
ttr = Swig_symbol_type_qualify(ttr,0);
|
||||||
Append(fname,ttr);
|
Append(fname,ttr);
|
||||||
tt = Next(tt);
|
p = nextSibling(p);
|
||||||
if (tt.item) Putc(',',fname);
|
if (p) Putc(',',fname);
|
||||||
}
|
}
|
||||||
Append(fname,")>");
|
Append(fname,")>");
|
||||||
Swig_symbol_cadd(fname,$$);
|
Swig_symbol_cadd(fname,$$);
|
||||||
|
|
@ -3599,8 +3634,8 @@ storage_class : EXTERN { $$ = "extern"; }
|
||||||
if (strcmp($2,"C") == 0) {
|
if (strcmp($2,"C") == 0) {
|
||||||
$$ = "externc";
|
$$ = "externc";
|
||||||
} else {
|
} else {
|
||||||
Swig_warning(WARN_PARSE_UNDEFINED_EXTERN,cparse_file, cparse_line,"Unrecognized extern type \"%s\" (ignored).\n", $2);
|
Swig_warning(WARN_PARSE_UNDEFINED_EXTERN,cparse_file, cparse_line,"Unrecognized extern type \"%s\" (using extern \"C\").\n", $2);
|
||||||
$$ = 0;
|
$$ = "externc";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
| STATIC { $$ = "static"; }
|
| STATIC { $$ = "static"; }
|
||||||
|
|
|
||||||
|
|
@ -299,7 +299,6 @@ Swig_cparse_template_expand(Node *n, String *rname, ParmList *tparms) {
|
||||||
} else {
|
} else {
|
||||||
valuestr = SwigType_namestr(value);
|
valuestr = SwigType_namestr(value);
|
||||||
}
|
}
|
||||||
/* Printf(stdout,"valuestr = '%s'\n", valuestr); */
|
|
||||||
assert(value);
|
assert(value);
|
||||||
/* Need to patch default arguments */
|
/* Need to patch default arguments */
|
||||||
{
|
{
|
||||||
|
|
@ -380,6 +379,52 @@ Swig_cparse_template_expand(Node *n, String *rname, ParmList *tparms) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* -----------------------------------------------------------------------------
|
||||||
|
* Swig_cparse_template_defargs()
|
||||||
|
*
|
||||||
|
* Apply default arg from generic template default args
|
||||||
|
* ----------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Swig_cparse_template_defargs(Parm *parms, Parm *targs) {
|
||||||
|
if (Len(parms) < Len(targs)) {
|
||||||
|
Parm *lp = parms;
|
||||||
|
Parm *p = lp;
|
||||||
|
Parm *tp = targs;
|
||||||
|
while(p && tp) {
|
||||||
|
p = nextSibling(p);
|
||||||
|
tp = nextSibling(tp);
|
||||||
|
if (p) lp = p;
|
||||||
|
}
|
||||||
|
while (tp) {
|
||||||
|
String *value = Getattr(tp,"value");
|
||||||
|
if (value) {
|
||||||
|
Parm *cp;
|
||||||
|
Parm *ta = targs;
|
||||||
|
Parm *p = parms;
|
||||||
|
SwigType *nt = Swig_symbol_typedef_reduce(value,0);
|
||||||
|
while(p && ta) {
|
||||||
|
String *name = Getattr(ta,"name");
|
||||||
|
String *value = Getattr(p,"value");
|
||||||
|
if (!value) value = Getattr(p,"type");
|
||||||
|
Replace(nt, name, value, DOH_REPLACE_ID);
|
||||||
|
p = nextSibling(p);
|
||||||
|
ta = nextSibling(ta);
|
||||||
|
}
|
||||||
|
cp = NewParm(Swig_symbol_type_qualify(nt,0),0);
|
||||||
|
set_nextSibling(lp,cp);
|
||||||
|
lp = cp;
|
||||||
|
tp = nextSibling(tp);
|
||||||
|
Delete(nt);
|
||||||
|
} else {
|
||||||
|
tp = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* -----------------------------------------------------------------------------
|
/* -----------------------------------------------------------------------------
|
||||||
* template_locate()
|
* template_locate()
|
||||||
*
|
*
|
||||||
|
|
@ -394,17 +439,30 @@ template_locate(String *name, Parm *tparms) {
|
||||||
List *mpartials = 0;
|
List *mpartials = 0;
|
||||||
Parm *p;
|
Parm *p;
|
||||||
Parm *parms;
|
Parm *parms;
|
||||||
|
Parm *targs;
|
||||||
|
|
||||||
tname = NewString(name);
|
tname = NewString(name);
|
||||||
parms = CopyParmList(tparms);
|
parms = CopyParmList(tparms);
|
||||||
|
|
||||||
|
/* Search for generic template */
|
||||||
|
templ = Swig_symbol_clookup_local(name,0);
|
||||||
|
|
||||||
|
/* Add default values from generic template */
|
||||||
|
if (templ) {
|
||||||
|
targs = Getattr(templ,"templateparms");
|
||||||
|
Swig_cparse_template_defargs(parms, targs);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* reduce the typedef */
|
||||||
p = parms;
|
p = parms;
|
||||||
while (p) {
|
while (p) {
|
||||||
SwigType *ty = Getattr(p,"type");
|
SwigType *ty = Getattr(p,"type");
|
||||||
if (ty) {
|
if (ty) {
|
||||||
SwigType *nt = Swig_symbol_typedef_reduce(ty,0);
|
SwigType *rt = Swig_symbol_typedef_reduce(ty,0);
|
||||||
nt = Swig_symbol_type_qualify(nt,0);
|
SwigType *nt = Swig_symbol_type_qualify(rt,0);
|
||||||
Setattr(p,"type",nt);
|
Setattr(p,"type",nt);
|
||||||
|
Delete(rt);
|
||||||
}
|
}
|
||||||
p = nextSibling(p);
|
p = nextSibling(p);
|
||||||
}
|
}
|
||||||
|
|
@ -436,10 +494,7 @@ template_locate(String *name, Parm *tparms) {
|
||||||
return 0; /* Found a match, but it's not a template of any kind. */
|
return 0; /* Found a match, but it's not a template of any kind. */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Search for generic template */
|
|
||||||
templ = Swig_symbol_clookup_local(name,0);
|
|
||||||
|
|
||||||
/* Search for partial specialization.
|
/* Search for partial specialization.
|
||||||
Example: template<typename T> class name<T *> { ... } */
|
Example: template<typename T> class name<T *> { ... } */
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue