re PR c++/51884 ([C++11] ICE with local class/lambda template argument)

PR c++/51884
	* class.c (modify_all_vtables): Mangle the vtable name before
	entering dfs_walk.

From-SVN: r196551
This commit is contained in:
Jason Merrill 2013-03-08 11:04:15 -05:00 committed by Jason Merrill
parent 37fb0a9878
commit 9d13a0695e
3 changed files with 39 additions and 0 deletions

View file

@ -1,5 +1,9 @@
2013-03-08 Jason Merrill <jason@redhat.com>
PR c++/51884
* class.c (modify_all_vtables): Mangle the vtable name before
entering dfs_walk.
* semantics.c (lambda_expr_this_capture): In unevaluated context,
just return the nearest 'this'.

View file

@ -2541,6 +2541,10 @@ modify_all_vtables (tree t, tree virtuals)
tree binfo = TYPE_BINFO (t);
tree *fnsp;
/* Mangle the vtable name before entering dfs_walk (c++/51884). */
if (TYPE_CONTAINS_VPTR_P (t))
get_vtable_decl (t, false);
/* Update all of the vtables. */
dfs_walk_once (binfo, dfs_modify_vtables, NULL, t);

View file

@ -0,0 +1,31 @@
// PR c++/51884
// { dg-do compile { target c++11 } }
// { dg-final { scan-assembler "_ZN1BIZN3fooIivE3barILb1EEEvvE1CEC1ERKS4_" } }
template<typename TT>
struct test { static const int value = 0; };
template<int I>
struct enable_if { typedef void type; };
struct A { virtual void f() {} };
template<typename U> struct B : A { B(); B(const B&); };
template<typename U> B<U>::B() { }
template<typename U> B<U>::B(const B&) { }
template<class T> void g(T) { }
template<typename T, typename = void> struct foo;
template<typename T>
struct foo<T,typename enable_if<test<T>::value>::type>
{
template <bool P> void bar() {
struct C { } c;
B<C> b;
g(b);
}
};
int main() {
foo<int> f;
f.bar<true>();
}