From 004af63f3cef63fbe91389cec1ad0c84498915e2 Mon Sep 17 00:00:00 2001 From: William S Fulton Date: Thu, 29 Dec 2022 21:04:48 +0000 Subject: [PATCH] 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 --- CHANGES.current | 27 +++++++++++++++++ .../test-suite/cpp11_variadic_templates.i | 30 +++++++++++++++++-- Source/CParse/parser.y | 27 ++++++++++------- 3 files changed, 71 insertions(+), 13 deletions(-) diff --git a/CHANGES.current b/CHANGES.current index e4733c773..4cdfee90c 100644 --- a/CHANGES.current +++ b/CHANGES.current @@ -7,6 +7,33 @@ the issue number to the end of the URL: https://github.com/swig/swig/issues/ Version 4.2.0 (in progress) =========================== +2022-12-29: wsfulton + #1863 Syntax error fixes parsing more elaborate parameter pack arguments that are + used in function pointers, 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); + 2022-12-27: wsfulton Fix instantiation of variadic class templates containing parameter pack arguments that are function pointers. 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; diff --git a/Source/CParse/parser.y b/Source/CParse/parser.y index d5fcd2fda..4035119a1 100644 --- a/Source/CParse/parser.y +++ b/Source/CParse/parser.y @@ -1684,7 +1684,7 @@ static String *add_qualifier_to_declarator(SwigType *type, SwigType *qualifier) %type templcpptype cpptype classkey classkeyopt; %type access_specifier; %type base_specifier; -%type variadic; +%type variadic_opt; %type type rawtype type_right anon_bitfield_type decltype ; %type base_list inherit raw_inherit; %type definetype def_args etype default_delete deleted_definition explicit_default; @@ -5877,11 +5877,12 @@ direct_declarator : idcolon { } ; -abstract_declarator : pointer { +abstract_declarator : pointer variadic_opt { $$.type = $1; $$.id = 0; $$.parms = 0; $$.have_parms = 0; + if ($2) SwigType_add_variadic($$.type); } | pointer direct_abstract_declarator { $$ = $2; @@ -5889,19 +5890,21 @@ abstract_declarator : pointer { $$.type = $1; Delete($2.type); } - | pointer AND { + | pointer AND variadic_opt { $$.type = $1; SwigType_add_reference($$.type); $$.id = 0; $$.parms = 0; $$.have_parms = 0; + if ($3) SwigType_add_variadic($$.type); } - | pointer LAND { + | pointer LAND variadic_opt { $$.type = $1; SwigType_add_rvalue_reference($$.type); $$.id = 0; $$.parms = 0; $$.have_parms = 0; + if ($3) SwigType_add_variadic($$.type); } | pointer AND direct_abstract_declarator { $$ = $3; @@ -5942,19 +5945,21 @@ abstract_declarator : pointer { Delete($2.type); } } - | AND { + | AND variadic_opt { $$.id = 0; $$.parms = 0; $$.have_parms = 0; $$.type = NewStringEmpty(); SwigType_add_reference($$.type); + if ($2) SwigType_add_variadic($$.type); } - | LAND { + | LAND variadic_opt { $$.id = 0; $$.parms = 0; $$.have_parms = 0; $$.type = NewStringEmpty(); SwigType_add_rvalue_reference($$.type); + if ($2) SwigType_add_variadic($$.type); } | idcolon DSTAR { $$.type = NewStringEmpty(); @@ -6155,7 +6160,9 @@ rawtype : type_qualifier type_right { $$ = $2; SwigType_push($$,$1); } - | type_right { $$ = $1; } + | type_right { + $$ = $1; + } | type_right type_qualifier { $$ = $1; SwigType_push($$,$2); @@ -6876,7 +6883,7 @@ exprcompound : expr PLUS expr { } ; -variadic : ELLIPSIS { +variadic_opt : ELLIPSIS { $$ = NewString("..."); } | empty { @@ -6921,7 +6928,7 @@ base_list : base_specifier { base_specifier : opt_virtual { $$ = cparse_line; - } idcolon variadic { + } idcolon variadic_opt { $$ = NewHash(); Setfile($$,cparse_file); Setline($$,$2); @@ -6940,7 +6947,7 @@ base_specifier : opt_virtual { } | opt_virtual access_specifier { $$ = cparse_line; - } opt_virtual idcolon variadic { + } opt_virtual idcolon variadic_opt { $$ = NewHash(); Setfile($$,cparse_file); Setline($$,$3);