This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: C++ PATCH to forbid use of bool with the ++ operator
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