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

Reply via email to