summaryrefslogtreecommitdiff
path: root/Examples
diff options
context:
space:
mode:
authorWilliam S Fulton <wsf@fultondesigns.co.uk>2022-12-27 19:36:40 +0000
committerWilliam S Fulton <wsf@fultondesigns.co.uk>2022-12-29 23:38:17 +0000
commit674abaddbf854e2374f115ef08e59fa79702e19a (patch)
tree73a7d41d03b31258284996f0239a295394ddb209 /Examples
parent70837bbc2638ec18bd07d333c6e474c89f4ce695 (diff)
downloadswig-674abaddbf854e2374f115ef08e59fa79702e19a.tar.gz
Fix instantiation of variadic class templates
containing parameter pack arguments that are function pointers. template <typename... V> struct VariadicParms { void ParmsFuncPtrVal(int (*)(V...)) {} }; %template(VariadicParms0) VariadicParms<>; %template(VariadicParms1) VariadicParms<A>;
Diffstat (limited to 'Examples')
-rw-r--r--Examples/test-suite/cpp11_variadic_templates.i35
1 files changed, 33 insertions, 2 deletions
diff --git a/Examples/test-suite/cpp11_variadic_templates.i b/Examples/test-suite/cpp11_variadic_templates.i
index bb370cebf..c053e8020 100644
--- a/Examples/test-suite/cpp11_variadic_templates.i
+++ b/Examples/test-suite/cpp11_variadic_templates.i
@@ -139,8 +139,13 @@ public:
%template (LotsInherit3) LotsInherit<A,B,C>;
%template (LotsInherit4) LotsInherit<A,B,C,D>;
-
%inline %{
+struct KlassMemFuncs {
+ int memfunc0() { return 0; }
+ int memfunc1() { return 1; }
+ int memfunc2() { return 2; }
+ int memfunc3() { return 3; }
+};
template <typename... V> struct VariadicParms {
public:
void ParmsVal(V... vparms_v) {}
@@ -151,15 +156,39 @@ public:
void ParmsRValueRef(V&&... vparms_r) {}
void ParmsConstRef(const V&... vparms_cr) {}
+ void ParmsFuncPtrVal(int (*)(V...)) {}
+ void ParmsMemFuncPtrVal(int (KlassMemFuncs::*)(V...)) {}
// TODO
-// void ParmsFuncPtr(int (*)(V...)) {}
+// void ParmsFuncPtrRef(int (*)(V&...)) {}
};
%}
+%template(VariadicParms0) VariadicParms<>;
%template(VariadicParms1) VariadicParms<A>;
%template(VariadicParms2) VariadicParms<A,B>;
%template(VariadicParms3) VariadicParms<A,B,C>;
+%inline %{
+template <typename... V> struct FixedAndVariadicParms {
+public:
+ void ParmsVal(short shortvar, V... vparms_v) {}
+ void ParmsPtr(short shortvar, V*... vparms_p) {}
+ void ParmsPtrRef(short shortvar, V*&... vparms_pr) {}
+ void ParmsPtrRValueRef(short shortvar, V*&&... vparms_rvr) {}
+ void ParmsRef(short shortvar, V&... vparms_r) {}
+ void ParmsRValueRef(short shortvar, V&&... vparms_r) {}
+ void ParmsConstRef(short shortvar, const V&... vparms_cr) {}
+
+ void ParmsFuncPtrVal(short shortvar, int (*)(short, V...)) {}
+ void ParmsMemFuncPtrVal(int (KlassMemFuncs::*)(V...)) {}
+};
+%}
+
+%template(FixedAndVariadicParms0) FixedAndVariadicParms<>;
+%template(FixedAndVariadicParms1) FixedAndVariadicParms<A>;
+%template(FixedAndVariadicParms2) FixedAndVariadicParms<A,B>;
+%template(FixedAndVariadicParms3) FixedAndVariadicParms<A,B,C>;
+
// #1863
%inline %{
@@ -167,11 +196,13 @@ class Container {
public:
template<typename... Args>
static void notifyMyTypes(void (fn)(Args...));
+//static void notifyMyTypes(void (*fn)(Args...));
};
%}
%{
template<typename... Args>
void Container::notifyMyTypes(void (fn)(Args...)) {}
+// void Container::notifyMyTypes(void (*fn)(Args...)) {}
// Explicit template instantiations
template void Container::notifyMyTypes<>(void (tt)());