This patch stifles -Wlogical-op a bit: don't warn if either operand comes from a macro expansion. As the comment says, it doesn't fix the bug completely, but it's a simple improvement. I did this by introducing a new macro.
Bootstrapped/regtested on x86_64-linux, ok for trunk? (Bootstrap with -Wlogical-op enabled does not pass yet.) 2015-04-22 Marek Polacek <pola...@redhat.com> PR c/61534 * input.h (from_macro_expansion_at): Define. * c-common.c (warn_logical_operator): Bail if either operand comes from a macro expansion. * c-c++-common/pr61534-1.c: New test. diff --git gcc/c-family/c-common.c gcc/c-family/c-common.c index 7fe7fa6..b09bbb8 100644 --- gcc/c-family/c-common.c +++ gcc/c-family/c-common.c @@ -1697,6 +1697,13 @@ warn_logical_operator (location_t location, enum tree_code code, tree type, && code != TRUTH_OR_EXPR) return; + /* We don't want to warn if either operand comes from a macro + expansion. ??? This doesn't work with e.g. NEGATE_EXPR yet; + see PR61534. */ + if (from_macro_expansion_at (EXPR_LOCATION (op_left)) + || from_macro_expansion_at (EXPR_LOCATION (op_right))) + return; + /* Warn if &&/|| are being used in a context where it is likely that the bitwise equivalent was intended by the programmer. That is, an expression such as op && MASK diff --git gcc/input.h gcc/input.h index 7a0483f..93eb6ed 100644 --- gcc/input.h +++ gcc/input.h @@ -70,6 +70,10 @@ extern location_t input_location; header, but expanded in a non-system file. */ #define in_system_header_at(LOC) \ (linemap_location_in_system_header_p (line_table, LOC)) +/* Return a positive value if LOCATION is the locus of a token that + comes from a macro expansion, O otherwise. */ +#define from_macro_expansion_at(LOC) \ + ((linemap_location_from_macro_expansion_p (line_table, LOC))) void dump_line_table_statistics (void); diff --git gcc/testsuite/c-c++-common/pr61534-1.c gcc/testsuite/c-c++-common/pr61534-1.c index e69de29..1e304f0 100644 --- gcc/testsuite/c-c++-common/pr61534-1.c +++ gcc/testsuite/c-c++-common/pr61534-1.c @@ -0,0 +1,13 @@ +/* PR c/61534 */ +/* { dg-options "-Wlogical-op" } */ + +extern int xxx; +#define XXX !xxx +int +test (void) +{ + if (XXX && xxx) /* { dg-bogus "logical" } */ + return 4; + else + return 0; +} Marek