This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] -Wtautological-compare: fix comparison of macro expansions
- From: David Malcolm <dmalcolm at redhat dot com>
- To: Aaron Sawdey <acsawdey at linux dot ibm dot com>, gcc-patches at gcc dot gnu dot org
- Cc: David Malcolm <dmalcolm at redhat dot com>
- Date: Wed, 19 Dec 2018 22:01:29 -0500
- Subject: [PATCH] -Wtautological-compare: fix comparison of macro expansions
- References: <ba86c393-e0cf-bd1e-16e8-f38aaac1bf66@linux.ibm.com>
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
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;
+}
--
1.8.5.3