diff mbox series

-Wtautological-compare: fix comparison of macro expansions

Message ID 1545274889-6253-1-git-send-email-dmalcolm@redhat.com
State New
Headers show
Series -Wtautological-compare: fix comparison of macro expansions | expand

Commit Message

David Malcolm Dec. 20, 2018, 3:01 a.m. UTC
On Wed, 2018-12-19 at 17:27 -0600, Aaron Sawdey wrote:
> Assuming you applied this as svn 267273, it causes bootstrap failure
> on powerpc64le-unknown-linux-gnu. Stage 2 fails with multiple
> instances
> of this error:
> 
> ../../trunk-base/gcc/c-family/c-pragma.c: In function ‘void
> handle_pragma_scalar_storage_order(cpp_reader*)’:
> ../../trunk-base/gcc/c-family/c-pragma.c:417:24: error: self-
> comparison always evaluates to false [-Werror=tautological-compare]
>   417 |   if (BYTES_BIG_ENDIAN != WORDS_BIG_ENDIAN)
>       |                        ^~
> ../../trunk-base/gcc/c-family/c-attribs.c: In function ‘tree_node*
> handle_scalar_storage_order_attribute(tree_node**, tree, tree, int,
> bool*)’:
> ../../trunk-base/gcc/c-family/c-attribs.c:1401:24: error: self-
> comparison always evaluates to false [-Werror=tautological-compare]
>  1401 |   if (BYTES_BIG_ENDIAN != WORDS_BIG_ENDIAN)
>       |                        ^~
> ../../trunk-base/gcc/builtins.c: In function ‘rtx_def*
> c_readstr(const char*, scalar_int_mode)’:
> ../../trunk-base/gcc/builtins.c:830:28: error: self-comparison always
> evaluates to false [-Werror=tautological-compare]
>   830 |       if (BYTES_BIG_ENDIAN != WORDS_BIG_ENDIAN
>       |                            ^~
> ../../trunk-base/gcc/combine.c: In function ‘int
> rtx_equal_for_field_assignment_p(rtx, rtx, bool)’:
> ../../trunk-base/gcc/combine.c:9668:28: error: self-comparison always
> evaluates to false [-Werror=tautological-compare]
>  9668 |       if (BYTES_BIG_ENDIAN != WORDS_BIG_ENDIAN)
>       |                            ^~
> 
> Aaron

Sorry about that.

Does the following patch help?  (testing in progress here)

gcc/c-family/ChangeLog:
	* c-warn.c (get_outermost_macro_expansion): New function.
	(spelled_the_same_p): Use it to unwind the macro expansions, and
	compare the outermost macro in each nested expansion, rather than
	the innermost.

gcc/testsuite/ChangeLog:
	* c-c++-common/Wtautological-compare-8.c: New test.
---
 gcc/c-family/c-warn.c                              | 26 +++++++++++++----
 .../c-c++-common/Wtautological-compare-8.c         | 33 ++++++++++++++++++++++
 2 files changed, 54 insertions(+), 5 deletions(-)
 create mode 100644 gcc/testsuite/c-c++-common/Wtautological-compare-8.c

Comments

David Malcolm Dec. 20, 2018, 2:25 p.m. UTC | #1
On Wed, 2018-12-19 at 22:01 -0500, David Malcolm wrote:
> On Wed, 2018-12-19 at 17:27 -0600, Aaron Sawdey wrote:
> > Assuming you applied this as svn 267273, it causes bootstrap
> > failure
> > on powerpc64le-unknown-linux-gnu. Stage 2 fails with multiple
> > instances
> > of this error:
> > 
> > ../../trunk-base/gcc/c-family/c-pragma.c: In function ‘void
> > handle_pragma_scalar_storage_order(cpp_reader*)’:
> > ../../trunk-base/gcc/c-family/c-pragma.c:417:24: error: self-
> > comparison always evaluates to false [-Werror=tautological-compare]
> >   417 |   if (BYTES_BIG_ENDIAN != WORDS_BIG_ENDIAN)
> >       |                        ^~
> > ../../trunk-base/gcc/c-family/c-attribs.c: In function ‘tree_node*
> > handle_scalar_storage_order_attribute(tree_node**, tree, tree, int,
> > bool*)’:
> > ../../trunk-base/gcc/c-family/c-attribs.c:1401:24: error: self-
> > comparison always evaluates to false [-Werror=tautological-compare]
> >  1401 |   if (BYTES_BIG_ENDIAN != WORDS_BIG_ENDIAN)
> >       |                        ^~
> > ../../trunk-base/gcc/builtins.c: In function ‘rtx_def*
> > c_readstr(const char*, scalar_int_mode)’:
> > ../../trunk-base/gcc/builtins.c:830:28: error: self-comparison
> > always
> > evaluates to false [-Werror=tautological-compare]
> >   830 |       if (BYTES_BIG_ENDIAN != WORDS_BIG_ENDIAN
> >       |                            ^~
> > ../../trunk-base/gcc/combine.c: In function ‘int
> > rtx_equal_for_field_assignment_p(rtx, rtx, bool)’:
> > ../../trunk-base/gcc/combine.c:9668:28: error: self-comparison
> > always
> > evaluates to false [-Werror=tautological-compare]
> >  9668 |       if (BYTES_BIG_ENDIAN != WORDS_BIG_ENDIAN)
> >       |                            ^~
> > 
> > Aaron
> 
> Sorry about that.
> 
> Does the following patch help?  (testing in progress here)
[...snip...]

According to comments within PR c++/87504, the patch fixes the
bootstrap on aarch64, and fixes a similar issue on Solaris/SPARC.

It also passed bootstrap&regrtesting on x86_64-pc-linux-gnu.

Given that, I've committed it to trunk as r267299.

Aaron, does this fix the issue you saw?

Thanks, and sorry again about the breakage.
Dave
Aaron Sawdey Dec. 20, 2018, 11:29 p.m. UTC | #2
On 12/20/18 8:25 AM, David Malcolm wrote:
> According to comments within PR c++/87504, the patch fixes the
> bootstrap on aarch64, and fixes a similar issue on Solaris/SPARC.
> 
> It also passed bootstrap&regrtesting on x86_64-pc-linux-gnu.
> 
> Given that, I've committed it to trunk as r267299.
> 
> Aaron, does this fix the issue you saw?
> 
> Thanks, and sorry again about the breakage.
> Dave
> 

Dave,
  Thanks for the quick response, the build issue is fixed with r267299.

  Aaron
diff mbox series

Patch

diff --git a/gcc/c-family/c-warn.c b/gcc/c-family/c-warn.c
index b0f6da0..6013202 100644
--- a/gcc/c-family/c-warn.c
+++ b/gcc/c-family/c-warn.c
@@ -399,6 +399,25 @@  warn_tautological_bitwise_comparison (const op_location_t &loc, tree_code code,
 		"bitwise comparison always evaluates to true");
 }
 
+/* Given LOC from a macro expansion, return the map for the outermost
+   macro in the nest of expansions.  */
+
+static const line_map_macro *
+get_outermost_macro_expansion (location_t loc)
+{
+  gcc_assert (from_macro_expansion_at (loc));
+
+  const line_map *map = linemap_lookup (line_table, loc);
+  const line_map_macro *macro_map;
+  do
+    {
+      macro_map = linemap_check_macro (map);
+      loc = linemap_unwind_toward_expansion (line_table, loc, &map);
+    } while (linemap_macro_expansion_map_p (map));
+
+  return macro_map;
+}
+
 /* Given LOC_A and LOC_B from macro expansions, return true if
    they are "spelled the same" i.e. if they are both directly from
    expansion of the same non-function-like macro.  */
@@ -409,11 +428,8 @@  spelled_the_same_p (location_t loc_a, location_t loc_b)
   gcc_assert (from_macro_expansion_at (loc_a));
   gcc_assert (from_macro_expansion_at (loc_b));
 
-  const line_map_macro *map_a
-    = linemap_check_macro (linemap_lookup (line_table, loc_a));
-
-  const line_map_macro *map_b
-    = linemap_check_macro (linemap_lookup (line_table, loc_b));
+  const line_map_macro *map_a = get_outermost_macro_expansion (loc_a);
+  const line_map_macro *map_b = get_outermost_macro_expansion (loc_b);
 
   if (map_a->macro == map_b->macro)
     if (!cpp_fun_like_macro_p (map_a->macro))
diff --git a/gcc/testsuite/c-c++-common/Wtautological-compare-8.c b/gcc/testsuite/c-c++-common/Wtautological-compare-8.c
new file mode 100644
index 0000000..1adedad
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/Wtautological-compare-8.c
@@ -0,0 +1,33 @@ 
+/* { dg-options "-Wtautological-compare" } */
+
+int foo;
+#define INCOMING_FRAME_SP_OFFSET foo
+#define DEFAULT_INCOMING_FRAME_SP_OFFSET INCOMING_FRAME_SP_OFFSET
+
+int test (void)
+{
+  if (DEFAULT_INCOMING_FRAME_SP_OFFSET != INCOMING_FRAME_SP_OFFSET) /* { dg-warning "self-comparison" "" { target c } } */
+    return 1;
+  else
+    return 0;
+}
+
+#define BYTES_BIG_ENDIAN foo
+#define WORDS_BIG_ENDIAN foo
+
+int test_2 (void)
+{
+  if (BYTES_BIG_ENDIAN != WORDS_BIG_ENDIAN) /* { dg-warning "self-comparison" "" { target c } } */
+    return 1;
+  else
+    return 0;
+}
+
+#define COND DEFAULT_INCOMING_FRAME_SP_OFFSET != INCOMING_FRAME_SP_OFFSET
+int test_3 (void)
+{
+  if (COND)
+    return 1;
+  else
+    return 0;
+}