Hi, this fixes -Wshadow=local warnings in the RTL_FLAG_CHECKx macros, which happen when this macro is used recursively in a macro argument. The __typeof (RTX) const _rtx in the inner macro expansions shadows the outer macro expansions.
So reworked the macro to not use statement expressions but use templates instead. Since the 7-argument overload is not used anywhere removed RTL_FLAG_CHECK7 for now. Bootstrapped and reg-tested on x86_64-pc-linux-gnu. Is it OK for trunk? Thanks Bernd.
2019-10-03 Bernd Edlinger <bernd.edlin...@hotmail.de> * rtl.h (RTL_FLAG_CHECK): New variadic macro. (RTL_FLAG_CHECK1-6): Use RTL_FLAG_CHECK. (RTL_FLAG_CHECK7): Remove. (rtl_flag_check, check_rtl_code): New helper functions. Index: gcc/rtl.h =================================================================== --- gcc/rtl.h (revision 276484) +++ gcc/rtl.h (working copy) @@ -1249,66 +1249,18 @@ extern void rtvec_check_failed_bounds (const_rtvec #define RTX_FLAG(RTX, FLAG) ((RTX)->FLAG) #if defined ENABLE_RTL_FLAG_CHECKING && (GCC_VERSION >= 2007) -#define RTL_FLAG_CHECK1(NAME, RTX, C1) __extension__ \ -({ __typeof (RTX) const _rtx = (RTX); \ - if (GET_CODE (_rtx) != C1) \ - rtl_check_failed_flag (NAME, _rtx, __FILE__, __LINE__, \ - __FUNCTION__); \ - _rtx; }) +#define RTL_FLAG_CHECK(NAME, RTX, ...) \ + ((__typeof (&*(RTX))) rtl_flag_check (check_rtl_code<__VA_ARGS__>, \ + NAME, RTX, __FILE__, __LINE__, \ + __FUNCTION__)) -#define RTL_FLAG_CHECK2(NAME, RTX, C1, C2) __extension__ \ -({ __typeof (RTX) const _rtx = (RTX); \ - if (GET_CODE (_rtx) != C1 && GET_CODE(_rtx) != C2) \ - rtl_check_failed_flag (NAME,_rtx, __FILE__, __LINE__, \ - __FUNCTION__); \ - _rtx; }) +#define RTL_FLAG_CHECK1 RTL_FLAG_CHECK +#define RTL_FLAG_CHECK2 RTL_FLAG_CHECK +#define RTL_FLAG_CHECK3 RTL_FLAG_CHECK +#define RTL_FLAG_CHECK4 RTL_FLAG_CHECK +#define RTL_FLAG_CHECK5 RTL_FLAG_CHECK +#define RTL_FLAG_CHECK6 RTL_FLAG_CHECK -#define RTL_FLAG_CHECK3(NAME, RTX, C1, C2, C3) __extension__ \ -({ __typeof (RTX) const _rtx = (RTX); \ - if (GET_CODE (_rtx) != C1 && GET_CODE(_rtx) != C2 \ - && GET_CODE (_rtx) != C3) \ - rtl_check_failed_flag (NAME, _rtx, __FILE__, __LINE__, \ - __FUNCTION__); \ - _rtx; }) - -#define RTL_FLAG_CHECK4(NAME, RTX, C1, C2, C3, C4) __extension__ \ -({ __typeof (RTX) const _rtx = (RTX); \ - if (GET_CODE (_rtx) != C1 && GET_CODE(_rtx) != C2 \ - && GET_CODE (_rtx) != C3 && GET_CODE(_rtx) != C4) \ - rtl_check_failed_flag (NAME, _rtx, __FILE__, __LINE__, \ - __FUNCTION__); \ - _rtx; }) - -#define RTL_FLAG_CHECK5(NAME, RTX, C1, C2, C3, C4, C5) __extension__ \ -({ __typeof (RTX) const _rtx = (RTX); \ - if (GET_CODE (_rtx) != C1 && GET_CODE (_rtx) != C2 \ - && GET_CODE (_rtx) != C3 && GET_CODE (_rtx) != C4 \ - && GET_CODE (_rtx) != C5) \ - rtl_check_failed_flag (NAME, _rtx, __FILE__, __LINE__, \ - __FUNCTION__); \ - _rtx; }) - -#define RTL_FLAG_CHECK6(NAME, RTX, C1, C2, C3, C4, C5, C6) \ - __extension__ \ -({ __typeof (RTX) const _rtx = (RTX); \ - if (GET_CODE (_rtx) != C1 && GET_CODE (_rtx) != C2 \ - && GET_CODE (_rtx) != C3 && GET_CODE (_rtx) != C4 \ - && GET_CODE (_rtx) != C5 && GET_CODE (_rtx) != C6) \ - rtl_check_failed_flag (NAME,_rtx, __FILE__, __LINE__, \ - __FUNCTION__); \ - _rtx; }) - -#define RTL_FLAG_CHECK7(NAME, RTX, C1, C2, C3, C4, C5, C6, C7) \ - __extension__ \ -({ __typeof (RTX) const _rtx = (RTX); \ - if (GET_CODE (_rtx) != C1 && GET_CODE (_rtx) != C2 \ - && GET_CODE (_rtx) != C3 && GET_CODE (_rtx) != C4 \ - && GET_CODE (_rtx) != C5 && GET_CODE (_rtx) != C6 \ - && GET_CODE (_rtx) != C7) \ - rtl_check_failed_flag (NAME, _rtx, __FILE__, __LINE__, \ - __FUNCTION__); \ - _rtx; }) - #define RTL_INSN_CHAIN_FLAG_CHECK(NAME, RTX) \ __extension__ \ ({ __typeof (RTX) const _rtx = (RTX); \ @@ -1322,6 +1274,87 @@ extern void rtl_check_failed_flag (const char *, c ATTRIBUTE_NORETURN ATTRIBUTE_COLD ; +static inline rtx +rtl_flag_check (bool (*check) (const_rtx), const char *name, rtx rtl, + const char *file, int line, const char *func) +{ + if (!check (rtl)) + rtl_check_failed_flag (name, rtl, file, line, func); + return rtl; +} + +static inline const_rtx +rtl_flag_check (bool (*check) (const_rtx), const char *name, const_rtx rtl, + const char *file, int line, const char *func) +{ + if (!check (rtl)) + rtl_check_failed_flag (name, rtl, file, line, func); + return rtl; +} + +template<RTX_CODE C1> +inline bool +check_rtl_code (const_rtx rtl) +{ + if (GET_CODE (rtl) != C1) + return false; + return true; +} + +template<RTX_CODE C1, RTX_CODE C2> +inline bool +check_rtl_code (const_rtx rtl) +{ + if (GET_CODE (rtl) != C1 && GET_CODE (rtl) != C2) + return false; + return true; +} + +template<RTX_CODE C1, RTX_CODE C2, RTX_CODE C3> +inline bool +check_rtl_code (const_rtx rtl) +{ + if (GET_CODE (rtl) != C1 && GET_CODE (rtl) != C2 + && GET_CODE (rtl) != C3) + return false; + return true; +} + +template<RTX_CODE C1, RTX_CODE C2, RTX_CODE C3, + RTX_CODE C4> +inline bool +check_rtl_code (const_rtx rtl) +{ + if (GET_CODE (rtl) != C1 && GET_CODE (rtl) != C2 + && GET_CODE (rtl) != C3 && GET_CODE (rtl) != C4) + return false; + return true; +} + +template<RTX_CODE C1, RTX_CODE C2, RTX_CODE C3, + RTX_CODE C4, RTX_CODE C5> +inline bool +check_rtl_code (const_rtx rtl) +{ + if (GET_CODE (rtl) != C1 && GET_CODE (rtl) != C2 + && GET_CODE (rtl) != C3 && GET_CODE (rtl) != C4 + && GET_CODE (rtl) != C5) + return false; + return true; +} + +template<RTX_CODE C1, RTX_CODE C2, RTX_CODE C3, + RTX_CODE C4, RTX_CODE C5, RTX_CODE C6> +inline bool +check_rtl_code (const_rtx rtl) +{ + if (GET_CODE (rtl) != C1 && GET_CODE (rtl) != C2 + && GET_CODE (rtl) != C3 && GET_CODE (rtl) != C4 + && GET_CODE (rtl) != C5 && GET_CODE (rtl) != C6) + return false; + return true; +} + #else /* not ENABLE_RTL_FLAG_CHECKING */ #define RTL_FLAG_CHECK1(NAME, RTX, C1) (RTX) @@ -1330,7 +1363,6 @@ extern void rtl_check_failed_flag (const char *, c #define RTL_FLAG_CHECK4(NAME, RTX, C1, C2, C3, C4) (RTX) #define RTL_FLAG_CHECK5(NAME, RTX, C1, C2, C3, C4, C5) (RTX) #define RTL_FLAG_CHECK6(NAME, RTX, C1, C2, C3, C4, C5, C6) (RTX) -#define RTL_FLAG_CHECK7(NAME, RTX, C1, C2, C3, C4, C5, C6, C7) (RTX) #define RTL_INSN_CHAIN_FLAG_CHECK(NAME, RTX) (RTX) #endif