Syntax error fixes parsing more elaborate parameter pack arguments
that are function pointers and member function pointers.
template <typename... V> 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<A>;
Also in various other places such as within noexcept specifiers:
template<typename T, typename... Args>
void emplace(Args &&... args) noexcept(
std::is_nothrow_constructible<T, Args &&...>::value);
Issue #1863
This commit is contained in:
parent
674abaddbf
commit
004af63f3c
3 changed files with 71 additions and 13 deletions
|
|
@ -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 <typename... V> 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<A>;
|
||||
|
||||
Also in various other places such as within noexcept specifiers:
|
||||
|
||||
template<typename T, typename... Args>
|
||||
void emplace(Args &&... args) noexcept(
|
||||
std::is_nothrow_constructible<T, Args &&...>::value);
|
||||
|
||||
2022-12-27: wsfulton
|
||||
Fix instantiation of variadic class templates containing parameter pack arguments that
|
||||
are function pointers.
|
||||
|
|
|
|||
|
|
@ -147,7 +147,6 @@ struct KlassMemFuncs {
|
|||
int memfunc3() { return 3; }
|
||||
};
|
||||
template <typename... V> 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<int>(void (tt)(int));
|
||||
template void Container::notifyMyTypes<int, double>(void (tt)(int, double));
|
||||
%}
|
||||
|
||||
// #1863
|
||||
%inline %{
|
||||
#include <type_traits>
|
||||
class EmplaceContainer {
|
||||
public:
|
||||
template<typename T, typename... Args>
|
||||
void emplace(Args &&... args) noexcept(
|
||||
std::is_nothrow_constructible<T, Args &&...>::value) {}
|
||||
};
|
||||
%}
|
||||
|
||||
%template(emplace) EmplaceContainer::emplace<int,A>;
|
||||
//%template(emplace) EmplaceContainer::emplace<int,A,B,C>;
|
||||
|
|
|
|||
|
|
@ -1684,7 +1684,7 @@ static String *add_qualifier_to_declarator(SwigType *type, SwigType *qualifier)
|
|||
%type <type> templcpptype cpptype classkey classkeyopt;
|
||||
%type <id> access_specifier;
|
||||
%type <node> base_specifier;
|
||||
%type <str> variadic;
|
||||
%type <str> variadic_opt;
|
||||
%type <type> type rawtype type_right anon_bitfield_type decltype ;
|
||||
%type <bases> base_list inherit raw_inherit;
|
||||
%type <dtype> 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 {
|
||||
$<intvalue>$ = cparse_line;
|
||||
} idcolon variadic {
|
||||
} idcolon variadic_opt {
|
||||
$$ = NewHash();
|
||||
Setfile($$,cparse_file);
|
||||
Setline($$,$<intvalue>2);
|
||||
|
|
@ -6940,7 +6947,7 @@ base_specifier : opt_virtual {
|
|||
}
|
||||
| opt_virtual access_specifier {
|
||||
$<intvalue>$ = cparse_line;
|
||||
} opt_virtual idcolon variadic {
|
||||
} opt_virtual idcolon variadic_opt {
|
||||
$$ = NewHash();
|
||||
Setfile($$,cparse_file);
|
||||
Setline($$,$<intvalue>3);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue