Commit 2e5748d2 by Jason Merrill Committed by Jason Merrill

decl.c (cp_finish_decl): Use resolve_nondeduced_context for auto.

	* decl.c (cp_finish_decl): Use resolve_nondeduced_context for auto.
	* init.c (build_new): Likewise.
	* pt.c (tsubst_decl): Likewise.
	(do_auto_deduction): Likewise.
	(resolve_nondeduced_context): Use build_offset_ref and
	cp_build_addr_expr.

From-SVN: r166724
parent d8621648
2010-11-13 Jason Merrill <jason@redhat.com>
* decl.c (cp_finish_decl): Use resolve_nondeduced_context for auto.
* init.c (build_new): Likewise.
* pt.c (tsubst_decl): Likewise.
(do_auto_deduction): Likewise.
(resolve_nondeduced_context): Use build_offset_ref and
cp_build_addr_expr.
2010-11-12 Joseph Myers <joseph@codesourcery.com> 2010-11-12 Joseph Myers <joseph@codesourcery.com>
* Make-lang.in (g++spec.o): Use $(OPTS_H). * Make-lang.in (g++spec.o): Use $(OPTS_H).
......
...@@ -5761,6 +5761,7 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p, ...@@ -5761,6 +5761,7 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p,
if (TREE_CODE (d_init) == TREE_LIST) if (TREE_CODE (d_init) == TREE_LIST)
d_init = build_x_compound_expr_from_list (d_init, ELK_INIT, d_init = build_x_compound_expr_from_list (d_init, ELK_INIT,
tf_warning_or_error); tf_warning_or_error);
d_init = resolve_nondeduced_context (d_init);
if (describable_type (d_init)) if (describable_type (d_init))
{ {
type = TREE_TYPE (decl) = do_auto_deduction (type, d_init, type = TREE_TYPE (decl) = do_auto_deduction (type, d_init,
......
...@@ -2516,8 +2516,13 @@ build_new (VEC(tree,gc) **placement, tree type, tree nelts, ...@@ -2516,8 +2516,13 @@ build_new (VEC(tree,gc) **placement, tree type, tree nelts,
if (nelts == NULL_TREE && VEC_length (tree, *init) == 1) if (nelts == NULL_TREE && VEC_length (tree, *init) == 1)
{ {
tree auto_node = type_uses_auto (type); tree auto_node = type_uses_auto (type);
if (auto_node && describable_type (VEC_index (tree, *init, 0))) if (auto_node)
type = do_auto_deduction (type, VEC_index (tree, *init, 0), auto_node); {
tree d_init = VEC_index (tree, *init, 0);
d_init = resolve_nondeduced_context (d_init);
if (describable_type (d_init))
type = do_auto_deduction (type, d_init, auto_node);
}
} }
if (processing_template_decl) if (processing_template_decl)
......
...@@ -10035,10 +10035,14 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain) ...@@ -10035,10 +10035,14 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
= tsubst_expr (DECL_INITIAL (t), args, complain, in_decl, = tsubst_expr (DECL_INITIAL (t), args, complain, in_decl,
/*constant_expression_p=*/false); /*constant_expression_p=*/false);
if (auto_node && init && describable_type (init)) if (auto_node && init)
{ {
type = do_auto_deduction (type, init, auto_node); init = resolve_nondeduced_context (init);
TREE_TYPE (r) = type; if (describable_type (init))
{
type = do_auto_deduction (type, init, auto_node);
TREE_TYPE (r) = type;
}
} }
} }
else else
...@@ -14338,10 +14342,13 @@ resolve_nondeduced_context (tree orig_expr) ...@@ -14338,10 +14342,13 @@ resolve_nondeduced_context (tree orig_expr)
BASELINK_ACCESS_BINFO (baselink), BASELINK_ACCESS_BINFO (baselink),
expr, BASELINK_OPTYPE (baselink)); expr, BASELINK_OPTYPE (baselink));
if (offset) if (offset)
expr = build2 (OFFSET_REF, TREE_TYPE (expr), {
TREE_OPERAND (offset, 0), expr); tree base
= TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (offset, 0)));
expr = build_offset_ref (base, expr, addr);
}
if (addr) if (addr)
expr = build_address (expr); expr = cp_build_addr_expr (expr, tf_warning_or_error);
return expr; return expr;
} }
else if (good == 0 && badargs) else if (good == 0 && badargs)
...@@ -18890,6 +18897,8 @@ do_auto_deduction (tree type, tree init, tree auto_node) ...@@ -18890,6 +18897,8 @@ do_auto_deduction (tree type, tree init, tree auto_node)
if (BRACE_ENCLOSED_INITIALIZER_P (init)) if (BRACE_ENCLOSED_INITIALIZER_P (init))
type = listify_autos (type, auto_node); type = listify_autos (type, auto_node);
init = resolve_nondeduced_context (init);
parms = build_tree_list (NULL_TREE, type); parms = build_tree_list (NULL_TREE, type);
args[0] = init; args[0] = init;
tparms = make_tree_vec (1); tparms = make_tree_vec (1);
......
2010-11-13 Jason Merrill <jason@redhat.com>
* g++.dg/cpp0x/auto20.C: New.
2010-11-13 Iain Sandoe <iains@gcc.gnu.org> 2010-11-13 Iain Sandoe <iains@gcc.gnu.org>
* objc.dg/fsf-nsstring-format-1.m: Adjust format messages. * objc.dg/fsf-nsstring-format-1.m: Adjust format messages.
......
// Test for proper non-deduced context handling of the initializer
// for an auto declaration/new.
// { dg-options -std=c++0x }
struct with_apply
{
template <unsigned>
void apply(const double&){}
};
auto p = &with_apply::apply<0>;
auto pp = new auto(&with_apply::apply<0>);
template <class T>
void f()
{
auto p = &T::template apply<0>;
}
template void f<with_apply>();
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment