From 47a90907fae27b697d3ad2b44b428843d3d0a984 Mon Sep 17 00:00:00 2001 From: jason Date: Thu, 11 Apr 2013 15:51:40 +0000 Subject: [PATCH] * pt.c (tsubst_copy) [VAR_DECL]: Don't call tsubst for local variables, look them up instead. (tsubst_decl) [VAR_DECL]: Remove handling for anonymous union proxies and substitution in unevaluated context. (tsubst_expr) [OMP_FOR]: Instantiate OMP_FOR_PRE_BODY before the iterators. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@197811 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 7 ++++++ gcc/cp/pt.c | 65 +++++++++++++++++++++++++++----------------------------- 2 files changed, 38 insertions(+), 34 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index f1cf2ce40c6..dff5cf99c7e 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,12 @@ 2013-04-11 Jason Merrill + * pt.c (tsubst_copy) [VAR_DECL]: Don't call tsubst for + local variables, look them up instead. + (tsubst_decl) [VAR_DECL]: Remove handling for anonymous union + proxies and substitution in unevaluated context. + (tsubst_expr) [OMP_FOR]: Instantiate OMP_FOR_PRE_BODY + before the iterators. + PR c++/23055 * pt.c (uses_deducible_template_parms): New. (deducible_array_bound, deducible_expression): New. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 5bb0cc03b9f..dc1385e075d 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -10633,16 +10633,6 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain) break; } - if (VAR_P (t) && DECL_ANON_UNION_VAR_P (t)) - { - /* Just use name lookup to find a member alias for an anonymous - union, but then add it to the hash table. */ - r = lookup_name (DECL_NAME (t)); - gcc_assert (DECL_ANON_UNION_VAR_P (r)); - register_local_specialization (r, t); - break; - } - /* Create a new node for the specialization we need. */ r = copy_decl (t); if (type == NULL_TREE) @@ -10747,21 +10737,7 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain) SET_DECL_IMPLICIT_INSTANTIATION (r); } else if (cp_unevaluated_operand) - { - /* We're substituting this var in a decltype outside of its - scope, such as for a lambda return type. Don't add it to - local_specializations, do perform auto deduction. */ - tree auto_node = type_uses_auto (type); - if (auto_node) - { - tree init - = tsubst_expr (DECL_INITIAL (t), args, complain, in_decl, - /*constant_expression_p=*/false); - init = resolve_nondeduced_context (init); - TREE_TYPE (r) = type - = do_auto_deduction (type, init, auto_node); - } - } + gcc_unreachable (); else register_local_specialization (r, t); @@ -12175,11 +12151,32 @@ tsubst_copy (tree t, tree args, tsubst_flags_t complain, tree in_decl) case VAR_DECL: case FUNCTION_DECL: - if ((DECL_LANG_SPECIFIC (t) && DECL_TEMPLATE_INFO (t)) - || local_variable_p (t)) - t = tsubst (t, args, complain, in_decl); - mark_used (t); - return t; + if (DECL_LANG_SPECIFIC (t) && DECL_TEMPLATE_INFO (t)) + r = tsubst (t, args, complain, in_decl); + else if (local_variable_p (t)) + { + r = retrieve_local_specialization (t); + if (r == NULL_TREE) + { + if (DECL_ANON_UNION_VAR_P (t)) + { + /* Just use name lookup to find a member alias for an + anonymous union, but then add it to the hash table. */ + r = lookup_name (DECL_NAME (t)); + gcc_assert (DECL_ANON_UNION_VAR_P (r)); + register_local_specialization (r, t); + } + else + { + gcc_assert (errorcount || sorrycount); + return error_mark_node; + } + } + } + else + r = t; + mark_used (r); + return r; case NAMESPACE_DECL: return t; @@ -13218,15 +13215,15 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl, stmt = begin_omp_structured_block (); + pre_body = push_stmt_list (); + RECUR (OMP_FOR_PRE_BODY (t)); + pre_body = pop_stmt_list (pre_body); + for (i = 0; i < TREE_VEC_LENGTH (OMP_FOR_INIT (t)); i++) tsubst_omp_for_iterator (t, i, declv, initv, condv, incrv, &clauses, args, complain, in_decl, integral_constant_expression_p); - pre_body = push_stmt_list (); - RECUR (OMP_FOR_PRE_BODY (t)); - pre_body = pop_stmt_list (pre_body); - body = push_stmt_list (); RECUR (OMP_FOR_BODY (t)); body = pop_stmt_list (body); -- 2.11.0