diff options
author | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-03-14 13:09:11 +0000 |
---|---|---|
committer | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-03-14 13:09:11 +0000 |
commit | 23413aedf6423fb5debde561b80294c9421c0e88 (patch) | |
tree | 828c971c2fe3ac0c58fcfd164556aea9d031de94 | |
parent | 94afd4216cba1eb05a30cb35df5c01e465e28a06 (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/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/cp/decl.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/initlist-defarg1.C | 36 |
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); + } +}; |