From: Jason Merrill Date: Thu, 10 Nov 2011 21:14:42 +0000 (-0500) Subject: re PR c++/50973 ([C++0x] internal compiler error defaulted destructor virtual inherit... X-Git-Tag: releases/gcc-4.7.0~2257 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=99c18869efe4d723a5c715696b65cd833dfee531;p=thirdparty%2Fgcc.git re PR c++/50973 ([C++0x] internal compiler error defaulted destructor virtual inheritance) 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 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 4492b3b62336..11fa21d31a7d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,10 @@ 2011-11-10 Jason Merrill + 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. diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 4e24755e2a5e..05f4b42ac73b 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -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); diff --git a/gcc/cp/method.c b/gcc/cp/method.c index bb58312b689a..8101f8a11c7c 100644 --- a/gcc/cp/method.c +++ b/gcc/cp/method.c @@ -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) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 90eded987160..85f77a94ff02 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-11-10 Jason Merrill + + PR c++/50973 + * g++.dg/cpp0x/defaulted33.C: New. + 2011-11-10 Andrew MacLeod 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 index 000000000000..2f11c1369d80 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted33.C @@ -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 +class ArrayNHD : public IOHD +{ + public: + ~ArrayNHD() = default; +}; +class TLText +{ + ~TLText(); + ArrayNHD* m_argsHD; +}; +TLText::~TLText() +{ + delete m_argsHD; +}