From 59d531282e97703352d606c46c502b09215e472b Mon Sep 17 00:00:00 2001 From: Flamefire Date: Sun, 27 Apr 2025 17:25:42 +0200 Subject: [PATCH] Support for GCC/Clang of MOCK_PP_FOR_EACH Some compilers support detection of an empty variadic macro element in which case `BOOST_PP_VARIADIC_SIZE` returns "0" so `BOOST_PP_OVERLOAD` calls the `macro_0` overload. An empty variadic element should be considered as a single empty value. So add that overload with this in mind. --- include/turtle/detail/pp_foreach.hpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/include/turtle/detail/pp_foreach.hpp b/include/turtle/detail/pp_foreach.hpp index c10e0dd..ee1529e 100644 --- a/include/turtle/detail/pp_foreach.hpp +++ b/include/turtle/detail/pp_foreach.hpp @@ -27,6 +27,9 @@ # define MOCK_PP_FOR_EACH(macro, data, ...) BOOST_PP_OVERLOAD(MOCK_PP_INVOKE_, __VA_ARGS__)(macro, data, __VA_ARGS__) #endif +// When the compiler supports detection of empty variadic element (e.g. Clang & GCC) Boost.PP returns a size of zero. +// However an empty variadic is a valid case: A single invocation with an empty element. +#define MOCK_PP_INVOKE_0(macro, data, x) macro(data, x) #define MOCK_PP_INVOKE_1(macro, data, x) macro(data, x) #define MOCK_PP_INVOKE_2(macro, data, x, ...) macro(data, x) MOCK_PP_INVOKE_1(macro, data, __VA_ARGS__) #define MOCK_PP_INVOKE_3(macro, data, x, ...) macro(data, x) MOCK_PP_INVOKE_2(macro, data, __VA_ARGS__)