typeck.c (cp_build_unary_op): Diagnose incrementing boolean expressions.
authorMarek Polacek <polacek@redhat.com>
Wed, 14 Sep 2016 17:46:59 +0000 (17:46 +0000)
committerMarek Polacek <mpolacek@gcc.gnu.org>
Wed, 14 Sep 2016 17:46:59 +0000 (17:46 +0000)
* typeck.c (cp_build_unary_op): Diagnose incrementing boolean
expressions.  Tweak an error message.

* c-c++-common/gomp/atomic-12.c: Use -Wno-deprecated.
* c-c++-common/gomp/atomic-13.c: Likewise.
* c-c++-common/gomp/atomic-14.c: Likewise.
* g++.dg/cpp1y/lambda-init11.C: Remove invalid code.
* g++.dg/cpp1z/bool-increment1.C: New test.
* c-c++-common/pr60439.c: Add dg-warning.
* g++.dg/expr/bitfield4.C: Likewise.
* g++.dg/expr/bitfield5.C: Likewise.
* g++.dg/expr/bitfield6.C: Likewise.
* g++.dg/expr/bool1.C: Likewise.
* g++.dg/expr/bool3.C: Likewise.
* g++.dg/expr/lval3.C: Likewise.
* g++.dg/expr/lval4.C: Likewise.
* g++.old-deja/g++.jason/bool5.C: Likewise.
* g++.dg/expr/bitfield3.C: Adjust dg-error.
* g++.dg/other/error18.C: Likewise.
* g++.dg/gomp/atomic-14.C: Likewise.
libgomp/
* testsuite/libgomp.c++/atomic-3.C: Use -Wno-deprecated.
libstdc++-v3/
* testsuite/23_containers/vector/debug/insert6_neg.cc: Use
-Wno-deprecated.

From-SVN: r240141

24 files changed:
gcc/cp/ChangeLog
gcc/cp/typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/gomp/atomic-12.c
gcc/testsuite/c-c++-common/gomp/atomic-13.c
gcc/testsuite/c-c++-common/gomp/atomic-14.c
gcc/testsuite/c-c++-common/pr60439.c
gcc/testsuite/g++.dg/cpp1y/lambda-init11.C
gcc/testsuite/g++.dg/cpp1z/bool-increment1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/expr/bitfield3.C
gcc/testsuite/g++.dg/expr/bitfield4.C
gcc/testsuite/g++.dg/expr/bitfield5.C
gcc/testsuite/g++.dg/expr/bitfield6.C
gcc/testsuite/g++.dg/expr/bool1.C
gcc/testsuite/g++.dg/expr/bool3.C
gcc/testsuite/g++.dg/expr/lval3.C
gcc/testsuite/g++.dg/expr/lval4.C
gcc/testsuite/g++.dg/gomp/atomic-14.C
gcc/testsuite/g++.dg/other/error18.C
gcc/testsuite/g++.old-deja/g++.jason/bool5.C
libgomp/ChangeLog
libgomp/testsuite/libgomp.c++/atomic-3.C
libstdc++-v3/ChangeLog
libstdc++-v3/testsuite/23_containers/vector/debug/insert6_neg.cc

index df4655ec91613fd4ef112e3c3e9f3370833ed492..001479c8b5e45fa6f62519b4e0c39f4d25a6722c 100644 (file)
@@ -1,3 +1,8 @@
+2016-09-14  Marek Polacek  <polacek@redhat.com>
+
+       * typeck.c (cp_build_unary_op): Diagnose incrementing boolean
+       expressions.  Tweak an error message.
+
 2016-09-14  Marek Polacek  <polacek@redhat.com>
 
        * cp-tree.h (cp_build_unary_op): Change nonconvert parameter type to
index c51d6d0b0df2cc98510a70edd41ac0f83c213b9e..c53a85a16e0ef678e32ab48521aedfa68ecf798c 100644 (file)
@@ -6029,16 +6029,32 @@ cp_build_unary_op (enum tree_code code, tree xarg, bool noconvert,
                              complain))
          return error_mark_node;
 
-       /* Forbid using -- on `bool'.  */
+       /* Forbid using -- or ++ in C++17 on `bool'.  */
        if (TREE_CODE (declared_type) == BOOLEAN_TYPE)
          {
            if (code == POSTDECREMENT_EXPR || code == PREDECREMENT_EXPR)
              {
                 if (complain & tf_error)
-                  error ("invalid use of Boolean expression as operand "
-                         "to %<operator--%>");
+                 error ("use of an operand of type %qT in %<operator--%> "
+                        "is forbidden", boolean_type_node);
                return error_mark_node;
              }
+           else
+             {
+               if (cxx_dialect >= cxx1z)
+                 {
+                   if (complain & tf_error)
+                     error ("use of an operand of type %qT in "
+                            "%<operator++%> is forbidden in C++1z",
+                            boolean_type_node);
+                   return error_mark_node;
+                 }
+               /* Otherwise, [depr.incr.bool] says this is deprecated.  */
+               else if (!in_system_header_at (input_location))
+                 warning (OPT_Wdeprecated, "use of an operand of type %qT "
+                          "in %<operator++%> is deprecated",
+                          boolean_type_node);
+             }
            val = boolean_increment (code, arg);
          }
        else if (code == POSTINCREMENT_EXPR || code == POSTDECREMENT_EXPR)
index e394dcd92f5e0e7c8953eb6867e75e21b3c7804c..dc55a3d8cd2121304590070655072133841c89f9 100644 (file)
@@ -1,3 +1,23 @@
+2016-09-14  Marek Polacek  <polacek@redhat.com>
+
+       * c-c++-common/gomp/atomic-12.c: Use -Wno-deprecated.
+       * c-c++-common/gomp/atomic-13.c: Likewise.
+       * c-c++-common/gomp/atomic-14.c: Likewise.
+       * g++.dg/cpp1y/lambda-init11.C: Remove invalid code.
+       * g++.dg/cpp1z/bool-increment1.C: New test.
+       * c-c++-common/pr60439.c: Add dg-warning.
+       * g++.dg/expr/bitfield4.C: Likewise.
+       * g++.dg/expr/bitfield5.C: Likewise.
+       * g++.dg/expr/bitfield6.C: Likewise.
+       * g++.dg/expr/bool1.C: Likewise.
+       * g++.dg/expr/bool3.C: Likewise.
+       * g++.dg/expr/lval3.C: Likewise.
+       * g++.dg/expr/lval4.C: Likewise.
+       * g++.old-deja/g++.jason/bool5.C: Likewise.
+       * g++.dg/expr/bitfield3.C: Adjust dg-error.
+       * g++.dg/other/error18.C: Likewise.
+       * g++.dg/gomp/atomic-14.C: Likewise.
+
 2016-09-14  Nathan Sidwell  <nathan@acm.org>
 
        PR c++/77539
index 145e4201642670b0549051c5730629db07a6947a..e9ca6503cfe2a29a81c42e371e71e739329d8d0f 100644 (file)
@@ -1,6 +1,6 @@
 /* PR middle-end/45423 */
 /* { dg-do compile } */
-/* { dg-options "-fopenmp -fdump-tree-gimple -g0" } */
+/* { dg-options "-fopenmp -fdump-tree-gimple -g0 -Wno-deprecated" } */
 /* atomicvar should never be referenced in between the barrier and
    following #pragma omp atomic_load.  */
 /* { dg-final { scan-tree-dump-not "barrier\[^#\]*atomicvar" "gimple" } } */
index 2452035da5ba21c817a6d2ecbe29649de4067154..7f4afcf63ad9b89a06648864bcdb35df91b72fba 100644 (file)
@@ -1,6 +1,6 @@
 /* PR middle-end/45423 */
 /* { dg-do compile } */
-/* { dg-options "-fopenmp -fdump-tree-gimple -g0 -O2" } */
+/* { dg-options "-fopenmp -fdump-tree-gimple -g0 -O2 -Wno-deprecated" } */
 /* atomicvar should never be referenced in between the barrier and
    following #pragma omp atomic_load.  */
 /* { dg-final { scan-tree-dump-not "barrier\[^#\]*atomicvar" "gimple" } } */
index f8fc9d87257ab5a2c38a09fad6146009d93b5cb2..7e2345387d48ef36901cec020bf8351858f60e73 100644 (file)
@@ -1,6 +1,6 @@
 /* PR middle-end/45423 */
 /* { dg-do compile } */
-/* { dg-options "-fopenmp" } */
+/* { dg-options "-fopenmp -Wno-deprecated" } */
 
 #ifdef __cplusplus
 bool *baz ();
index 68bd33c22cb3b7898ead0cf8e78c61ea5fac02fd..71b397a1c7dae7d16aadb105918cdb48e346eda1 100644 (file)
@@ -132,6 +132,7 @@ f6 (bool b)
       break;
     }
   switch (b++) /* { dg-warning "switch condition has" } */
+  /* { dg-warning "is deprecated" "" { target c++ } 134 } */
     {
     case 3:
       break;
index f7525d8664a90483134ada07cab27c762026219b..4d434cd9ca08913fc19bc9e5b3687f89ebe079b5 100644 (file)
@@ -16,5 +16,4 @@ int main(){
   foo(3.14f);
   foo(0);
   foo('a');
-  foo(false);
 }
diff --git a/gcc/testsuite/g++.dg/cpp1z/bool-increment1.C b/gcc/testsuite/g++.dg/cpp1z/bool-increment1.C
new file mode 100644 (file)
index 0000000..ae2dcf9
--- /dev/null
@@ -0,0 +1,14 @@
+// { dg-options -std=c++1z }
+
+int
+fn (bool b)
+{
+  int r = 0;
+
+  r += b++; // { dg-error "use of an operand of type .bool. in .operator\\+\\+. is forbidden in" }
+  r += ++b; // { dg-error "use of an operand of type .bool. in .operator\\+\\+. is forbidden in" }
+  r += b--; // { dg-error "use of an operand of type .bool. in .operator--. is forbidden" }
+  r += --b; // { dg-error "use of an operand of type .bool. in .operator--. is forbidden" }
+
+  return r;
+}
index 3221263a9066931c415c82271ee27cb145baca68..3f30337c2dbb0d6d7e72d4db2d216fd4f5d4c28e 100644 (file)
@@ -7,6 +7,6 @@ struct S {
 S s;
 
 void f() {
-  s.x--; // { dg-error "Boolean expression" }
-  --s.x; // { dg-error "Boolean expression" }
+  s.x--; // { dg-error "use of an operand of type .bool." }
+  --s.x; // { dg-error "use of an operand of type .bool." }
 }
index d824964e18790482b03ae44767b6fcceb617db21..7fae086b857e7695bdf846b4e3156d48583474cb 100644 (file)
@@ -14,6 +14,6 @@ template <>
 void f(bool) {} 
 
 int main() {
-  f(s.x++);
-  f(++s.x);
+  f(s.x++); // { dg-warning "deprecated" }
+  f(++s.x); // { dg-warning "deprecated" }
 }
index 3d18e159cc0636e6488be4cce1e4880812aec26e..0a37f9f166b8ebfcba1af719a7753089a85bc773 100644 (file)
@@ -8,10 +8,10 @@ struct S {
 S s;
 
 int main() {
-  s.x++;
+  s.x++; // { dg-warning "deprecated" }
   if (s.x != 1)
     return 1;
-  ++s.x;
+  ++s.x; // { dg-warning "deprecated" }
   if (s.x != 1)
     return 2;
 }
index 6f6d559a38e28209bbc335e2a160da6556932e04..8523866cd9ddbc057ddcaa0dc655d182d9567324 100644 (file)
@@ -7,5 +7,5 @@ struct S {
 S s;
 
 void f() {
-  ++s.x = false;
+  ++s.x = false; // { dg-warning "deprecated" }
 }
index bfb40e33092fa4bb1873bbee35374c441062de93..503e8b40c8c48afc592c863273a9d6e19b7f636d 100644 (file)
@@ -10,8 +10,8 @@ int main()
   my_bool b = false;
   int i;
 
-  b++;
-  b++;
+  b++; // { dg-warning "deprecated" }
+  b++; // { dg-warning "deprecated" }
   i = b;
   if (i != 1)
     abort ();
index 61669e27befd6d9fc59708afda3c390b68974618..1866ed47e9db5bfd7040f66cd4fd7bcdb0076728 100644 (file)
@@ -10,8 +10,8 @@ int main()
   my_bool b = false;
   int i;
 
-  b++;
-  b++;
+  b++; // { dg-warning "deprecated" }
+  b++; // { dg-warning "deprecated" }
   i = b;
   if (i != 1)
     abort ();
index f106e69619de0cb1adf972b1194fa94ed830fc5c..8e0aeade4b9a5c290c8fabcc38aa37126de7be41 100644 (file)
@@ -4,6 +4,7 @@ f()
 {
   bool i = 0;
   i++ = 3; // { dg-error "" }
+  // { dg-warning "deprecated" "" { target *-*-* } 6 }
 }
 
 
index c66e2f6af25a9320044ae9387b2618ff0fb2b7b4..b903ec8c39ec9bcb81bc5ab99e760cabfd58af42 100644 (file)
@@ -4,6 +4,7 @@ f()
 {
   bool i = 0;
   ++i = 3;
+  // { dg-warning "deprecated" "" { target *-*-* } 6 }
 }
 
 
index ae1eb50dcd63146cd3b4d25c5be8b2e9c9b62b64..982f44fae923ead09d7225968721c011108c240f 100644 (file)
@@ -8,12 +8,12 @@ int
 foo (void)
 {
   #pragma omp atomic
-    (*baz ())--;       // { dg-error "invalid use of Boolean" }
+    (*baz ())--;       // { dg-error "use of an operand of type .bool." }
   #pragma omp atomic
-    --(*baz ());       // { dg-error "invalid use of Boolean" }
+    --(*baz ());       // { dg-error "use of an operand of type .bool." }
   #pragma omp atomic
-    atomicvar--;       // { dg-error "invalid use of Boolean" }
+    atomicvar--;       // { dg-error "use of an operand of type .bool." }
   #pragma omp atomic
-    --atomicvar;       // { dg-error "invalid use of Boolean" }
+    --atomicvar;       // { dg-error "use of an operand of type .bool." }
   return 0;
 }
index 9e4d21cfde0b13a0249426273fed81de37042b49..05ddf116675cfef48a73092afbeda8837cec58de 100644 (file)
@@ -7,5 +7,5 @@ struct A
 
 void f(A a)
 {
-  a.b--; // { dg-error "Boolean expression" }
+  a.b--; // { dg-error "use of an operand of type .bool." }
 }
index 1d2f5b60b46fb3e2e035aa646ecd2e733efb87e0..0a16ccb16acdd1609585ea80fa52352789faa0d3 100644 (file)
@@ -2,10 +2,10 @@
 int main ()
 {
   bool b = false;
-  int i = b++;
+  int i = b++; // { dg-warning "deprecated" }
   if (i != false || b != true)
     return 1;
-  i = b++;
+  i = b++; // { dg-warning "deprecated" }
   if (i != true || b != true)
     return 1;
 }
index 32b11ec067f8de919dd8b2813faff7a442e702f4..e7749b2be4e2fdc2bc93ef711ab4f2d6e553f490 100644 (file)
@@ -1,3 +1,7 @@
+2016-09-14  Marek Polacek  <polacek@redhat.com>
+
+       * testsuite/libgomp.c++/atomic-3.C: Use -Wno-deprecated.
+
 2016-08-19  Jakub Jelinek  <jakub@redhat.com>
 
        PR fortran/71014
index 660b260e19fb46ec7cfc4e10ec0f602d65dae2fb..f957b2fece55798602dbcb2ad6a0b25184fe1077 100644 (file)
@@ -1,4 +1,5 @@
 // { dg-do run }
+// { dg-options "-Wno-deprecated" }
 
 extern "C" void abort (void);
 bool v, x1, x2, x3, x4, x5, x6;
index 1ec0981a5e338824d30909644ec709a7820d1038..cb6e964f69a910ce5160d6083d41c486ab38e896 100644 (file)
@@ -1,3 +1,8 @@
+2016-09-14  Marek Polacek  <polacek@redhat.com>
+
+       * testsuite/23_containers/vector/debug/insert6_neg.cc: Use
+       -Wno-deprecated.
+
 2016-09-14  Christophe Lyon  <christophe.lyon@linaro.org>
 
        * testsuite/23_containers/vector/bool/modifiers/insert/31370.cc:
index 9893293613f651080d0048036d6295eb721f457a..c939c2203fc0466735c8b11e2539afce0092d23d 100644 (file)
@@ -16,6 +16,7 @@
 // <http://www.gnu.org/licenses/>.
 //
 // { dg-do run { xfail *-*-* } }
+// { dg-options "-Wno-deprecated" }
 
 #include <vector>
 #include <debug/vector>