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:
William S Fulton 2023-07-08 19:24:03 +01:00
parent e138b0bae1
commit a0bde3f319
6 changed files with 93 additions and 12 deletions

View File

@ -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

View File

@ -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>;

View File

@ -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();
}
}

View File

@ -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()

View File

@ -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 {

View File

@ -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) {