aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp
diff options
context:
space:
mode:
authorMarek Polacek <polacek@redhat.com>2016-09-14 17:46:59 +0000
committerMarek Polacek <mpolacek@gcc.gnu.org>2016-09-14 17:46:59 +0000
commit20a1e5b8c856e019b86b7e4990bad9dcb04d0e35 (patch)
tree55c5f2b1653d82fbe2d3ac4ac243322ba2fdd242 /gcc/cp
parentf335184d24fa4ae7f1242e3a9bb675fab8e0b732 (diff)
downloadgcc-20a1e5b8c856e019b86b7e4990bad9dcb04d0e35.zip
gcc-20a1e5b8c856e019b86b7e4990bad9dcb04d0e35.tar.gz
gcc-20a1e5b8c856e019b86b7e4990bad9dcb04d0e35.tar.bz2
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
Diffstat (limited to 'gcc/cp')
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/typeck.c22
2 files changed, 24 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index df4655e..001479c 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,10 @@
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
bool.
* decl2.c (one_static_initialization_or_destruction): Use true instead
diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c
index c51d6d0..c53a85a 100644
--- a/gcc/cp/typeck.c
+++ b/gcc/cp/typeck.c
@@ -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)