Message ID | 1545274889-6253-1-git-send-email-dmalcolm@redhat.com |
---|---|
State | New |
Headers | show |
Series | -Wtautological-compare: fix comparison of macro expansions | expand |
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®rtesting 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
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®rtesting 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 --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; +}