aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2018-05-15 17:56:34 -0400
committerJason Merrill <jason@gcc.gnu.org>2018-05-15 17:56:34 -0400
commitdc5ca6c86f08b0dc571a8400d89572ce4bf911c7 (patch)
tree52a2c3724196b8ac2721d3c7398cfbc3e3606742
parent30a52a6d629ebe46c788940c1cbe518e4d5cbd5a (diff)
downloadgcc-dc5ca6c86f08b0dc571a8400d89572ce4bf911c7.zip
gcc-dc5ca6c86f08b0dc571a8400d89572ce4bf911c7.tar.gz
gcc-dc5ca6c86f08b0dc571a8400d89572ce4bf911c7.tar.bz2
* constexpr.c (cxx_eval_vec_init_1): Pass tf_none if ctx->quiet.
From-SVN: r260273
-rw-r--r--gcc/cp/ChangeLog2
-rw-r--r--gcc/cp/constexpr.c13
2 files changed, 8 insertions, 7 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index fe80f72..912a96c 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,7 @@
2018-05-15 Jason Merrill <jason@redhat.com>
+ * constexpr.c (cxx_eval_vec_init_1): Pass tf_none if ctx->quiet.
+
PR c++/64372 - CWG 1560, gratuitous lvalue-rvalue conversion in ?:
* call.c (build_conditional_expr_1): Don't force_rvalue when one arm
is a throw-expression.
diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c
index 9ee37de..8c6ec55 100644
--- a/gcc/cp/constexpr.c
+++ b/gcc/cp/constexpr.c
@@ -2936,6 +2936,7 @@ cxx_eval_vec_init_1 (const constexpr_ctx *ctx, tree atype, tree init,
vec<constructor_elt, va_gc> **p = &CONSTRUCTOR_ELTS (ctx->ctor);
bool pre_init = false;
unsigned HOST_WIDE_INT i;
+ tsubst_flags_t complain = ctx->quiet ? tf_none : tf_warning_or_error;
/* For the default constructor, build up a call to the default
constructor of the element type. We only need to handle class types
@@ -2946,7 +2947,7 @@ cxx_eval_vec_init_1 (const constexpr_ctx *ctx, tree atype, tree init,
/* We only do this at the lowest level. */;
else if (value_init)
{
- init = build_value_init (elttype, tf_warning_or_error);
+ init = build_value_init (elttype, complain);
pre_init = true;
}
else if (!init)
@@ -2954,7 +2955,7 @@ cxx_eval_vec_init_1 (const constexpr_ctx *ctx, tree atype, tree init,
vec<tree, va_gc> *argvec = make_tree_vector ();
init = build_special_member_call (NULL_TREE, complete_ctor_identifier,
&argvec, elttype, LOOKUP_NORMAL,
- tf_warning_or_error);
+ complain);
release_tree_vector (argvec);
init = build_aggr_init_expr (TREE_TYPE (init), init);
pre_init = true;
@@ -2981,8 +2982,7 @@ cxx_eval_vec_init_1 (const constexpr_ctx *ctx, tree atype, tree init,
reuse = i == 0;
}
else
- eltinit = cp_build_array_ref (input_location, init, idx,
- tf_warning_or_error);
+ eltinit = cp_build_array_ref (input_location, init, idx, complain);
eltinit = cxx_eval_vec_init_1 (&new_ctx, elttype, eltinit, value_init,
lval,
non_constant_p, overflow_p);
@@ -3000,11 +3000,10 @@ cxx_eval_vec_init_1 (const constexpr_ctx *ctx, tree atype, tree init,
/* Copying an element. */
gcc_assert (same_type_ignoring_top_level_qualifiers_p
(atype, TREE_TYPE (init)));
- eltinit = cp_build_array_ref (input_location, init, idx,
- tf_warning_or_error);
+ eltinit = cp_build_array_ref (input_location, init, idx, complain);
if (!lvalue_p (init))
eltinit = move (eltinit);
- eltinit = force_rvalue (eltinit, tf_warning_or_error);
+ eltinit = force_rvalue (eltinit, complain);
eltinit = cxx_eval_constant_expression (&new_ctx, eltinit, lval,
non_constant_p, overflow_p);
}