Commit 20a1e5b8 by Marek Polacek Committed by Marek Polacek

typeck.c (cp_build_unary_op): Diagnose incrementing boolean expressions.

	* 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
parent f335184d
2016-09-14 Marek Polacek <polacek@redhat.com> 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 * cp-tree.h (cp_build_unary_op): Change nonconvert parameter type to
bool. bool.
* decl2.c (one_static_initialization_or_destruction): Use true instead * decl2.c (one_static_initialization_or_destruction): Use true instead
......
...@@ -6029,16 +6029,32 @@ cp_build_unary_op (enum tree_code code, tree xarg, bool noconvert, ...@@ -6029,16 +6029,32 @@ cp_build_unary_op (enum tree_code code, tree xarg, bool noconvert,
complain)) complain))
return error_mark_node; return error_mark_node;
/* Forbid using -- on `bool'. */ /* Forbid using -- or ++ in C++17 on `bool'. */
if (TREE_CODE (declared_type) == BOOLEAN_TYPE) if (TREE_CODE (declared_type) == BOOLEAN_TYPE)
{ {
if (code == POSTDECREMENT_EXPR || code == PREDECREMENT_EXPR) if (code == POSTDECREMENT_EXPR || code == PREDECREMENT_EXPR)
{ {
if (complain & tf_error) if (complain & tf_error)
error ("invalid use of Boolean expression as operand " error ("use of an operand of type %qT in %<operator--%> "
"to %<operator--%>"); "is forbidden", boolean_type_node);
return error_mark_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); val = boolean_increment (code, arg);
} }
else if (code == POSTINCREMENT_EXPR || code == POSTDECREMENT_EXPR) else if (code == POSTINCREMENT_EXPR || code == POSTDECREMENT_EXPR)
......
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> 2016-09-14 Nathan Sidwell <nathan@acm.org>
PR c++/77539 PR c++/77539
......
/* PR middle-end/45423 */ /* PR middle-end/45423 */
/* { dg-do compile } */ /* { 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 /* atomicvar should never be referenced in between the barrier and
following #pragma omp atomic_load. */ following #pragma omp atomic_load. */
/* { dg-final { scan-tree-dump-not "barrier\[^#\]*atomicvar" "gimple" } } */ /* { dg-final { scan-tree-dump-not "barrier\[^#\]*atomicvar" "gimple" } } */
......
/* PR middle-end/45423 */ /* PR middle-end/45423 */
/* { dg-do compile } */ /* { 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 /* atomicvar should never be referenced in between the barrier and
following #pragma omp atomic_load. */ following #pragma omp atomic_load. */
/* { dg-final { scan-tree-dump-not "barrier\[^#\]*atomicvar" "gimple" } } */ /* { dg-final { scan-tree-dump-not "barrier\[^#\]*atomicvar" "gimple" } } */
......
/* PR middle-end/45423 */ /* PR middle-end/45423 */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-fopenmp" } */ /* { dg-options "-fopenmp -Wno-deprecated" } */
#ifdef __cplusplus #ifdef __cplusplus
bool *baz (); bool *baz ();
......
...@@ -132,6 +132,7 @@ f6 (bool b) ...@@ -132,6 +132,7 @@ f6 (bool b)
break; break;
} }
switch (b++) /* { dg-warning "switch condition has" } */ switch (b++) /* { dg-warning "switch condition has" } */
/* { dg-warning "is deprecated" "" { target c++ } 134 } */
{ {
case 3: case 3:
break; break;
......
...@@ -16,5 +16,4 @@ int main(){ ...@@ -16,5 +16,4 @@ int main(){
foo(3.14f); foo(3.14f);
foo(0); foo(0);
foo('a'); foo('a');
foo(false);
} }
// { 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;
}
...@@ -7,6 +7,6 @@ struct S { ...@@ -7,6 +7,6 @@ struct S {
S s; S s;
void f() { void f() {
s.x--; // { dg-error "Boolean expression" } s.x--; // { dg-error "use of an operand of type .bool." }
--s.x; // { dg-error "Boolean expression" } --s.x; // { dg-error "use of an operand of type .bool." }
} }
...@@ -14,6 +14,6 @@ template <> ...@@ -14,6 +14,6 @@ template <>
void f(bool) {} void f(bool) {}
int main() { int main() {
f(s.x++); f(s.x++); // { dg-warning "deprecated" }
f(++s.x); f(++s.x); // { dg-warning "deprecated" }
} }
...@@ -8,10 +8,10 @@ struct S { ...@@ -8,10 +8,10 @@ struct S {
S s; S s;
int main() { int main() {
s.x++; s.x++; // { dg-warning "deprecated" }
if (s.x != 1) if (s.x != 1)
return 1; return 1;
++s.x; ++s.x; // { dg-warning "deprecated" }
if (s.x != 1) if (s.x != 1)
return 2; return 2;
} }
...@@ -7,5 +7,5 @@ struct S { ...@@ -7,5 +7,5 @@ struct S {
S s; S s;
void f() { void f() {
++s.x = false; ++s.x = false; // { dg-warning "deprecated" }
} }
...@@ -10,8 +10,8 @@ int main() ...@@ -10,8 +10,8 @@ int main()
my_bool b = false; my_bool b = false;
int i; int i;
b++; b++; // { dg-warning "deprecated" }
b++; b++; // { dg-warning "deprecated" }
i = b; i = b;
if (i != 1) if (i != 1)
abort (); abort ();
......
...@@ -10,8 +10,8 @@ int main() ...@@ -10,8 +10,8 @@ int main()
my_bool b = false; my_bool b = false;
int i; int i;
b++; b++; // { dg-warning "deprecated" }
b++; b++; // { dg-warning "deprecated" }
i = b; i = b;
if (i != 1) if (i != 1)
abort (); abort ();
......
...@@ -4,6 +4,7 @@ f() ...@@ -4,6 +4,7 @@ f()
{ {
bool i = 0; bool i = 0;
i++ = 3; // { dg-error "" } i++ = 3; // { dg-error "" }
// { dg-warning "deprecated" "" { target *-*-* } 6 }
} }
...@@ -4,6 +4,7 @@ f() ...@@ -4,6 +4,7 @@ f()
{ {
bool i = 0; bool i = 0;
++i = 3; ++i = 3;
// { dg-warning "deprecated" "" { target *-*-* } 6 }
} }
...@@ -8,12 +8,12 @@ int ...@@ -8,12 +8,12 @@ int
foo (void) foo (void)
{ {
#pragma omp atomic #pragma omp atomic
(*baz ())--; // { dg-error "invalid use of Boolean" } (*baz ())--; // { dg-error "use of an operand of type .bool." }
#pragma omp atomic #pragma omp atomic
--(*baz ()); // { dg-error "invalid use of Boolean" } --(*baz ()); // { dg-error "use of an operand of type .bool." }
#pragma omp atomic #pragma omp atomic
atomicvar--; // { dg-error "invalid use of Boolean" } atomicvar--; // { dg-error "use of an operand of type .bool." }
#pragma omp atomic #pragma omp atomic
--atomicvar; // { dg-error "invalid use of Boolean" } --atomicvar; // { dg-error "use of an operand of type .bool." }
return 0; return 0;
} }
...@@ -7,5 +7,5 @@ struct A ...@@ -7,5 +7,5 @@ struct A
void f(A a) void f(A a)
{ {
a.b--; // { dg-error "Boolean expression" } a.b--; // { dg-error "use of an operand of type .bool." }
} }
...@@ -2,10 +2,10 @@ ...@@ -2,10 +2,10 @@
int main () int main ()
{ {
bool b = false; bool b = false;
int i = b++; int i = b++; // { dg-warning "deprecated" }
if (i != false || b != true) if (i != false || b != true)
return 1; return 1;
i = b++; i = b++; // { dg-warning "deprecated" }
if (i != true || b != true) if (i != true || b != true)
return 1; return 1;
} }
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> 2016-08-19 Jakub Jelinek <jakub@redhat.com>
PR fortran/71014 PR fortran/71014
......
// { dg-do run } // { dg-do run }
// { dg-options "-Wno-deprecated" }
extern "C" void abort (void); extern "C" void abort (void);
bool v, x1, x2, x3, x4, x5, x6; bool v, x1, x2, x3, x4, x5, x6;
......
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> 2016-09-14 Christophe Lyon <christophe.lyon@linaro.org>
* testsuite/23_containers/vector/bool/modifiers/insert/31370.cc: * testsuite/23_containers/vector/bool/modifiers/insert/31370.cc:
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
// <http://www.gnu.org/licenses/>. // <http://www.gnu.org/licenses/>.
// //
// { dg-do run { xfail *-*-* } } // { dg-do run { xfail *-*-* } }
// { dg-options "-Wno-deprecated" }
#include <vector> #include <vector>
#include <debug/vector> #include <debug/vector>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment