Skip to content

Commit 7ae714d

Browse files
committed
Workaround for Visual Studio not expanding __VA_ARGS__ on macro invocation
1 parent c88b080 commit 7ae714d

File tree

1 file changed

+10
-8
lines changed

1 file changed

+10
-8
lines changed

src/util/invariant.h

Lines changed: 10 additions & 8 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(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( \
259+
EXPAND(EXPAND(GET_MACRO( \
258260
__VA_ARGS__, \
259261
MACRO##6, \
260262
MACRO##5, \
261263
MACRO##4, \
262264
MACRO##3, \
263265
MACRO##2, \
264266
MACRO##1, \
265-
DUMMY_MACRO_ARG) \
266-
(__VA_ARGS__); \
267+
DUMMY_MACRO_ARG)) \
268+
(__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(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(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(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(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(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)