diff mbox

C++ PATCH to forbid use of bool with the ++ operator

Message ID 20160914152851.GW19950@redhat.com
State New
Headers show

Commit Message

Marek Polacek Sept. 14, 2016, 3:28 p.m. UTC
On Tue, Sep 13, 2016 at 11:37:20PM -0400, Jason Merrill wrote:
> On Tue, Sep 13, 2016 at 3:55 PM, Martin Sebor <msebor@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  <polacek@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.


	Marek

Comments

Jason Merrill Sept. 14, 2016, 5:38 p.m. UTC | #1
OK, thanks.

On Wed, Sep 14, 2016 at 11:28 AM, Marek Polacek <polacek@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 <msebor@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  <polacek@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
Jason Merrill Sept. 21, 2016, 7:45 p.m. UTC | #2
On Wed, Sep 14, 2016 at 1:38 PM, Jason Merrill <jason@redhat.com> wrote:
>>         * 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.

Many of these tests now break with -std=c++1z; try 'make check-c++1z' to see.

> FAIL: c-c++-common/gomp/atomic-12.c  -std=gnu++1z (test for excess errors)
> FAIL: c-c++-common/gomp/atomic-13.c  -std=gnu++1z (test for excess errors)
> FAIL: c-c++-common/gomp/atomic-14.c  -std=gnu++1z (test for excess errors)
> FAIL: c-c++-common/pr60439.c  -std=c++1z (test for excess errors)
> FAIL: c-c++-common/pr60439.c  -std=c++1z  (test for warnings, line 134)
> FAIL: g++.dg/expr/bitfield4.C  -std=c++1z (test for excess errors)
> FAIL: g++.dg/expr/bitfield4.C  -std=c++1z  (test for warnings, line 17)
> FAIL: g++.dg/expr/bitfield4.C  -std=c++1z  (test for warnings, line 18)
> FAIL: g++.dg/expr/bitfield5.C  -std=c++1z (test for excess errors)
> FAIL: g++.dg/expr/bitfield5.C  -std=c++1z  (test for warnings, line 11)
> FAIL: g++.dg/expr/bitfield5.C  -std=c++1z  (test for warnings, line 14)
> FAIL: g++.dg/expr/bitfield6.C  -std=c++1z (test for excess errors)
> FAIL: g++.dg/expr/bitfield6.C  -std=c++1z  (test for warnings, line 10)
> FAIL: g++.dg/expr/bool1.C  -std=c++1z (test for excess errors)
> FAIL: g++.dg/expr/bool1.C  -std=c++1z  (test for warnings, line 13)
> FAIL: g++.dg/expr/bool1.C  -std=c++1z  (test for warnings, line 14)
> FAIL: g++.dg/expr/bool3.C  -std=c++1z (test for excess errors)
> FAIL: g++.dg/expr/bool3.C  -std=c++1z  (test for warnings, line 13)
> FAIL: g++.dg/expr/bool3.C  -std=c++1z  (test for warnings, line 14)
> FAIL: g++.dg/expr/lval3.C  -std=c++1z  (test for warnings, line 6)
> FAIL: g++.dg/expr/lval4.C  -std=c++1z (test for excess errors)
> FAIL: g++.dg/expr/lval4.C  -std=c++1z  (test for warnings, line 6)
> FAIL: g++.old-deja/g++.jason/bool5.C  -std=c++1z (test for excess errors)
> FAIL: g++.old-deja/g++.jason/bool5.C  -std=c++1z  (test for warnings, line 5)
> FAIL: g++.old-deja/g++.jason/bool5.C  -std=c++1z  (test for warnings, line 8)
Marek Polacek Sept. 21, 2016, 7:51 p.m. UTC | #3
On Wed, Sep 21, 2016 at 03:45:55PM -0400, Jason Merrill wrote:
> On Wed, Sep 14, 2016 at 1:38 PM, Jason Merrill <jason@redhat.com> wrote:
> >>         * 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.
> 
> Many of these tests now break with -std=c++1z; try 'make check-c++1z' to see.
 
Sorry.  I'll look into it.

> > FAIL: c-c++-common/gomp/atomic-12.c  -std=gnu++1z (test for excess errors)
> > FAIL: c-c++-common/gomp/atomic-13.c  -std=gnu++1z (test for excess errors)
> > FAIL: c-c++-common/gomp/atomic-14.c  -std=gnu++1z (test for excess errors)
> > FAIL: c-c++-common/pr60439.c  -std=c++1z (test for excess errors)
> > FAIL: c-c++-common/pr60439.c  -std=c++1z  (test for warnings, line 134)
> > FAIL: g++.dg/expr/bitfield4.C  -std=c++1z (test for excess errors)
> > FAIL: g++.dg/expr/bitfield4.C  -std=c++1z  (test for warnings, line 17)
> > FAIL: g++.dg/expr/bitfield4.C  -std=c++1z  (test for warnings, line 18)
> > FAIL: g++.dg/expr/bitfield5.C  -std=c++1z (test for excess errors)
> > FAIL: g++.dg/expr/bitfield5.C  -std=c++1z  (test for warnings, line 11)
> > FAIL: g++.dg/expr/bitfield5.C  -std=c++1z  (test for warnings, line 14)
> > FAIL: g++.dg/expr/bitfield6.C  -std=c++1z (test for excess errors)
> > FAIL: g++.dg/expr/bitfield6.C  -std=c++1z  (test for warnings, line 10)
> > FAIL: g++.dg/expr/bool1.C  -std=c++1z (test for excess errors)
> > FAIL: g++.dg/expr/bool1.C  -std=c++1z  (test for warnings, line 13)
> > FAIL: g++.dg/expr/bool1.C  -std=c++1z  (test for warnings, line 14)
> > FAIL: g++.dg/expr/bool3.C  -std=c++1z (test for excess errors)
> > FAIL: g++.dg/expr/bool3.C  -std=c++1z  (test for warnings, line 13)
> > FAIL: g++.dg/expr/bool3.C  -std=c++1z  (test for warnings, line 14)
> > FAIL: g++.dg/expr/lval3.C  -std=c++1z  (test for warnings, line 6)
> > FAIL: g++.dg/expr/lval4.C  -std=c++1z (test for excess errors)
> > FAIL: g++.dg/expr/lval4.C  -std=c++1z  (test for warnings, line 6)
> > FAIL: g++.old-deja/g++.jason/bool5.C  -std=c++1z (test for excess errors)
> > FAIL: g++.old-deja/g++.jason/bool5.C  -std=c++1z  (test for warnings, line 5)
> > FAIL: g++.old-deja/g++.jason/bool5.C  -std=c++1z  (test for warnings, line 8)

	Marek
diff mbox

Patch

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>