@@ -785,17 +785,19 @@ class out {
785
785
#endif
786
786
#endif
787
787
788
+ #define CPP2_UFCS_REMPARENS (...) __VA_ARGS__
789
+
788
790
// Ideally, the expression `CPP2_UFCS_IS_NOTHROW` expands to
789
791
// is in the _noexcept-specifier_ of the UFCS lambda.
790
792
// To workaround [GCC bug 101043](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101043),
791
793
// we instead make it a template parameter of the UFCS lambda.
792
794
// But using a template parameter, Clang also ICEs on an application.
793
795
// So we use these `NOTHROW` macros to fall back to the ideal for when not using GCC.
794
796
#define CPP2_UFCS_IS_NOTHROW (QUALID,TEMPKW,...) \
795
- requires { requires requires { std::declval<Obj>().QUALID TEMPKW __VA_ARGS__ (std::declval<Params>()...); }; \
796
- requires noexcept (std::declval<Obj>().QUALID TEMPKW __VA_ARGS__ (std::declval<Params>()...)); } \
797
- || requires { requires !requires { std::declval<Obj>().QUALID TEMPKW __VA_ARGS__ (std::declval<Params>()...); }; \
798
- requires noexcept (QUALID __VA_ARGS__ (std::declval<Obj>(), std::declval<Params>()...)); }
797
+ requires { requires requires { std::declval<Obj>().CPP2_UFCS_REMPARENS QUALID TEMPKW __VA_ARGS__ (std::declval<Params>()...); }; \
798
+ requires noexcept (std::declval<Obj>().CPP2_UFCS_REMPARENS QUALID TEMPKW __VA_ARGS__ (std::declval<Params>()...)); } \
799
+ || requires { requires !requires { std::declval<Obj>().CPP2_UFCS_REMPARENS QUALID TEMPKW __VA_ARGS__ (std::declval<Params>()...); }; \
800
+ requires noexcept (CPP2_UFCS_REMPARENS QUALID __VA_ARGS__ (std::declval<Obj>(), std::declval<Params>()...)); }
799
801
#define CPP2_UFCS_IS_NOTHROW_PARAM (QUALID,TEMPKW,...) /* empty*/
800
802
#define CPP2_UFCS_IS_NOTHROW_ARG (QUALID,TEMPKW,...) CPP2_UFCS_IS_NOTHROW(QUALID,TEMPKW,__VA_ARGS__)
801
803
#if defined(__GNUC__) && !defined(__clang__)
@@ -815,20 +817,20 @@ class out {
815
817
[LAMBDADEFCAPT]<typename Obj, typename ... Params CPP2_UFCS_IS_NOTHROW_PARAM (QUALID,TEMPKW,__VA_ARGS__)> \
816
818
CPP2_LAMBDA_NO_DISCARD (Obj&& obj, Params&& ...params) CPP2_FORCE_INLINE_LAMBDA_CLANG \
817
819
noexcept (CPP2_UFCS_IS_NOTHROW_ARG(QUALID,TEMPKW,__VA_ARGS__)) CPP2_FORCE_INLINE_LAMBDA -> decltype(auto ) \
818
- requires requires { CPP2_FORWARD (obj).QUALID TEMPKW __VA_ARGS__ (CPP2_FORWARD (params)...); } \
819
- || requires { QUALID __VA_ARGS__ (CPP2_FORWARD (obj), CPP2_FORWARD (params)...); } { \
820
- if constexpr (requires { CPP2_FORWARD (obj).QUALID TEMPKW __VA_ARGS__ (CPP2_FORWARD (params)...); }) { \
821
- return CPP2_FORWARD (obj).QUALID TEMPKW __VA_ARGS__ (CPP2_FORWARD (params)...); \
820
+ requires requires { CPP2_FORWARD (obj).CPP2_UFCS_REMPARENS QUALID TEMPKW __VA_ARGS__ (CPP2_FORWARD (params)...); } \
821
+ || requires { CPP2_UFCS_REMPARENS QUALID __VA_ARGS__ (CPP2_FORWARD (obj), CPP2_FORWARD (params)...); } { \
822
+ if constexpr (requires { CPP2_FORWARD (obj).CPP2_UFCS_REMPARENS QUALID TEMPKW __VA_ARGS__ (CPP2_FORWARD (params)...); }) { \
823
+ return CPP2_FORWARD (obj).CPP2_UFCS_REMPARENS QUALID TEMPKW __VA_ARGS__ (CPP2_FORWARD (params)...); \
822
824
} else { \
823
- return QUALID __VA_ARGS__ (CPP2_FORWARD (obj), CPP2_FORWARD (params)...); \
825
+ return CPP2_UFCS_REMPARENS QUALID __VA_ARGS__ (CPP2_FORWARD (obj), CPP2_FORWARD (params)...); \
824
826
} \
825
827
}
826
828
827
- #define CPP2_UFCS (...) CPP2_UFCS_(&,,,__VA_ARGS__)
828
- #define CPP2_UFCS_TEMPLATE (...) CPP2_UFCS_(&,,template ,__VA_ARGS__)
829
+ #define CPP2_UFCS (...) CPP2_UFCS_(&,() ,,__VA_ARGS__)
830
+ #define CPP2_UFCS_TEMPLATE (...) CPP2_UFCS_(&,() ,template ,__VA_ARGS__)
829
831
#define CPP2_UFCS_QUALIFIED_TEMPLATE (QUALID,...) CPP2_UFCS_(&,QUALID,template ,__VA_ARGS__)
830
- #define CPP2_UFCS_NONLOCAL (...) CPP2_UFCS_(,,,__VA_ARGS__)
831
- #define CPP2_UFCS_TEMPLATE_NONLOCAL (...) CPP2_UFCS_(,,template ,__VA_ARGS__)
832
+ #define CPP2_UFCS_NONLOCAL (...) CPP2_UFCS_(,() ,,__VA_ARGS__)
833
+ #define CPP2_UFCS_TEMPLATE_NONLOCAL (...) CPP2_UFCS_(,() ,template ,__VA_ARGS__)
832
834
#define CPP2_UFCS_QUALIFIED_TEMPLATE_NONLOCAL (QUALID,...) CPP2_UFCS_(,QUALID,template ,__VA_ARGS__)
833
835
834
836
0 commit comments