OK, thanks.
On Wed, Sep 14, 2016 at 11:28 AM, Marek Polacek <pola...@redhat.com> wrote: > On Tue, Sep 13, 2016 at 11:37:20PM -0400, Jason Merrill wrote: >> On Tue, Sep 13, 2016 at 3:55 PM, Martin Sebor <mse...@gmail.com> wrote: >> > Having said all that, since this is C++ the message could and >> > arguably should refer to a bool expression (or type) instead >> > and avoid having to deal with this altogether. In fact, it >> > would be simpler to rephrase the message as: >> > >> > "use of an operand of type %qT in ... is deprecated", >> > boolean_type_node >> >> Yes. > > Should be done in the patch below. > > Bootstrapped/regtested on x86_64-linux and ppc64-linux, ok for trunk? > > 2016-09-14 Marek Polacek <pola...@redhat.com> > > * 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. > > diff --git gcc/gcc/cp/typeck.c gcc/gcc/cp/typeck.c > index a591d29..808cb6c 100644 > --- gcc/gcc/cp/typeck.c > +++ gcc/gcc/cp/typeck.c > @@ -6030,16 +6030,32 @@ cp_build_unary_op (enum tree_code code, tree xarg, > int 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) > diff --git gcc/gcc/testsuite/c-c++-common/gomp/atomic-12.c > gcc/gcc/testsuite/c-c++-common/gomp/atomic-12.c > index 145e420..e9ca650 100644 > --- gcc/gcc/testsuite/c-c++-common/gomp/atomic-12.c > +++ gcc/gcc/testsuite/c-c++-common/gomp/atomic-12.c > @@ -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" } } */ > diff --git gcc/gcc/testsuite/c-c++-common/gomp/atomic-13.c > gcc/gcc/testsuite/c-c++-common/gomp/atomic-13.c > index 2452035..7f4afcf 100644 > --- gcc/gcc/testsuite/c-c++-common/gomp/atomic-13.c > +++ gcc/gcc/testsuite/c-c++-common/gomp/atomic-13.c > @@ -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" } } */ > diff --git gcc/gcc/testsuite/c-c++-common/gomp/atomic-14.c > gcc/gcc/testsuite/c-c++-common/gomp/atomic-14.c > index f8fc9d8..7e23453 100644 > --- gcc/gcc/testsuite/c-c++-common/gomp/atomic-14.c > +++ gcc/gcc/testsuite/c-c++-common/gomp/atomic-14.c > @@ -1,6 +1,6 @@ > /* PR middle-end/45423 */ > /* { dg-do compile } */ > -/* { dg-options "-fopenmp" } */ > +/* { dg-options "-fopenmp -Wno-deprecated" } */ > > #ifdef __cplusplus > bool *baz (); > diff --git gcc/gcc/testsuite/c-c++-common/pr60439.c > gcc/gcc/testsuite/c-c++-common/pr60439.c > index 68bd33c..71b397a 100644 > --- gcc/gcc/testsuite/c-c++-common/pr60439.c > +++ gcc/gcc/testsuite/c-c++-common/pr60439.c > @@ -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; > diff --git gcc/gcc/testsuite/g++.dg/cpp1y/lambda-init11.C > gcc/gcc/testsuite/g++.dg/cpp1y/lambda-init11.C > index f7525d8..4d434cd 100644 > --- gcc/gcc/testsuite/g++.dg/cpp1y/lambda-init11.C > +++ gcc/gcc/testsuite/g++.dg/cpp1y/lambda-init11.C > @@ -16,5 +16,4 @@ int main(){ > foo(3.14f); > foo(0); > foo('a'); > - foo(false); > } > diff --git gcc/gcc/testsuite/g++.dg/cpp1z/bool-increment1.C > gcc/gcc/testsuite/g++.dg/cpp1z/bool-increment1.C > index e69de29..ae2dcf9 100644 > --- gcc/gcc/testsuite/g++.dg/cpp1z/bool-increment1.C > +++ gcc/gcc/testsuite/g++.dg/cpp1z/bool-increment1.C > @@ -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; > +} > diff --git gcc/gcc/testsuite/g++.dg/expr/bitfield3.C > gcc/gcc/testsuite/g++.dg/expr/bitfield3.C > index 3221263..3f30337 100644 > --- gcc/gcc/testsuite/g++.dg/expr/bitfield3.C > +++ gcc/gcc/testsuite/g++.dg/expr/bitfield3.C > @@ -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." } > } > diff --git gcc/gcc/testsuite/g++.dg/expr/bitfield4.C > gcc/gcc/testsuite/g++.dg/expr/bitfield4.C > index d824964..7fae086 100644 > --- gcc/gcc/testsuite/g++.dg/expr/bitfield4.C > +++ gcc/gcc/testsuite/g++.dg/expr/bitfield4.C > @@ -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" } > } > diff --git gcc/gcc/testsuite/g++.dg/expr/bitfield5.C > gcc/gcc/testsuite/g++.dg/expr/bitfield5.C > index 3d18e15..0a37f9f 100644 > --- gcc/gcc/testsuite/g++.dg/expr/bitfield5.C > +++ gcc/gcc/testsuite/g++.dg/expr/bitfield5.C > @@ -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; > } > diff --git gcc/gcc/testsuite/g++.dg/expr/bitfield6.C > gcc/gcc/testsuite/g++.dg/expr/bitfield6.C > index 6f6d559..8523866 100644 > --- gcc/gcc/testsuite/g++.dg/expr/bitfield6.C > +++ gcc/gcc/testsuite/g++.dg/expr/bitfield6.C > @@ -7,5 +7,5 @@ struct S { > S s; > > void f() { > - ++s.x = false; > + ++s.x = false; // { dg-warning "deprecated" } > } > diff --git gcc/gcc/testsuite/g++.dg/expr/bool1.C > gcc/gcc/testsuite/g++.dg/expr/bool1.C > index bfb40e3..503e8b4 100644 > --- gcc/gcc/testsuite/g++.dg/expr/bool1.C > +++ gcc/gcc/testsuite/g++.dg/expr/bool1.C > @@ -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 (); > diff --git gcc/gcc/testsuite/g++.dg/expr/bool3.C > gcc/gcc/testsuite/g++.dg/expr/bool3.C > index 61669e2..1866ed4 100644 > --- gcc/gcc/testsuite/g++.dg/expr/bool3.C > +++ gcc/gcc/testsuite/g++.dg/expr/bool3.C > @@ -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 (); > diff --git gcc/gcc/testsuite/g++.dg/expr/lval3.C > gcc/gcc/testsuite/g++.dg/expr/lval3.C > index f106e69..8e0aead 100644 > --- gcc/gcc/testsuite/g++.dg/expr/lval3.C > +++ gcc/gcc/testsuite/g++.dg/expr/lval3.C > @@ -4,6 +4,7 @@ f() > { > bool i = 0; > i++ = 3; // { dg-error "" } > + // { dg-warning "deprecated" "" { target *-*-* } 6 } > } > > > diff --git gcc/gcc/testsuite/g++.dg/expr/lval4.C > gcc/gcc/testsuite/g++.dg/expr/lval4.C > index c66e2f6..b903ec8 100644 > --- gcc/gcc/testsuite/g++.dg/expr/lval4.C > +++ gcc/gcc/testsuite/g++.dg/expr/lval4.C > @@ -4,6 +4,7 @@ f() > { > bool i = 0; > ++i = 3; > + // { dg-warning "deprecated" "" { target *-*-* } 6 } > } > > > diff --git gcc/gcc/testsuite/g++.dg/gomp/atomic-14.C > gcc/gcc/testsuite/g++.dg/gomp/atomic-14.C > index ae1eb50..982f44f 100644 > --- gcc/gcc/testsuite/g++.dg/gomp/atomic-14.C > +++ gcc/gcc/testsuite/g++.dg/gomp/atomic-14.C > @@ -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; > } > diff --git gcc/gcc/testsuite/g++.dg/other/error18.C > gcc/gcc/testsuite/g++.dg/other/error18.C > index 9e4d21c..05ddf11 100644 > --- gcc/gcc/testsuite/g++.dg/other/error18.C > +++ gcc/gcc/testsuite/g++.dg/other/error18.C > @@ -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." } > } > diff --git gcc/gcc/testsuite/g++.old-deja/g++.jason/bool5.C > gcc/gcc/testsuite/g++.old-deja/g++.jason/bool5.C > index 1d2f5b6..0a16ccb 100644 > --- gcc/gcc/testsuite/g++.old-deja/g++.jason/bool5.C > +++ gcc/gcc/testsuite/g++.old-deja/g++.jason/bool5.C > @@ -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; > } > diff --git gcc/libgomp/testsuite/libgomp.c++/atomic-3.C > gcc/libgomp/testsuite/libgomp.c++/atomic-3.C > index 660b260..f957b2f 100644 > --- gcc/libgomp/testsuite/libgomp.c++/atomic-3.C > +++ gcc/libgomp/testsuite/libgomp.c++/atomic-3.C > @@ -1,4 +1,5 @@ > // { dg-do run } > +// { dg-options "-Wno-deprecated" } > > extern "C" void abort (void); > bool v, x1, x2, x3, x4, x5, x6; > diff --git > gcc/libstdc++-v3/testsuite/23_containers/vector/debug/insert6_neg.cc > gcc/libstdc++-v3/testsuite/23_containers/vector/debug/insert6_neg.cc > index 9893293..c939c22 100644 > --- gcc/libstdc++-v3/testsuite/23_containers/vector/debug/insert6_neg.cc > +++ gcc/libstdc++-v3/testsuite/23_containers/vector/debug/insert6_neg.cc > @@ -16,6 +16,7 @@ > // <http://www.gnu.org/licenses/>. > // > // { dg-do run { xfail *-*-* } } > +// { dg-options "-Wno-deprecated" } > > #include <vector> > #include <debug/vector> > > Marek