+2018-12-20 David Malcolm <dmalcolm@redhat.com>
+
+ PR c++/87504
+ * 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.
+
2018-12-19 David Malcolm <dmalcolm@redhat.com>
PR c++/87504
"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. */
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))
--- /dev/null
+/* { 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;
+}