Commit 9d13a069 by Jason Merrill Committed by Jason Merrill

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
parent 37fb0a98
2013-03-08 Jason Merrill <jason@redhat.com> 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, * semantics.c (lambda_expr_this_capture): In unevaluated context,
just return the nearest 'this'. just return the nearest 'this'.
......
...@@ -2541,6 +2541,10 @@ modify_all_vtables (tree t, tree virtuals) ...@@ -2541,6 +2541,10 @@ modify_all_vtables (tree t, tree virtuals)
tree binfo = TYPE_BINFO (t); tree binfo = TYPE_BINFO (t);
tree *fnsp; 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. */ /* Update all of the vtables. */
dfs_walk_once (binfo, dfs_modify_vtables, NULL, t); dfs_walk_once (binfo, dfs_modify_vtables, NULL, t);
......
// 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>();
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment