From 30fdd4f2bf86abb827cd82c25723cd08acb9fb26 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Tue, 23 Aug 2011 12:03:35 -0400 Subject: [PATCH] tree.c (build_target_expr): Set TREE_CONSTANT on literal TARGET_EXPR if the value is constant. * tree.c (build_target_expr): Set TREE_CONSTANT on literal TARGET_EXPR if the value is constant. * typeck2.c (build_functional_cast): Don't set it here. From-SVN: r177997 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/tree.c | 5 ++++- gcc/cp/typeck2.c | 3 --- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index bbada45813c..23a63ce5a1b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2011-08-23 Jason Merrill + + * tree.c (build_target_expr): Set TREE_CONSTANT on + literal TARGET_EXPR if the value is constant. + * typeck2.c (build_functional_cast): Don't set it here. + 2011-08-23 Jason Merrill Core 903 (partial) diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index 4ef89c45f65..00598ce6069 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -288,6 +288,7 @@ static tree build_target_expr (tree decl, tree value, tsubst_flags_t complain) { tree t; + tree type = TREE_TYPE (decl); #ifdef ENABLE_CHECKING gcc_assert (VOID_TYPE_P (TREE_TYPE (value)) @@ -302,12 +303,14 @@ build_target_expr (tree decl, tree value, tsubst_flags_t complain) t = cxx_maybe_build_cleanup (decl, complain); if (t == error_mark_node) return error_mark_node; - t = build4 (TARGET_EXPR, TREE_TYPE (decl), decl, value, t, NULL_TREE); + t = build4 (TARGET_EXPR, type, decl, value, t, NULL_TREE); /* We always set TREE_SIDE_EFFECTS so that expand_expr does not ignore the TARGET_EXPR. If there really turn out to be no side-effects, then the optimizer should be able to get rid of whatever code is generated anyhow. */ TREE_SIDE_EFFECTS (t) = 1; + if (literal_type_p (type)) + TREE_CONSTANT (t) = TREE_CONSTANT (value); return t; } diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c index 79aa354ad02..97f98ab3507 100644 --- a/gcc/cp/typeck2.c +++ b/gcc/cp/typeck2.c @@ -1684,9 +1684,6 @@ build_functional_cast (tree exp, tree parms, tsubst_flags_t complain) { exp = build_value_init (type, complain); exp = get_target_expr_sfinae (exp, complain); - /* FIXME this is wrong */ - if (literal_type_p (type)) - TREE_CONSTANT (exp) = true; return exp; }