This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix -Wshadow=local warnings in rtl.h
- From: Bernd Edlinger <bernd dot edlinger at hotmail dot de>
- To: "gcc-patches at gcc dot gnu dot org" <gcc-patches at gcc dot gnu dot org>
- Date: Thu, 3 Oct 2019 15:17:47 +0000
- Subject: [PATCH] Fix -Wshadow=local warnings in rtl.h
- Arc-authentication-results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none
- Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=nGIVbxFnZPj/Ipj5rBTXaB2+zDh/7/QSGKZIBG1A2e8=; b=dLstxl7PQHWtiwyminL1ffKxnBfQPWz9z3dIHMh1dnKGKaqYWEnqYCzJX/0/zh3PC/NXbISx096IoHVAsuJrNWO+aq1uu2TsVK+wOwfRxhDmq4qRfG9wyMJ0828Oha8eZQJuOx0lUupBy56qno1FTvwpTSwjXbnkI48ZhBN0z9FHcQJ39F67vTk1MeLp2J0A9AIS9MKESm+SU754gtbUL75jH3sLUkm7LpFrtgNdLhB1YpKx4DczyV3wKFacSnfhfZ9KFe2DWySqsjLsmy3O5HQqQXSDU86RrTls/W5Vgr03j74WEEt2lVJSJwl61UyAVotDPwoEdeRha/j3SFQj1w==
- Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=XlTzd5wD1/aklHegQdwsFAgri+hDT5D9bCTBigaFfKRwyXuf0krZVZSc07tZWq48i1nlN6xzPdxxF9XonoZGmeSGOwcbz2Nh5vSLmxF6boGIIwFV8l5FWeJslB6Q67RCiQuhwW6DdHKNIFrfIv2nCf2FGqINaaUW8w4HZcjhLzqMh0xjl0FWIJlhHU0Ff1dYKgZSiPNCXhBVenlCS1J0qcjv32PQefoEGtzxAZBN0Hx7zTdMNyynEwfMtEpVPfjO2x248RmvLwYUdRLkGG/LKr1qG/7MZiKJi7tRIgz6OxKhel4N6D/ZOhIVmbpUoi9IDnWRo3cWlCq7gJQbk8IXEQ==
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.edlinger@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