From 525426911cecb9a228c62e9e26ed9e7e8a3910e0 Mon Sep 17 00:00:00 2001 From: William S Fulton Date: Fri, 21 Jul 2023 19:28:27 +0100 Subject: [PATCH] C++11 using declarations for inheriting implicit base templated constructors Testcase - compiles given previous commit, but needs more work! --- .../cpp11_director_using_constructor.i | 4 +++ Examples/test-suite/cpp11_using_constructor.i | 35 ++++++++++++++++++- .../java/cpp11_using_constructor_runme.java | 5 +++ 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/Examples/test-suite/cpp11_director_using_constructor.i b/Examples/test-suite/cpp11_director_using_constructor.i index f76624969..91d25711c 100644 --- a/Examples/test-suite/cpp11_director_using_constructor.i +++ b/Examples/test-suite/cpp11_director_using_constructor.i @@ -5,4 +5,8 @@ %feature("director"); +%warnfilter(SWIGWARN_LANG_DIRECTOR_ABSTRACT) TemplateConstructor1Derived; +%warnfilter(SWIGWARN_LANG_DIRECTOR_ABSTRACT) TemplateConstructor2Base; +%warnfilter(SWIGWARN_LANG_DIRECTOR_ABSTRACT) TemplateConstructor2Derived; + %include "cpp11_using_constructor.i" diff --git a/Examples/test-suite/cpp11_using_constructor.i b/Examples/test-suite/cpp11_using_constructor.i index 9772f7086..6c3e793e3 100644 --- a/Examples/test-suite/cpp11_using_constructor.i +++ b/Examples/test-suite/cpp11_using_constructor.i @@ -423,7 +423,6 @@ struct TemplPublicBase6 { #endif virtual void meth() {} }; - %} %template(TemplPublicBase1Int) TemplPublicBase1; @@ -472,3 +471,37 @@ struct TemplPublicDerived6 : TemplPublicBase6 { %template(TemplPublicDerived4Int) TemplPublicDerived4; %template(TemplPublicDerived5Int) TemplPublicDerived5; %template(TemplPublicDerived6Int) TemplPublicDerived6; + + +// Templated constructors +%inline %{ +struct TemplateConstructor1Base { + virtual ~TemplateConstructor1Base() {} + // No implicit constructor + template TemplateConstructor1Base(const T &t, const char *s) {} + virtual void meth() {} +}; +%} + +%template(TemplateConstructor1Base) TemplateConstructor1Base::TemplateConstructor1Base; + +%inline %{ +struct TemplateConstructor1Derived : TemplateConstructor1Base { + using TemplateConstructor1Base::TemplateConstructor1Base; + using TemplateConstructor1Base::meth; +}; +%} + +// TODO: Missing constructors, below probably ought to work using instantiation as follows: +//%template(TemplateConstructor1Derived) TemplateConstructor1Derived::TemplateConstructor1Derived; + +%{ +void tester() { + TemplateConstructor1Derived tc = TemplateConstructor1Derived(123, "hi"); + tc.meth(); + // Note not valid c++: + // TemplateConstructor1Derived tc2 = TemplateConstructor1Derived::TemplateConstructor1Derived(123, "hi"); +} +%} + +// Note that templated methods also not working with using declarations for inheriting from base templated methods diff --git a/Examples/test-suite/java/cpp11_using_constructor_runme.java b/Examples/test-suite/java/cpp11_using_constructor_runme.java index eed27693f..b6ccc305a 100644 --- a/Examples/test-suite/java/cpp11_using_constructor_runme.java +++ b/Examples/test-suite/java/cpp11_using_constructor_runme.java @@ -127,5 +127,10 @@ public class cpp11_using_constructor_runme { new TemplPublicDerived5Int().meth(); new TemplPublicDerived6Int(0, "hi").meth(); new TemplPublicDerived6Int().meth(); + + // Templated constructors + new TemplateConstructor1Base(0, "hi").meth(); + // TODO: missing constructor... + // new TemplateConstructor1Derived(0, "hi").meth(); } }