Skip to content

Commit ebbcb33

Browse files
samanghquicknir
authored andcommitted
Fix expansion of variadic macro arguments in MSVC
1 parent 7fb8445 commit ebbcb33

File tree

1 file changed

+15
-7
lines changed

1 file changed

+15
-7
lines changed

wise_enum_detail.h

+15-7
Original file line numberDiff line numberDiff line change
@@ -95,9 +95,14 @@ WISE_ENUM_CONSTEXPR_14 bool compare(U u1, U u2) {
9595
} // namespace detail
9696
} // namespace wise_enum
9797

98+
99+
// Needed for expansion of variadic macro arguments in MSVC
100+
// MSVC expands __VA_ARGS__ after passing it, while gcc expands it before
101+
#define WISE_ENUM_IMPL_EXPAND(x) x
102+
98103
#define WISE_ENUM_IMPL_NARG(...) \
99104
WISE_ENUM_IMPL_NARG_(__VA_ARGS__, WISE_ENUM_IMPL_RSEQ_N())
100-
#define WISE_ENUM_IMPL_NARG_(...) WISE_ENUM_IMPL_ARG_N(__VA_ARGS__)
105+
#define WISE_ENUM_IMPL_NARG_(...) WISE_ENUM_IMPL_EXPAND(WISE_ENUM_IMPL_ARG_N(__VA_ARGS__))
101106

102107
// ARG_N and RSEQ_N defined in wise_enum_generated.h
103108

@@ -118,7 +123,8 @@ WISE_ENUM_CONSTEXPR_14 bool compare(U u1, U u2) {
118123
#define WISE_ENUM_IMPL_IIF_1(t, f) t
119124

120125
#define WISE_ENUM_IMPL_CHECK_N(x, n, ...) n
121-
#define WISE_ENUM_IMPL_CHECK(...) WISE_ENUM_IMPL_CHECK_N(__VA_ARGS__, 0, )
126+
#define WISE_ENUM_IMPL_CHECK(...) \
127+
WISE_ENUM_IMPL_EXPAND(WISE_ENUM_IMPL_CHECK_N(__VA_ARGS__, 0, ))
122128
#define WISE_ENUM_IMPL_PROBE(x) x, 1,
123129

124130
#define WISE_ENUM_IMPL_IS_PAREN(x) \
@@ -164,9 +170,11 @@ WISE_ENUM_CONSTEXPR_14 bool compare(U u1, U u2) {
164170
WISE_ENUM_IMPL_CAT(WISE_ENUM_IMPL_LOOP_, num_enums), \
165171
__VA_ARGS__)
166172

173+
167174
#define WISE_ENUM_IMPL_3(type, name, storage, friendly, num_enums, loop, ...) \
168175
type name storage{ \
169-
loop(WISE_ENUM_IMPL_ENUM_INIT, _, WISE_ENUM_IMPL_COMMA, __VA_ARGS__)}; \
176+
WISE_ENUM_IMPL_EXPAND(loop(WISE_ENUM_IMPL_ENUM_INIT, _, \
177+
WISE_ENUM_IMPL_COMMA, __VA_ARGS__))}; \
170178
WISE_ENUM_IMPL_ADAPT_3(name, friendly, num_enums, loop, __VA_ARGS__)
171179

172180
#define WISE_ENUM_IMPL_ADAPT(name, ...) \
@@ -185,16 +193,16 @@ WISE_ENUM_CONSTEXPR_14 bool compare(U u1, U u2) {
185193
friendly constexpr std::array<::wise_enum::detail::value_and_name<name>, \
186194
num_enums> \
187195
wise_enum_detail_array(::wise_enum::detail::Tag<name>) { \
188-
return {{loop(WISE_ENUM_IMPL_DESC_PAIR, name, WISE_ENUM_IMPL_COMMA, \
189-
__VA_ARGS__)}}; \
196+
return {{WISE_ENUM_IMPL_EXPAND(loop(WISE_ENUM_IMPL_DESC_PAIR, name, \
197+
WISE_ENUM_IMPL_COMMA, __VA_ARGS__))}}; \
190198
} \
191199
\
192200
template <class T> \
193201
friendly WISE_ENUM_CONSTEXPR_14 ::wise_enum::string_type \
194202
wise_enum_detail_to_string(T e, ::wise_enum::detail::Tag<name>) { \
195203
switch (e) { \
196-
loop(WISE_ENUM_IMPL_SWITCH_CASE, name, WISE_ENUM_IMPL_NOTHING, \
197-
__VA_ARGS__) \
204+
WISE_ENUM_IMPL_EXPAND(loop(WISE_ENUM_IMPL_SWITCH_CASE, name, \
205+
WISE_ENUM_IMPL_NOTHING, __VA_ARGS__)) \
198206
} \
199207
return {}; \
200208
}

0 commit comments

Comments
 (0)