OSDN Git Service

* decl.c (cp_finish_decl): Use resolve_nondeduced_context for auto.
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 14 Nov 2010 00:06:48 +0000 (00:06 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 14 Nov 2010 00:06:48 +0000 (00:06 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@166724 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/cp/init.c
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/auto20.C [new file with mode: 0644]

index 192f35a..418951a 100644 (file)
@@ -1,3 +1,12 @@
+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>
 
        * Make-lang.in (g++spec.o): Use $(OPTS_H).
index 7891c1e..714516e 100644 (file)
@@ -5761,6 +5761,7 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p,
       if (TREE_CODE (d_init) == TREE_LIST)
        d_init = build_x_compound_expr_from_list (d_init, ELK_INIT,
                                                  tf_warning_or_error);
+      d_init = resolve_nondeduced_context (d_init);
       if (describable_type (d_init))
        {
          type = TREE_TYPE (decl) = do_auto_deduction (type, d_init,
index 00b5d9b..670c7a5 100644 (file)
@@ -2516,8 +2516,13 @@ build_new (VEC(tree,gc) **placement, tree type, tree nelts,
   if (nelts == NULL_TREE && VEC_length (tree, *init) == 1)
     {
       tree auto_node = type_uses_auto (type);
-      if (auto_node && describable_type (VEC_index (tree, *init, 0)))
-       type = do_auto_deduction (type, VEC_index (tree, *init, 0), auto_node);
+      if (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)
index 56b7543..3e8b62c 100644 (file)
@@ -10035,10 +10035,14 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
              = tsubst_expr (DECL_INITIAL (t), args, complain, in_decl,
                             /*constant_expression_p=*/false);
 
-           if (auto_node && init && describable_type (init))
+           if (auto_node && init)
              {
-               type = do_auto_deduction (type, init, auto_node);
-               TREE_TYPE (r) = type;
+               init = resolve_nondeduced_context (init);
+               if (describable_type (init))
+                 {
+                   type = do_auto_deduction (type, init, auto_node);
+                   TREE_TYPE (r) = type;
+                 }
              }
          }
        else
@@ -14338,10 +14342,13 @@ resolve_nondeduced_context (tree orig_expr)
                                   BASELINK_ACCESS_BINFO (baselink),
                                   expr, BASELINK_OPTYPE (baselink));
          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)
-           expr = build_address (expr);
+           expr = cp_build_addr_expr (expr, tf_warning_or_error);
          return expr;
        }
       else if (good == 0 && badargs)
@@ -18890,6 +18897,8 @@ do_auto_deduction (tree type, tree init, tree auto_node)
   if (BRACE_ENCLOSED_INITIALIZER_P (init))
     type = listify_autos (type, auto_node);
 
+  init = resolve_nondeduced_context (init);
+
   parms = build_tree_list (NULL_TREE, type);
   args[0] = init;
   tparms = make_tree_vec (1);
index 70dcd0d..f5456a1 100644 (file)
@@ -1,3 +1,7 @@
+2010-11-13  Jason Merrill  <jason@redhat.com>
+
+       * g++.dg/cpp0x/auto20.C: New.
+
 2010-11-13  Iain Sandoe  <iains@gcc.gnu.org>
 
        * objc.dg/fsf-nsstring-format-1.m: Adjust format messages.
diff --git a/gcc/testsuite/g++.dg/cpp0x/auto20.C b/gcc/testsuite/g++.dg/cpp0x/auto20.C
new file mode 100644 (file)
index 0000000..90f8751
--- /dev/null
@@ -0,0 +1,20 @@
+// 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>();