re PR c++/56614 (error: default argument 'std::vector<E>(std::initializer_list<E...
authorJason Merrill <jason@redhat.com>
Thu, 14 Mar 2013 13:09:11 +0000 (09:09 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 14 Mar 2013 13:09:11 +0000 (09:09 -0400)
PR c++/56614
* decl.c (local_variable_p_walkfn): Check DECL_ARTIFICIAL again.

From-SVN: r196658

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/g++.dg/cpp0x/initlist-defarg1.C [new file with mode: 0644]

index ccdb401..77f3f82 100644 (file)
@@ -1,5 +1,8 @@
 2013-03-14  Jason Merrill  <jason@redhat.com>
 
+       PR c++/56614
+       * decl.c (local_variable_p_walkfn): Check DECL_ARTIFICIAL again.
+
        PR c++/56346
        * decl.c (register_dtor_fn): Pass null to __cxa_thread_atexit
        dso_handle parm on targets without __cxa_atexit.
index 92114ff..0e66840 100644 (file)
@@ -10803,9 +10803,8 @@ static tree
 local_variable_p_walkfn (tree *tp, int *walk_subtrees,
                         void * /*data*/)
 {
-  /* Check DECL_NAME to avoid including temporaries.  We don't check
-     DECL_ARTIFICIAL because we do want to complain about 'this'.  */
-  if (local_variable_p (*tp) && DECL_NAME (*tp))
+  if (local_variable_p (*tp)
+      && (!DECL_ARTIFICIAL (*tp) || DECL_NAME (*tp) == this_identifier))
     return *tp;
   else if (TYPE_P (*tp))
     *walk_subtrees = 0;
diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist-defarg1.C b/gcc/testsuite/g++.dg/cpp0x/initlist-defarg1.C
new file mode 100644 (file)
index 0000000..45eb2d5
--- /dev/null
@@ -0,0 +1,36 @@
+// PR c++/56614
+// { dg-require-effective-target c++11 }
+
+#include <initializer_list>
+
+namespace std
+{
+    template<typename T>
+        struct allocator
+        { };
+
+    template<typename T, typename Alloc = std::allocator<T> >
+        struct vector
+        {
+            vector(std::initializer_list<T>, const Alloc& = Alloc()) { }
+        };
+}
+
+void func() { }
+
+enum E { ee };
+
+struct C
+{
+    template<typename T>
+        C(T, std::vector<E> = std::vector<E>({ ee }))
+        { }
+};
+
+struct G
+{
+    void gen()
+    {
+        C c(&func);
+    }
+};