Skip to content

Commit 4a65e6a

Browse files
committed
Workaround for Visual Studio not expanding __VA_ARGS__ on macro invocation
1 parent 0b0653d commit 4a65e6a

File tree

1 file changed

+17
-15
lines changed

1 file changed

+17
-15
lines changed

src/util/invariant.h

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -249,21 +249,23 @@ invariant_violated_string(
249249
#define __this_function__ __func__
250250
#endif
251251

252+
#define EXPAND_MACRO(x) x
253+
252254
#define GET_MACRO(X1, X2, X3, X4, X5, X6, MACRO, ...) MACRO
253255

254256
#define REDIRECT(MACRO, ...) \
255257
do \
256258
{ \
257-
GET_MACRO( \
258-
__VA_ARGS__, \
259-
MACRO##6, \
260-
MACRO##5, \
261-
MACRO##4, \
262-
MACRO##3, \
263-
MACRO##2, \
264-
MACRO##1, \
265-
DUMMY_MACRO_ARG) \
266-
(__VA_ARGS__); \
259+
EXPAND_MACRO( \
260+
GET_MACRO( \
261+
__VA_ARGS__, \
262+
MACRO##6, \
263+
MACRO##5, \
264+
MACRO##4, \
265+
MACRO##3, \
266+
MACRO##2, \
267+
MACRO##1, \
268+
DUMMY_MACRO_ARG)(__VA_ARGS__)); \
267269
} while(false)
268270

269271
#define INVARIANT2(CONDITION, REASON) \
@@ -308,7 +310,7 @@ invariant_violated_string(
308310
// Short hand macros. The variants *_STRUCTURED below allow to specify a custom
309311
// exception, and are equivalent to INVARIANT_STRUCTURED.
310312

311-
#define INVARIANT(...) REDIRECT(INVARIANT, __VA_ARGS__)
313+
#define INVARIANT(...) EXPAND_MACRO(REDIRECT(INVARIANT, __VA_ARGS__))
312314

313315
// The condition should only contain (unmodified) inputs to the method. Inputs
314316
// include arguments passed to the function, as well as member variables that
@@ -322,7 +324,7 @@ invariant_violated_string(
322324
#define PRECONDITION2(CONDITION, DIAGNOSTICS) \
323325
INVARIANT3(CONDITION, "Precondition", DIAGNOSTICS)
324326

325-
#define PRECONDITION(...) REDIRECT(PRECONDITION, __VA_ARGS__)
327+
#define PRECONDITION(...) EXPAND_MACRO(REDIRECT(PRECONDITION, __VA_ARGS__))
326328

327329
#define PRECONDITION_STRUCTURED(CONDITION, TYPENAME, ...) \
328330
INVARIANT_STRUCTURED(CONDITION, TYPENAME, __VA_ARGS__)
@@ -339,7 +341,7 @@ invariant_violated_string(
339341
#define POSTCONDITION2(CONDITION, DIAGNOSTICS) \
340342
INVARIANT3(CONDITION, "Postcondition", DIAGNOSTICS)
341343

342-
#define POSTCONDITION(...) REDIRECT(POSTCONDITION, __VA_ARGS__)
344+
#define POSTCONDITION(...) EXPAND_MACRO(REDIRECT(POSTCONDITION, __VA_ARGS__))
343345

344346
#define POSTCONDITION_STRUCTURED(CONDITION, TYPENAME, ...) \
345347
INVARIANT_STRUCTURED(CONDITION, TYPENAME, __VA_ARGS__)
@@ -356,7 +358,7 @@ invariant_violated_string(
356358
#define CHECK_RETURN2(CONDITION, DIAGNOSTICS) \
357359
INVARIANT3(CONDITION, "Check return value", DIAGNOSTICS)
358360

359-
#define CHECK_RETURN(...) REDIRECT(CHECK_RETURN, __VA_ARGS__)
361+
#define CHECK_RETURN(...) EXPAND_MACRO(REDIRECT(CHECK_RETURN, __VA_ARGS__))
360362

361363
#define CHECK_RETURN_STRUCTURED(CONDITION, TYPENAME, ...) \
362364
INVARIANT_STRUCTURED(CONDITION, TYPENAME, __VA_ARGS__)
@@ -373,7 +375,7 @@ invariant_violated_string(
373375
#define DATA_INVARIANT3(CONDITION, REASON, DIAGNOSTICS) \
374376
INVARIANT3(CONDITION, REASON, DIAGNOSTICS)
375377

376-
#define DATA_INVARIANT(...) REDIRECT(DATA_INVARIANT, __VA_ARGS__)
378+
#define DATA_INVARIANT(...) EXPAND_MACRO(REDIRECT(DATA_INVARIANT, __VA_ARGS__))
377379

378380
#define DATA_INVARIANT_STRUCTURED(CONDITION, TYPENAME, ...) \
379381
INVARIANT_STRUCTURED(CONDITION, TYPENAME, __VA_ARGS__)

0 commit comments

Comments
 (0)