Commit 99c18869 by Jason Merrill Committed by Jason Merrill

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
parent d660c35e
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.
......
......@@ -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);
......
......@@ -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)
......
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
......
// 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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment