aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMarek Polacek <polacek@redhat.com>2016-01-12 16:48:29 +0000
committerMarek Polacek <mpolacek@gcc.gnu.org>2016-01-12 16:48:29 +0000
commit5342156c7a5cede074f9334ca27a373e9802bd59 (patch)
treed7b784d4a25f614dc8ecdaf5ffbcabf4a2e8da38 /gcc
parent324402a0c6eb8a24208fe443735fced7662b0ee8 (diff)
downloadgcc-5342156c7a5cede074f9334ca27a373e9802bd59.zip
gcc-5342156c7a5cede074f9334ca27a373e9802bd59.tar.gz
gcc-5342156c7a5cede074f9334ca27a373e9802bd59.tar.bz2
re PR c++/68979 (error: left operand of shift expression ‘(-1 << 4)’ is negative)
PR c++/68979 * constexpr.c (cxx_eval_check_shift_p): Use permerror rather than error_at and adjust the return value. * g++.dg/warn/permissive-1.C: New test. From-SVN: r232280
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/constexpr.c27
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/warn/permissive-1.C8
4 files changed, 33 insertions, 13 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 363f6cd..7230c71 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2016-01-12 Marek Polacek <polacek@redhat.com>
+
+ PR c++/68979
+ * constexpr.c (cxx_eval_check_shift_p): Use permerror rather than
+ error_at and adjust the return value.
+
2016-01-12 Jakub Jelinek <jakub@redhat.com>
PR objc++/68511
diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c
index e60180e..36a1e42 100644
--- a/gcc/cp/constexpr.c
+++ b/gcc/cp/constexpr.c
@@ -1512,17 +1512,17 @@ cxx_eval_check_shift_p (location_t loc, const constexpr_ctx *ctx,
if (tree_int_cst_sgn (rhs) == -1)
{
if (!ctx->quiet)
- error_at (loc, "right operand of shift expression %q+E is negative",
- build2_loc (loc, code, type, lhs, rhs));
- return true;
+ permerror (loc, "right operand of shift expression %q+E is negative",
+ build2_loc (loc, code, type, lhs, rhs));
+ return (!flag_permissive || ctx->quiet);
}
if (compare_tree_int (rhs, uprec) >= 0)
{
if (!ctx->quiet)
- error_at (loc, "right operand of shift expression %q+E is >= than "
- "the precision of the left operand",
- build2_loc (loc, code, type, lhs, rhs));
- return true;
+ permerror (loc, "right operand of shift expression %q+E is >= than "
+ "the precision of the left operand",
+ build2_loc (loc, code, type, lhs, rhs));
+ return (!flag_permissive || ctx->quiet);
}
/* The value of E1 << E2 is E1 left-shifted E2 bit positions; [...]
@@ -1536,9 +1536,10 @@ cxx_eval_check_shift_p (location_t loc, const constexpr_ctx *ctx,
if (tree_int_cst_sgn (lhs) == -1)
{
if (!ctx->quiet)
- error_at (loc, "left operand of shift expression %q+E is negative",
- build2_loc (loc, code, type, lhs, rhs));
- return true;
+ permerror (loc,
+ "left operand of shift expression %q+E is negative",
+ build2_loc (loc, code, type, lhs, rhs));
+ return (!flag_permissive || ctx->quiet);
}
/* For signed x << y the following:
(unsigned) x >> ((prec (lhs) - 1) - y)
@@ -1555,9 +1556,9 @@ cxx_eval_check_shift_p (location_t loc, const constexpr_ctx *ctx,
if (tree_int_cst_lt (integer_one_node, t))
{
if (!ctx->quiet)
- error_at (loc, "shift expression %q+E overflows",
- build2_loc (loc, code, type, lhs, rhs));
- return true;
+ permerror (loc, "shift expression %q+E overflows",
+ build2_loc (loc, code, type, lhs, rhs));
+ return (!flag_permissive || ctx->quiet);
}
}
return false;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 5eba1a1..ec887e9 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2016-01-12 Marek Polacek <polacek@redhat.com>
+
+ PR c++/68979
+ * g++.dg/warn/permissive-1.C: New test.
+
2016-01-12 Jakub Jelinek <jakub@redhat.com>
PR objc++/68511
diff --git a/gcc/testsuite/g++.dg/warn/permissive-1.C b/gcc/testsuite/g++.dg/warn/permissive-1.C
new file mode 100644
index 0000000..bfaca76
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/permissive-1.C
@@ -0,0 +1,8 @@
+// PR c++/68979
+// { dg-do compile { target int32 } }
+// { dg-options "-fpermissive -Wno-shift-overflow -Wno-shift-count-overflow -Wno-shift-count-negative" }
+
+enum A { AA = -1 << 4 }; // { dg-warning "operand of shift expression" "" { target c++11 } }
+enum B { BB = 1 << -4 }; // { dg-warning "operand of shift expression" }
+enum C { CC = 1 << __SIZEOF_INT__ * 4 * __CHAR_BIT__ - 4 }; // { dg-warning "operand of shift expression" }
+enum D { DD = 10 << __SIZEOF_INT__ * __CHAR_BIT__ - 2 }; // { dg-warning "shift expression" "" { target c++11 } }