]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++: Fix bogus -Wparentheses warning with fold-expression [PR94505]
authorMarek Polacek <polacek@redhat.com>
Mon, 20 Apr 2020 19:43:49 +0000 (15:43 -0400)
committerMarek Polacek <polacek@redhat.com>
Mon, 20 Apr 2020 19:43:49 +0000 (15:43 -0400)
We issue bogus -Wparentheses warnings (3 of them!) for this fold expression:

  ((B && true) || ...)

Firstly, issuing a warning for a compiler-generated expression is wrong
and secondly, B && true must be wrapped in ( ) otherwise you'll get
error: binary expression in operand of fold-expression.

        PR c++/94505 - bogus -Wparentheses warning with fold-expression.
        * pt.c (fold_expression): Add warning_sentinel for -Wparentheses
        before calling build_x_binary_op.

        * g++.dg/cpp1z/fold11.C: New test.

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/g++.dg/cpp1z/fold11.C [new file with mode: 0644]

index cb49aeccafa7feeba0fa58c4b724b745eb2141f9..d81de9d32df143e80574b38ef30ef5f9d063adf8 100644 (file)
@@ -1,3 +1,12 @@
+2020-04-20  Marek Polacek  <polacek@redhat.com>
+
+       Backported from mainline
+       2020-04-20  Marek Polacek  <polacek@redhat.com>
+
+       PR c++/94505 - bogus -Wparentheses warning with fold-expression.
+       * pt.c (fold_expression): Add warning_sentinel for -Wparentheses
+       before calling build_x_binary_op.
+
 2020-04-07  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/94512
index 7f51f70c71ad10f3926a66c5b23d0dd08261405c..8d437c5072d65d74879bc7409ec730bd14910360 100644 (file)
@@ -11868,6 +11868,7 @@ fold_expression (tree t, tree left, tree right, tsubst_flags_t complain)
   if (FOLD_EXPR_MODIFY_P (t))
     return build_x_modify_expr (input_location, left, code, right, complain);
 
+  warning_sentinel s(warn_parentheses);
   switch (code)
     {
     case COMPOUND_EXPR:
diff --git a/gcc/testsuite/g++.dg/cpp1z/fold11.C b/gcc/testsuite/g++.dg/cpp1z/fold11.C
new file mode 100644 (file)
index 0000000..09a3055
--- /dev/null
@@ -0,0 +1,12 @@
+// PR c++/94505 - bogus -Wparentheses warning with fold-expression.
+// { dg-do compile { target c++17 } }
+// { dg-options "-Wparentheses" }
+
+template <bool... B>
+bool foo () {
+    return ((B && true) || ...); // { dg-bogus "suggest parentheses" }
+}
+
+int main () {
+    foo<true, false, false, true> ();
+}