aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/pt.c
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2013-04-11 11:51:40 -0400
committerJason Merrill <jason@gcc.gnu.org>2013-04-11 11:51:40 -0400
commitffe0f557a7913be8b229e8fe9fd3dea7af0f158d (patch)
tree05813c0fdc3e2b450d3ac9076fde811cb7cbed7a /gcc/cp/pt.c
parent0a3763018e63de8cee68d98f877221275adb42bc (diff)
downloadgcc-ffe0f557a7913be8b229e8fe9fd3dea7af0f158d.zip
gcc-ffe0f557a7913be8b229e8fe9fd3dea7af0f158d.tar.gz
gcc-ffe0f557a7913be8b229e8fe9fd3dea7af0f158d.tar.bz2
pt.c (tsubst_copy): Don't call tsubst for local variables, look them up instead.
* 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. From-SVN: r197811
Diffstat (limited to 'gcc/cp/pt.c')
-rw-r--r--gcc/cp/pt.c65
1 files changed, 31 insertions, 34 deletions
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 5bb0cc0..dc1385e 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);