]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/50973 ([C++0x] internal compiler error defaulted destructor virtual inherit...
authorJason Merrill <jason@redhat.com>
Thu, 10 Nov 2011 21:14:42 +0000 (16:14 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 10 Nov 2011 21:14:42 +0000 (16:14 -0500)
PR c++/50973
* decl2.c (mark_used): Defer synthesis of virtual functions.
* method.c (use_thunk): Make sure the target function has
DECL_INTERFACE_KNOWN.

From-SVN: r181272

gcc/cp/ChangeLog
gcc/cp/decl2.c
gcc/cp/method.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/defaulted33.C [new file with mode: 0644]

index 4492b3b62336fc467bdc889a85217ea5bd3a1c27..11fa21d31a7def1286e880cb4caa3571a68b13de 100644 (file)
@@ -1,5 +1,10 @@
 2011-11-10  Jason Merrill  <jason@redhat.com>
 
+       PR c++/50973
+       * decl2.c (mark_used): Defer synthesis of virtual functions.
+       * method.c (use_thunk): Make sure the target function has
+       DECL_INTERFACE_KNOWN.
+
        PR c++/51079, DR 495
        * call.c (joust): Check the second conversion sequence
        before checking templates.
index 4e24755e2a5e2a7b78b8f66db2a4a4b64886dc07..05f4b42ac73bf1e6bb7e034fd8ba7d21c6ecd1ee 100644 (file)
@@ -4347,6 +4347,14 @@ mark_used (tree decl)
       && !DECL_DEFAULTED_OUTSIDE_CLASS_P (decl)
       && ! DECL_INITIAL (decl))
     {
+      /* Defer virtual destructors so that thunks get the right
+        linkage.  */
+      if (DECL_VIRTUAL_P (decl) && !at_eof)
+       {
+         note_vague_linkage_fn (decl);
+         return true;
+       }
+
       /* Remember the current location for a function we will end up
         synthesizing.  Then we can inform the user where it was
         required in the case of error.  */
@@ -4358,7 +4366,7 @@ mark_used (tree decl)
         on the stack (such as overload resolution candidates).
 
          We could just let cp_write_global_declarations handle synthesizing
-         this function, since we just added it to deferred_fns, but doing
+         this function by adding it to deferred_fns, but doing
          it at the use site produces better error messages.  */
       ++function_depth;
       synthesize_method (decl);
index bb58312b689a0532b87d846c7e68a7b88078714e..8101f8a11c7c4ea1a5365753f93090f09117c1a0 100644 (file)
@@ -339,6 +339,7 @@ use_thunk (tree thunk_fndecl, bool emit_p)
   DECL_EXTERNAL (thunk_fndecl) = 0;
   /* The linkage of the function may have changed.  FIXME in linkage
      rewrite.  */
+  gcc_assert (DECL_INTERFACE_KNOWN (function));
   TREE_PUBLIC (thunk_fndecl) = TREE_PUBLIC (function);
   DECL_VISIBILITY (thunk_fndecl) = DECL_VISIBILITY (function);
   DECL_VISIBILITY_SPECIFIED (thunk_fndecl)
index 90eded987160b17ec98b4dd9fe95e430320cb77d..85f77a94ff026c0b9ce2efa7395e49f9e1e35f8d 100644 (file)
@@ -1,3 +1,8 @@
+2011-11-10  Jason Merrill  <jason@redhat.com>
+
+       PR c++/50973
+       * g++.dg/cpp0x/defaulted33.C: New.
+
 2011-11-10  Andrew MacLeod  <amacleod@redhat.com>
 
        PR middle-end/51038
diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted33.C b/gcc/testsuite/g++.dg/cpp0x/defaulted33.C
new file mode 100644 (file)
index 0000000..2f11c13
--- /dev/null
@@ -0,0 +1,32 @@
+// PR c++/50973
+// { dg-do compile { target c++11 } }
+
+class HD
+{
+  public:
+  virtual ~HD() {};
+};
+class InputHD : public virtual HD
+{
+};
+class OutputHD : public virtual HD
+{
+};
+class IOHD : public InputHD, public OutputHD
+{
+};
+template <typename T, unsigned int N>
+class ArrayNHD : public IOHD
+{
+  public:
+  ~ArrayNHD() = default;
+};
+class TLText
+{
+  ~TLText();
+  ArrayNHD<int, 1>* m_argsHD;
+};
+TLText::~TLText()
+{
+  delete m_argsHD;
+}