@@ -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