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> 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 PR c++/51079, DR 495
* call.c (joust): Check the second conversion sequence * call.c (joust): Check the second conversion sequence
before checking templates. before checking templates.
......
...@@ -4347,6 +4347,14 @@ mark_used (tree decl) ...@@ -4347,6 +4347,14 @@ mark_used (tree decl)
&& !DECL_DEFAULTED_OUTSIDE_CLASS_P (decl) && !DECL_DEFAULTED_OUTSIDE_CLASS_P (decl)
&& ! DECL_INITIAL (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 /* Remember the current location for a function we will end up
synthesizing. Then we can inform the user where it was synthesizing. Then we can inform the user where it was
required in the case of error. */ required in the case of error. */
...@@ -4358,7 +4366,7 @@ mark_used (tree decl) ...@@ -4358,7 +4366,7 @@ mark_used (tree decl)
on the stack (such as overload resolution candidates). on the stack (such as overload resolution candidates).
We could just let cp_write_global_declarations handle synthesizing 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. */ it at the use site produces better error messages. */
++function_depth; ++function_depth;
synthesize_method (decl); synthesize_method (decl);
......
...@@ -339,6 +339,7 @@ use_thunk (tree thunk_fndecl, bool emit_p) ...@@ -339,6 +339,7 @@ use_thunk (tree thunk_fndecl, bool emit_p)
DECL_EXTERNAL (thunk_fndecl) = 0; DECL_EXTERNAL (thunk_fndecl) = 0;
/* The linkage of the function may have changed. FIXME in linkage /* The linkage of the function may have changed. FIXME in linkage
rewrite. */ rewrite. */
gcc_assert (DECL_INTERFACE_KNOWN (function));
TREE_PUBLIC (thunk_fndecl) = TREE_PUBLIC (function); TREE_PUBLIC (thunk_fndecl) = TREE_PUBLIC (function);
DECL_VISIBILITY (thunk_fndecl) = DECL_VISIBILITY (function); DECL_VISIBILITY (thunk_fndecl) = DECL_VISIBILITY (function);
DECL_VISIBILITY_SPECIFIED (thunk_fndecl) 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> 2011-11-10 Andrew MacLeod <amacleod@redhat.com>
PR middle-end/51038 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