From 004af63f3cef63fbe91389cec1ad0c84498915e2 Mon Sep 17 00:00:00 2001 From: William S Fulton Date: Thu, 29 Dec 2022 21:04:48 +0000 Subject: Syntax error fixes parsing more elaborate parameter pack arguments that are function pointers and member function pointers. template struct VariadicParms { void ParmsFuncPtrPtr(int (*)(V*...)) {} void ParmsFuncPtrPtrRef(int (*)(V*&...)) {} void ParmsFuncPtrPtrRValueRef(int (*)(V*&&...)) {} void ParmsFuncPtrRef(int (*)(V&...)) {} void ParmsFuncPtrRValueRef(int (*)(V&&...)) {} void ParmsMemFuncPtrPtr(int (KlassMemFuncs::*)(V*...)) {} void ParmsMemFuncPtrPtrRef(int (KlassMemFuncs::*)(V*&...)) {} void ParmsMemFuncPtrPtrRValueRef(int (KlassMemFuncs::*)(V*&&...)) {} void ParmsMemFuncPtrRef(int (KlassMemFuncs::*)(V&...)) {} void ParmsMemFuncPtrRValueRef(int (KlassMemFuncs::*)(V&&...)) {} }; %template(VariadicParms0) VariadicParms<>; %template(VariadicParms1) VariadicParms; Also in various other places such as within noexcept specifiers: template void emplace(Args &&... args) noexcept( std::is_nothrow_constructible::value); Issue #1863 --- Examples/test-suite/cpp11_variadic_templates.i | 30 +++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) (limited to 'Examples') diff --git a/Examples/test-suite/cpp11_variadic_templates.i b/Examples/test-suite/cpp11_variadic_templates.i index c053e8020..287409b10 100644 --- a/Examples/test-suite/cpp11_variadic_templates.i +++ b/Examples/test-suite/cpp11_variadic_templates.i @@ -147,7 +147,6 @@ struct KlassMemFuncs { int memfunc3() { return 3; } }; template struct VariadicParms { -public: void ParmsVal(V... vparms_v) {} void ParmsPtr(V*... vparms_p) {} void ParmsPtrRef(V*&... vparms_pr) {} @@ -157,9 +156,20 @@ public: void ParmsConstRef(const V&... vparms_cr) {} void ParmsFuncPtrVal(int (*)(V...)) {} + void ParmsFuncPtrPtr(int (*)(V*...)) {} + void ParmsFuncPtrPtrRef(int (*)(V*&...)) {} + void ParmsFuncPtrPtrRValueRef(int (*)(V*&&...)) {} + void ParmsFuncPtrRef(int (*)(V&...)) {} + void ParmsFuncPtrRValueRef(int (*)(V&&...)) {} + void ParmsFuncPtrConstRef(int (*)(const V&...)) {} + void ParmsMemFuncPtrVal(int (KlassMemFuncs::*)(V...)) {} -// TODO -// void ParmsFuncPtrRef(int (*)(V&...)) {} + void ParmsMemFuncPtrPtr(int (KlassMemFuncs::*)(V*...)) {} + void ParmsMemFuncPtrPtrRef(int (KlassMemFuncs::*)(V*&...)) {} + void ParmsMemFuncPtrPtrRValueRef(int (KlassMemFuncs::*)(V*&&...)) {} + void ParmsMemFuncPtrRef(int (KlassMemFuncs::*)(V&...)) {} + void ParmsMemFuncPtrRValueRef(int (KlassMemFuncs::*)(V&&...)) {} + void ParmsMemFuncPtrConstRef(int (KlassMemFuncs::*)(const V&...)) {} }; %} @@ -209,3 +219,17 @@ template void Container::notifyMyTypes<>(void (tt)()); template void Container::notifyMyTypes(void (tt)(int)); template void Container::notifyMyTypes(void (tt)(int, double)); %} + +// #1863 +%inline %{ +#include +class EmplaceContainer { +public: +template +void emplace(Args &&... args) noexcept( + std::is_nothrow_constructible::value) {} +}; +%} + +%template(emplace) EmplaceContainer::emplace; +//%template(emplace) EmplaceContainer::emplace; -- cgit v1.2.1