Sebastian Huber <sebastian.hu...@embedded-brains.de> writes: > On 16/06/2020 12:42, Richard Sandiford wrote: > >> [...] >> 2020-06-16 Richard Sandiford <richard.sandif...@arm.com> >> >> gcc/ >> * coretypes.h (first_type): New alias template. >> * recog.h (insn_gen_fn::operator()): Use it instead of a decltype. >> Remove spurious “...” and split the function type out into a typedef. >> --- >> gcc/coretypes.h | 4 ++++ >> gcc/recog.h | 5 +++-- >> 2 files changed, 7 insertions(+), 2 deletions(-) >> >> diff --git a/gcc/coretypes.h b/gcc/coretypes.h >> index cda22697cc3..01ec2e23ce2 100644 >> --- a/gcc/coretypes.h >> +++ b/gcc/coretypes.h >> @@ -359,6 +359,10 @@ struct kv_pair >> const ValueType value; /* the value of the name */ >> }; >> >> +/* Alias of the first type, ignoring the second. */ >> +template<typename T1, typename T2> >> +using first_type = T1; >> + >> #else >> >> struct _dont_use_rtx_here_; >> diff --git a/gcc/recog.h b/gcc/recog.h >> index 0a71a02c4a9..d674d384723 100644 >> --- a/gcc/recog.h >> +++ b/gcc/recog.h >> @@ -295,9 +295,10 @@ struct insn_gen_fn >> typedef void (*stored_funcptr) (void); >> >> template<typename ...Ts> >> - rtx_insn *operator() (Ts... args...) const >> + rtx_insn *operator() (Ts... args) const >> { >> - return ((rtx_insn *(*) (decltype(args, NULL_RTX)...)) func) (args...); >> + typedef rtx_insn *(*funcptr) (first_type<rtx, Ts>...); >> + return ((funcptr) func) (args...); >> } >> >> // This is for compatibility of code that invokes functions like > > I get this error on FreeBSD 12.1 with > > c++ --version > FreeBSD clang version 8.0.1 (tags/RELEASE_801/final 366581) (based on > LLVM 8.0.1) > Target: x86_64-unknown-freebsd12.1 > Thread model: posix > InstalledDir: /usr/bin > > In file included from ../../gnu-mirror-gcc-aff95ee/gcc/function.c:51: > ../../gnu-mirror-gcc-aff95ee/gcc/recog.h:301:30: error: too many > arguments to function call, expected 1, have 2 > return ((funcptr) func) (args...); > ~~~~~~~~~~~~~~~~ ^~~~ > ../../gnu-mirror-gcc-aff95ee/gcc/function.c:3315:29: note: in > instantiation of function template specialization > 'insn_gen_fn::operator()<rtx_def *, rtx_def *>' requested here > emit_insn (GEN_FCN (icode) (parmreg, validated_mem));
Thanks for the report. Was clang OK with the earlier version (i.e. before 4e49b994de060d4a6c9318d0ed52ef038153426e)? Richard