OSDN Git Service

PR c++/53484
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 1 Jun 2012 18:43:23 +0000 (18:43 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 1 Jun 2012 18:43:23 +0000 (18:43 +0000)
* pt.c (do_auto_deduction): Don't try to deduce from a
type-dependent initializer.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@188122 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 10ada12..aa724e9 100644 (file)
@@ -1,3 +1,9 @@
+2012-06-01  Jason Merrill  <jason@redhat.com>
+
+       PR c++/53484
+       * pt.c (do_auto_deduction): Don't try to deduce from a
+       type-dependent initializer.
+
 2012-05-31  Jason Merrill  <jason@redhat.com>
 
        PR c++/53500
index e3d8948..e4631e7 100644 (file)
@@ -20354,10 +20354,9 @@ do_auto_deduction (tree type, tree init, tree auto_node)
   tree decl;
   int val;
 
-  if (processing_template_decl
-      && (TREE_TYPE (init) == NULL_TREE
-         || BRACE_ENCLOSED_INITIALIZER_P (init)))
-    /* Not enough information to try this yet.  */
+  if (type_dependent_expression_p (init))
+    /* Defining a subset of type-dependent expressions that we can deduce
+       from ahead of time isn't worth the trouble.  */
     return type;
 
   /* The name of the object being declared shall not appear in the
index 9c7eabf..7aba69e 100644 (file)
@@ -1,3 +1,8 @@
+2012-06-01  Jason Merrill  <jason@redhat.com>
+
+       PR c++/53484
+       * g++.dg/cpp0x/auto33.C: New.
+
 2012-06-01  Eric Botcazou  <ebotcazou@adacore.com>
 
        * c-c++-common/restrict-2.c: Revert previous change.
diff --git a/gcc/testsuite/g++.dg/cpp0x/auto33.C b/gcc/testsuite/g++.dg/cpp0x/auto33.C
new file mode 100644 (file)
index 0000000..dade5a8
--- /dev/null
@@ -0,0 +1,15 @@
+// PR c++/53484
+// { dg-do compile { target c++11 } }
+
+template<class T,class U> struct ST;
+template<class T> struct ST<T,T> {};
+
+template <class T>
+void f(T x){
+   [&]{
+     auto y = x;
+     ST<decltype(y),int>();
+   }();
+}
+
+int main(){ f(0); }