This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix -Wshadow=local warnings in rtl.h


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
 

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]