From f05f61fd73568da443c330faaadfeecba45158d7 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Fri, 17 Jun 2011 16:07:20 -0400 Subject: [PATCH] pt.c (tsubst_decl): Handle DECL_VALUE_EXPR on reference. * pt.c (tsubst_decl): Handle DECL_VALUE_EXPR on reference. * decl.c (check_initializer): Handle DECL_VALUE_EXPR_P. From-SVN: r175153 --- gcc/cp/ChangeLog | 3 +++ gcc/cp/decl.c | 8 ++++++++ gcc/cp/pt.c | 5 +++++ 3 files changed, 16 insertions(+) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 010f1ddaa4f..81b332de847 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2011-06-17 Jason Merrill + * pt.c (tsubst_decl): Handle DECL_VALUE_EXPR on reference. + * decl.c (check_initializer): Handle DECL_VALUE_EXPR_P. + * semantics.c (finish_non_static_data_member): Preserve dereference in template. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 0584cd8f6f7..9f62ea34e12 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -5387,6 +5387,14 @@ check_initializer (tree decl, tree init, int flags, tree *cleanup) type. */ TREE_TYPE (decl) = type = complete_type (TREE_TYPE (decl)); + if (DECL_HAS_VALUE_EXPR_P (decl)) + { + /* A variable with DECL_HAS_VALUE_EXPR_P set is just a placeholder, + it doesn't have storage to be initialized. */ + gcc_assert (init == NULL_TREE); + return NULL_TREE; + } + if (type == error_mark_node) /* We will have already complained. */ return NULL_TREE; diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 1008b3be399..308aff7bc48 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -10061,6 +10061,11 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain) tree ve = DECL_VALUE_EXPR (t); ve = tsubst_expr (ve, args, complain, in_decl, /*constant_expression_p=*/false); + if (REFERENCE_REF_P (ve)) + { + gcc_assert (TREE_CODE (type) == REFERENCE_TYPE); + ve = TREE_OPERAND (ve, 0); + } SET_DECL_VALUE_EXPR (r, ve); } } -- 2.30.2