Commit 5342156c by Marek Polacek Committed by Marek Polacek

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
parent 324402a0
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> 2016-01-12 Jakub Jelinek <jakub@redhat.com>
PR objc++/68511 PR objc++/68511
......
...@@ -1512,17 +1512,17 @@ cxx_eval_check_shift_p (location_t loc, const constexpr_ctx *ctx, ...@@ -1512,17 +1512,17 @@ cxx_eval_check_shift_p (location_t loc, const constexpr_ctx *ctx,
if (tree_int_cst_sgn (rhs) == -1) if (tree_int_cst_sgn (rhs) == -1)
{ {
if (!ctx->quiet) if (!ctx->quiet)
error_at (loc, "right operand of shift expression %q+E is negative", permerror (loc, "right operand of shift expression %q+E is negative",
build2_loc (loc, code, type, lhs, rhs)); build2_loc (loc, code, type, lhs, rhs));
return true; return (!flag_permissive || ctx->quiet);
} }
if (compare_tree_int (rhs, uprec) >= 0) if (compare_tree_int (rhs, uprec) >= 0)
{ {
if (!ctx->quiet) if (!ctx->quiet)
error_at (loc, "right operand of shift expression %q+E is >= than " permerror (loc, "right operand of shift expression %q+E is >= than "
"the precision of the left operand", "the precision of the left operand",
build2_loc (loc, code, type, lhs, rhs)); build2_loc (loc, code, type, lhs, rhs));
return true; return (!flag_permissive || ctx->quiet);
} }
/* The value of E1 << E2 is E1 left-shifted E2 bit positions; [...] /* 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, ...@@ -1536,9 +1536,10 @@ cxx_eval_check_shift_p (location_t loc, const constexpr_ctx *ctx,
if (tree_int_cst_sgn (lhs) == -1) if (tree_int_cst_sgn (lhs) == -1)
{ {
if (!ctx->quiet) if (!ctx->quiet)
error_at (loc, "left operand of shift expression %q+E is negative", permerror (loc,
build2_loc (loc, code, type, lhs, rhs)); "left operand of shift expression %q+E is negative",
return true; build2_loc (loc, code, type, lhs, rhs));
return (!flag_permissive || ctx->quiet);
} }
/* For signed x << y the following: /* For signed x << y the following:
(unsigned) x >> ((prec (lhs) - 1) - y) (unsigned) x >> ((prec (lhs) - 1) - y)
...@@ -1555,9 +1556,9 @@ cxx_eval_check_shift_p (location_t loc, const constexpr_ctx *ctx, ...@@ -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 (tree_int_cst_lt (integer_one_node, t))
{ {
if (!ctx->quiet) if (!ctx->quiet)
error_at (loc, "shift expression %q+E overflows", permerror (loc, "shift expression %q+E overflows",
build2_loc (loc, code, type, lhs, rhs)); build2_loc (loc, code, type, lhs, rhs));
return true; return (!flag_permissive || ctx->quiet);
} }
} }
return false; return false;
......
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> 2016-01-12 Jakub Jelinek <jakub@redhat.com>
PR objc++/68511 PR objc++/68511
......
// 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 } }
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