aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2013-03-14 13:09:11 +0000
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2013-03-14 13:09:11 +0000
commit23413aedf6423fb5debde561b80294c9421c0e88 (patch)
tree828c971c2fe3ac0c58fcfd164556aea9d031de94
parent94afd4216cba1eb05a30cb35df5c01e465e28a06 (diff)
PR c++/56614
* decl.c (local_variable_p_walkfn): Check DECL_ARTIFICIAL again. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@196658 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/cp/ChangeLog3
-rw-r--r--gcc/cp/decl.c5
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/initlist-defarg1.C36
3 files changed, 41 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index ccdb401d928..77f3f824c0a 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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.
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 92114fff6c7..0e668408119 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -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
index 00000000000..45eb2d5e1f0
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/initlist-defarg1.C
@@ -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);
+ }
+};