re PR c++/51620 ([c++0x] [4.6/4.7 Regression] ICE with private destructor)
authorJason Merrill <jason@redhat.com>
Fri, 13 Jan 2012 15:49:29 +0000 (10:49 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 13 Jan 2012 15:49:29 +0000 (10:49 -0500)
PR c++/51620
* class.c (build_vtbl_initializer): Use __cxa_deleted_virtual.

From-SVN: r183155

gcc/cp/ChangeLog
gcc/cp/class.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/defaulted34.C [new file with mode: 0644]
gcc/testsuite/g++.dg/template/virtual3.C [new file with mode: 0644]

index 978df516d0016e547a9778de06301a065daba077..58210f12e64308107ae7f5609763dbb0a81528d5 100644 (file)
@@ -1,3 +1,8 @@
+2012-01-13  Jason Merrill  <jason@redhat.com>
+
+       PR c++/51620
+       * class.c (build_vtbl_initializer): Use __cxa_deleted_virtual.
+
 2012-01-12  Jason Merrill  <jason@redhat.com>
 
        PR c++/51714
index 58c89d3dafaede7c434386951437e23ed0da7732..9b957fec36feea21327772fbdc05e20b1d83855e 100644 (file)
@@ -8352,6 +8352,18 @@ build_vtbl_initializer (tree binfo,
                  init = abort_fndecl_addr;
                }
            }
+         /* Likewise for deleted virtuals.  */
+         else if (DECL_DELETED_FN (fn_original))
+           {
+             fn = get_identifier ("__cxa_deleted_virtual");
+             if (!get_global_value_if_present (fn, &fn))
+               fn = push_library_fn (fn, (build_function_type_list
+                                          (void_type_node, NULL_TREE)),
+                                     NULL_TREE);
+             if (!TARGET_VTABLE_USES_DESCRIPTORS)
+               init = fold_convert (vfunc_ptr_type_node,
+                                    build_fold_addr_expr (fn));
+           }
          else
            {
              if (!integer_zerop (delta) || vcall_index)
index cbee6be3d5da4520874f6fb23370f430d83fa62d..2778556b8e3061f45799a4bc33fc326ad4d6c7ef 100644 (file)
@@ -1,3 +1,9 @@
+2012-01-13  Jason Merrill  <jason@redhat.com>
+
+       PR c++/51620
+       * g++.dg/cpp0x/defaulted34.C: New.
+       * g++.dg/template/virtual3.C: New.
+
 2012-01-13  Richard Guenther  <rguenther@suse.de>
 
        PR middle-end/8081
diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted34.C b/gcc/testsuite/g++.dg/cpp0x/defaulted34.C
new file mode 100644 (file)
index 0000000..0821992
--- /dev/null
@@ -0,0 +1,10 @@
+// { dg-options -std=c++0x }
+// { dg-final { scan-assembler "__cxa_deleted_virtual" } }
+
+struct A
+{
+  virtual void f();
+  virtual ~A() = delete;
+};
+
+void A::f() {}
diff --git a/gcc/testsuite/g++.dg/template/virtual3.C b/gcc/testsuite/g++.dg/template/virtual3.C
new file mode 100644 (file)
index 0000000..9fcfc45
--- /dev/null
@@ -0,0 +1,11 @@
+// PR c++/51620
+
+template<int> class A
+{
+  virtual ~A();                        // { dg-error "non-deleted|private" }
+};
+
+struct B : A<0>, A<1>          // { dg-error "deleted|context" }
+{
+  B() {}                       // { dg-error "context" }
+};