re PR c++/51884 ([C++11] ICE with local class/lambda template argument)
authorJason Merrill <jason@redhat.com>
Fri, 8 Mar 2013 16:04:15 +0000 (11:04 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 8 Mar 2013 16:04:15 +0000 (11:04 -0500)
PR c++/51884
* class.c (modify_all_vtables): Mangle the vtable name before
entering dfs_walk.

From-SVN: r196551

gcc/cp/ChangeLog
gcc/cp/class.c
gcc/testsuite/g++.dg/cpp0x/local-targ1.C [new file with mode: 0644]

index 0aa5b4b..8e14fa2 100644 (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'.
 
index 2a0351f..746c29d 100644 (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);
 
diff --git a/gcc/testsuite/g++.dg/cpp0x/local-targ1.C b/gcc/testsuite/g++.dg/cpp0x/local-targ1.C
new file mode 100644 (file)
index 0000000..588149a
--- /dev/null
@@ -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>();
+}