re PR c++/56614 (error: default argument 'std::vector<E>(std::initializer_list<E>{((const E*)(& ._0)), 1u}, (*(const std::allocator<E>*)(& std::allocator<E>())))' uses local variable '._0')

PR c++/56614
	* decl.c (local_variable_p_walkfn): Check DECL_ARTIFICIAL again.

From-SVN: r196662
This commit is contained in:
Jason Merrill 2013-03-14 13:34:55 -04:00 committed by Jason Merrill
parent c2bb4db4af
commit a4c0821aa4
3 changed files with 43 additions and 3 deletions

View File

@ -1,3 +1,8 @@
2013-03-14 Jason Merrill <jason@redhat.com>
PR c++/56614
* decl.c (local_variable_p_walkfn): Check DECL_ARTIFICIAL again.
2013-03-14 Jakub Jelinek <jakub@redhat.com>
PR c++/56403

View File

@ -10536,9 +10536,8 @@ static tree
local_variable_p_walkfn (tree *tp, int *walk_subtrees,
void *data ATTRIBUTE_UNUSED)
{
/* 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;

View File

@ -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);
}
};