diff options
Diffstat (limited to 'gcc/cp/init.c')
-rw-r--r-- | gcc/cp/init.c | 15 |
1 files changed, 7 insertions, 8 deletions
diff --git a/gcc/cp/init.c b/gcc/cp/init.c index b558742..5bfd084 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -2857,10 +2857,9 @@ build_new_1 (vec<tree, va_gc> **placement, tree type, tree nelts, outer_nelts_from_type = true; } - /* Lots of logic below. depends on whether we have a constant number of + /* Lots of logic below depends on whether we have a constant number of elements, so go ahead and fold it now. */ - if (outer_nelts) - outer_nelts = maybe_constant_value (outer_nelts); + const_tree cst_outer_nelts = fold_non_dependent_expr (outer_nelts); /* If our base type is an array, then make sure we know how many elements it has. */ @@ -2912,7 +2911,7 @@ build_new_1 (vec<tree, va_gc> **placement, tree type, tree nelts, /* Warn if we performed the (T[N]) to T[N] transformation and N is variable. */ if (outer_nelts_from_type - && !TREE_CONSTANT (outer_nelts)) + && !TREE_CONSTANT (cst_outer_nelts)) { if (complain & tf_warning_or_error) { @@ -3011,9 +3010,9 @@ build_new_1 (vec<tree, va_gc> **placement, tree type, tree nelts, size = size_binop (MULT_EXPR, size, fold_convert (sizetype, nelts)); - if (INTEGER_CST == TREE_CODE (outer_nelts)) + if (TREE_CODE (cst_outer_nelts) == INTEGER_CST) { - if (tree_int_cst_lt (max_outer_nelts_tree, outer_nelts)) + if (tree_int_cst_lt (max_outer_nelts_tree, cst_outer_nelts)) { /* When the array size is constant, check it at compile time to make sure it doesn't exceed the implementation-defined @@ -3639,13 +3638,13 @@ build_new (vec<tree, va_gc> **placement, tree type, tree nelts, /* Try to determine the constant value only for the purposes of the diagnostic below but continue to use the original value and handle const folding later. */ - const_tree cst_nelts = maybe_constant_value (nelts); + const_tree cst_nelts = fold_non_dependent_expr (nelts); /* The expression in a noptr-new-declarator is erroneous if it's of non-class type and its value before converting to std::size_t is less than zero. ... If the expression is a constant expression, the program is ill-fomed. */ - if (INTEGER_CST == TREE_CODE (cst_nelts) + if (TREE_CODE (cst_nelts) == INTEGER_CST && tree_int_cst_sgn (cst_nelts) == -1) { if (complain & tf_error) |