mirror of https://github.com/swig/swig
C++11 using declarations for inheriting constructors - template classes with template base classes
Internal using name no longer contains template parameters. Fixes symbol table lookup for non-instantiated template constructor. Builds on previous few commits where the internal name no longer contains the template parameters for constructors and destructors.
This commit is contained in:
parent
e138b0bae1
commit
a0bde3f319
|
@ -2,7 +2,6 @@
|
|||
|
||||
// test access changing from protected to public
|
||||
|
||||
#if !defined(SWIGD)
|
||||
%inline %{
|
||||
|
||||
template<typename T> class Base {
|
||||
|
@ -48,5 +47,3 @@ public:
|
|||
%template(BaseInt) Base<int>;
|
||||
%template(DerivedInt) Derived<int>;
|
||||
%template(BottomInt) Bottom<int>;
|
||||
|
||||
#endif
|
||||
|
|
|
@ -290,3 +290,65 @@ struct TemplatePublicDerived4 : PublicBase4 {
|
|||
%template(TemplatePublicDerived2Int) TemplatePublicDerived2<int>;
|
||||
%template(TemplatePublicDerived3Int) TemplatePublicDerived3<int>;
|
||||
%template(TemplatePublicDerived4Int) TemplatePublicDerived4<int>;
|
||||
|
||||
%inline %{
|
||||
// Templates and public base constructors (derive from template)
|
||||
template<typename T>
|
||||
struct TemplPublicBase1 {
|
||||
TemplPublicBase1(T i, const char* s) {}
|
||||
void meth() {}
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
struct TemplPublicBase2 {
|
||||
TemplPublicBase2(T i, const char* s) {}
|
||||
TemplPublicBase2() {}
|
||||
void meth() {}
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
struct TemplPublicBase3 {
|
||||
TemplPublicBase3(T i, const char* s) {}
|
||||
TemplPublicBase3() = default;
|
||||
void meth() {}
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
struct TemplPublicBase4 {
|
||||
TemplPublicBase4() = default;
|
||||
void meth() {}
|
||||
};
|
||||
%}
|
||||
|
||||
%template(TemplPublicBase1Int) TemplPublicBase1<int>;
|
||||
%template(TemplPublicBase2Int) TemplPublicBase2<int>;
|
||||
%template(TemplPublicBase3Int) TemplPublicBase3<int>;
|
||||
%template(TemplPublicBase4Int) TemplPublicBase4<int>;
|
||||
|
||||
%inline %{
|
||||
template<typename T>
|
||||
struct TemplPublicDerived1 : TemplPublicBase1<T> {
|
||||
using TemplPublicBase1<T>::TemplPublicBase1;
|
||||
using TemplPublicBase1<T>::meth;
|
||||
};
|
||||
template<typename T>
|
||||
struct TemplPublicDerived2 : TemplPublicBase2<T> {
|
||||
using TemplPublicBase2<T>::TemplPublicBase2;
|
||||
using TemplPublicBase2<T>::meth;
|
||||
};
|
||||
template<typename T>
|
||||
struct TemplPublicDerived3 : TemplPublicBase3<T> {
|
||||
using TemplPublicBase3<T>::TemplPublicBase3;
|
||||
using TemplPublicBase3<T>::meth;
|
||||
};
|
||||
template<typename T>
|
||||
struct TemplPublicDerived4 : TemplPublicBase4<T> {
|
||||
using TemplPublicBase4<T>::TemplPublicBase4;
|
||||
using TemplPublicBase4<T>::meth;
|
||||
};
|
||||
%}
|
||||
|
||||
%template(TemplPublicDerived1Int) TemplPublicDerived1<int>;
|
||||
%template(TemplPublicDerived2Int) TemplPublicDerived2<int>;
|
||||
%template(TemplPublicDerived3Int) TemplPublicDerived3<int>;
|
||||
%template(TemplPublicDerived4Int) TemplPublicDerived4<int>;
|
||||
|
|
|
@ -99,5 +99,12 @@ public class cpp11_using_constructor_runme {
|
|||
new TemplatePublicDerived3Int(0, "hi").meth();
|
||||
new TemplatePublicDerived4Int().meth();
|
||||
|
||||
// Templates and public base constructors (derive from template)
|
||||
new TemplPublicDerived1Int(0, "hi").meth();
|
||||
new TemplPublicDerived2Int().meth();
|
||||
new TemplPublicDerived2Int(0, "hi").meth();
|
||||
new TemplPublicDerived3Int().meth();
|
||||
new TemplPublicDerived3Int(0, "hi").meth();
|
||||
new TemplPublicDerived4Int().meth();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -86,3 +86,11 @@ TemplatePublicDerived2Int(0, "hi").meth()
|
|||
TemplatePublicDerived3Int().meth()
|
||||
TemplatePublicDerived3Int(0, "hi").meth()
|
||||
TemplatePublicDerived4Int().meth()
|
||||
|
||||
# Templates and public base constructors (derive from template)
|
||||
TemplPublicDerived1Int(0, "hi").meth()
|
||||
TemplPublicDerived2Int().meth()
|
||||
TemplPublicDerived2Int(0, "hi").meth()
|
||||
TemplPublicDerived3Int().meth()
|
||||
TemplPublicDerived3Int(0, "hi").meth()
|
||||
TemplPublicDerived4Int().meth()
|
||||
|
|
|
@ -455,19 +455,28 @@ static void add_symbols(Node *n) {
|
|||
Node *ns = Swig_symbol_clookup(uname, stab);
|
||||
String *ntype = 0;
|
||||
if (!ns && SwigType_istemplate(uname)) {
|
||||
String *tmp = Swig_symbol_template_deftype(uname, 0);
|
||||
if (!Equal(tmp, uname)) {
|
||||
ns = Swig_symbol_clookup(tmp, stab);
|
||||
String *tbase = SwigType_templateprefix(uname);
|
||||
String *uname_template = NewStringf("%s%s", tbase, SwigType_templatesuffix(uname));
|
||||
ns = Swig_symbol_clookup(uname_template, stab);
|
||||
if (!ns) {
|
||||
String *tmp = Swig_symbol_template_deftype(uname, 0);
|
||||
if (!Equal(tmp, uname)) {
|
||||
ns = Swig_symbol_clookup(tmp, stab);
|
||||
}
|
||||
Delete(tmp);
|
||||
}
|
||||
Delete(tmp);
|
||||
Delete(tbase);
|
||||
Delete(uname_template);
|
||||
}
|
||||
if (ns) {
|
||||
ntype = nodeType(ns);
|
||||
if (Equal(ntype, "constructor")) {
|
||||
// The using declaration name for inheriting constructors is the base class constructor name
|
||||
// not the name provided by the using declaration. Correct it here.
|
||||
String *nname = Getattr(stab, "name");
|
||||
/* The using declaration name for inheriting constructors is the base class constructor name
|
||||
* not the name provided by the using declaration. Correct it here. */
|
||||
String *stabname = Getattr(stab, "name");
|
||||
String *nname = SwigType_templateprefix(stabname);
|
||||
Setattr(n, "name", nname);
|
||||
Delete(nname);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
|
|
@ -307,8 +307,6 @@ static void cparse_template_expand(Node *templnode, Node *n, String *tname, Stri
|
|||
}
|
||||
if (strchr(Char(name), '<')) {
|
||||
Append(patchlist, Getattr(n, "name"));
|
||||
} else {
|
||||
Append(name, templateargs);
|
||||
}
|
||||
name = Getattr(n, "sym:name");
|
||||
if (name) {
|
||||
|
|
Loading…
Reference in New Issue