From da834cfcb0c8e59936cf3697b81b2693e5eb2ed0 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Wed, 22 May 2013 23:47:35 -0400 Subject: re PR c++/56930 (pointless -Wconversion warning with sizeof) PR c++/56930 * call.c (convert_like_real): Use cp_convert_and_check. * cvt.c (cp_convert_and_check): Use maybe_constant_value. * semantics.c (cxx_eval_constant_expression): Handle LTGT_EXPR. (potential_constant_expression_1): Handle OMP_ATOMIC*. From-SVN: r199232 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/call.c | 6 +++--- gcc/cp/cvt.c | 18 ++++++++++++++---- gcc/cp/semantics.c | 5 +++++ 4 files changed, 28 insertions(+), 7 deletions(-) (limited to 'gcc/cp') diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index cd58d70..7025f34 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,11 @@ 2013-05-22 Jason Merrill + PR c++/56930 + * call.c (convert_like_real): Use cp_convert_and_check. + * cvt.c (cp_convert_and_check): Use maybe_constant_value. + * semantics.c (cxx_eval_constant_expression): Handle LTGT_EXPR. + (potential_constant_expression_1): Handle OMP_ATOMIC*. + PR c++/56915 * semantics.c (maybe_add_lambda_conv_op): Give up if the call op isn't defined. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 71a1589d..0b6a83f 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -6199,10 +6199,10 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum, if (convs->check_narrowing) check_narrowing (totype, expr); - if (issue_conversion_warnings && (complain & tf_warning)) - expr = convert_and_check (totype, expr); + if (issue_conversion_warnings) + expr = cp_convert_and_check (totype, expr, complain); else - expr = convert (totype, expr); + expr = cp_convert (totype, expr, complain); return expr; } diff --git a/gcc/cp/cvt.c b/gcc/cp/cvt.c index 93be76a..d9e905e 100644 --- a/gcc/cp/cvt.c +++ b/gcc/cp/cvt.c @@ -624,10 +624,20 @@ cp_convert_and_check (tree type, tree expr, tsubst_flags_t complain) result = cp_convert (type, expr, complain); if ((complain & tf_warning) - && c_inhibit_evaluation_warnings == 0 - && !TREE_OVERFLOW_P (expr) - && result != error_mark_node) - warnings_for_convert_and_check (type, expr, result); + && c_inhibit_evaluation_warnings == 0) + { + tree folded = maybe_constant_value (expr); + tree stripped = folded; + tree folded_result = cp_convert (type, folded, complain); + + /* maybe_constant_value wraps an INTEGER_CST with TREE_OVERFLOW in a + NOP_EXPR so that it isn't TREE_CONSTANT anymore. */ + STRIP_NOPS (stripped); + + if (!TREE_OVERFLOW_P (stripped) + && folded_result != error_mark_node) + warnings_for_convert_and_check (type, folded, folded_result); + } return result; } diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 5b36337..c115d23 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -8045,6 +8045,7 @@ cxx_eval_constant_expression (const constexpr_call *call, tree t, case UNGT_EXPR: case UNGE_EXPR: case UNEQ_EXPR: + case LTGT_EXPR: case RANGE_EXPR: case COMPLEX_EXPR: r = cxx_eval_binary_expression (call, t, allow_non_constant, addr, @@ -8620,6 +8621,10 @@ potential_constant_expression_1 (tree t, bool want_rval, tsubst_flags_t flags) case THROW_EXPR: case MODIFY_EXPR: case MODOP_EXPR: + case OMP_ATOMIC: + case OMP_ATOMIC_READ: + case OMP_ATOMIC_CAPTURE_OLD: + case OMP_ATOMIC_CAPTURE_NEW: /* GCC internal stuff. */ case VA_ARG_EXPR: case OBJ_TYPE_REF: -- cgit v1.1