@@ -249,21 +249,23 @@ invariant_violated_string(
249
249
#define __this_function__ __func__
250
250
#endif
251
251
252
+ #define EXPAND (x ) x
253
+
252
254
#define GET_MACRO (X1, X2, X3, X4, X5, X6, MACRO, ...) MACRO
253
255
254
256
#define REDIRECT (MACRO, ...) \
255
257
do \
256
258
{ \
257
- GET_MACRO ( \
259
+ EXPAND ( EXPAND ( GET_MACRO ( \
258
260
__VA_ARGS__, \
259
261
MACRO##6 , \
260
262
MACRO##5 , \
261
263
MACRO##4 , \
262
264
MACRO##3 , \
263
265
MACRO##2 , \
264
266
MACRO##1 , \
265
- DUMMY_MACRO_ARG) \
266
- (__VA_ARGS__); \
267
+ DUMMY_MACRO_ARG)) \
268
+ (__VA_ARGS__)) ; \
267
269
} while (false )
268
270
269
271
#define INVARIANT2 (CONDITION, REASON ) \
@@ -308,7 +310,7 @@ invariant_violated_string(
308
310
// Short hand macros. The variants *_STRUCTURED below allow to specify a custom
309
311
// exception, and are equivalent to INVARIANT_STRUCTURED.
310
312
311
- #define INVARIANT (...) REDIRECT(INVARIANT, __VA_ARGS__)
313
+ #define INVARIANT (...) EXPAND( REDIRECT(INVARIANT, __VA_ARGS__) )
312
314
313
315
// The condition should only contain (unmodified) inputs to the method. Inputs
314
316
// include arguments passed to the function, as well as member variables that
@@ -322,7 +324,7 @@ invariant_violated_string(
322
324
#define PRECONDITION2 (CONDITION, DIAGNOSTICS ) \
323
325
INVARIANT3 (CONDITION, " Precondition" , DIAGNOSTICS)
324
326
325
- #define PRECONDITION (...) REDIRECT(PRECONDITION, __VA_ARGS__)
327
+ #define PRECONDITION (...) EXPAND( REDIRECT(PRECONDITION, __VA_ARGS__) )
326
328
327
329
#define PRECONDITION_STRUCTURED (CONDITION, TYPENAME, ...) \
328
330
INVARIANT_STRUCTURED (CONDITION, TYPENAME, __VA_ARGS__)
@@ -339,7 +341,7 @@ invariant_violated_string(
339
341
#define POSTCONDITION2 (CONDITION, DIAGNOSTICS ) \
340
342
INVARIANT3 (CONDITION, " Postcondition" , DIAGNOSTICS)
341
343
342
- #define POSTCONDITION (...) REDIRECT(POSTCONDITION, __VA_ARGS__)
344
+ #define POSTCONDITION (...) EXPAND( REDIRECT(POSTCONDITION, __VA_ARGS__) )
343
345
344
346
#define POSTCONDITION_STRUCTURED (CONDITION, TYPENAME, ...) \
345
347
INVARIANT_STRUCTURED (CONDITION, TYPENAME, __VA_ARGS__)
@@ -356,7 +358,7 @@ invariant_violated_string(
356
358
#define CHECK_RETURN2 (CONDITION, DIAGNOSTICS ) \
357
359
INVARIANT3 (CONDITION, " Check return value" , DIAGNOSTICS)
358
360
359
- #define CHECK_RETURN (...) REDIRECT(CHECK_RETURN, __VA_ARGS__)
361
+ #define CHECK_RETURN (...) EXPAND( REDIRECT(CHECK_RETURN, __VA_ARGS__) )
360
362
361
363
#define CHECK_RETURN_STRUCTURED (CONDITION, TYPENAME, ...) \
362
364
INVARIANT_STRUCTURED (CONDITION, TYPENAME, __VA_ARGS__)
@@ -373,7 +375,7 @@ invariant_violated_string(
373
375
#define DATA_INVARIANT3 (CONDITION, REASON, DIAGNOSTICS ) \
374
376
INVARIANT3 (CONDITION, REASON, DIAGNOSTICS)
375
377
376
- #define DATA_INVARIANT (...) REDIRECT(DATA_INVARIANT, __VA_ARGS__)
378
+ #define DATA_INVARIANT (...) EXPAND( REDIRECT(DATA_INVARIANT, __VA_ARGS__) )
377
379
378
380
#define DATA_INVARIANT_STRUCTURED (CONDITION, TYPENAME, ...) \
379
381
INVARIANT_STRUCTURED (CONDITION, TYPENAME, __VA_ARGS__)
0 commit comments