diff options
author | Jason Merrill <jason@redhat.com> | 2013-03-08 11:04:15 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2013-03-08 11:04:15 -0500 |
commit | 9d13a0695eee2cd19327279ef3cd464f8bf0ba76 (patch) | |
tree | 4a9a8095e97d26fc7159cfa477e01738792560d1 | |
parent | 37fb0a98782876d242f27708e13723c4a2a5d8c7 (diff) | |
download | gcc-9d13a0695eee2cd19327279ef3cd464f8bf0ba76.zip gcc-9d13a0695eee2cd19327279ef3cd464f8bf0ba76.tar.gz gcc-9d13a0695eee2cd19327279ef3cd464f8bf0ba76.tar.bz2 |
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
-rw-r--r-- | gcc/cp/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/class.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/local-targ1.C | 31 |
3 files changed, 39 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 0aa5b4b..8e14fa2 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -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'. diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 2a0351f..746c29d 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -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); diff --git a/gcc/testsuite/g++.dg/cpp0x/local-targ1.C b/gcc/testsuite/g++.dg/cpp0x/local-targ1.C new file mode 100644 index 0000000..588149a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/local-targ1.C @@ -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>(); +} |