With the original code you'd have to be very, very careful:
if (foo)
CLEAR_POSIX_WARNINGS_AND_RETURN(42);
would have expanded to
if (foo)
CLEAR_POSIX_WARNINGS();
return 42; /* always returns! */
} \
} STMT_END
#define CLEAR_POSIX_WARNINGS() \
- if (posix_warnings && RExC_warn_text) \
- av_clear(RExC_warn_text)
+ STMT_START { \
+ if (posix_warnings && RExC_warn_text) \
+ av_clear(RExC_warn_text); \
+ } STMT_END
#define CLEAR_POSIX_WARNINGS_AND_RETURN(ret) \
- CLEAR_POSIX_WARNINGS(); \
- return ret
+ STMT_START { \
+ CLEAR_POSIX_WARNINGS(); \
+ return ret; \
+ } STMT_END
STATIC int
S_handle_possible_posix(pTHX_ RExC_state_t *pRExC_state,