re PR c++/25010 (Segmentation fault (infinite recursion in cgraph_clone_inlined_nodes))

PR c++/25010
	* ipa-inline.c (cgraph_clone_inlined_nodes): Do not assume that
	DECL_EXTERNAL functions have no bodies.  Tidy.
	PR c++/25010
	* g++.dg/opt/inline10.C: New test.

From-SVN: r108375
This commit is contained in:
Mark Mitchell 2005-12-11 04:16:32 +00:00 committed by Mark Mitchell
parent 92aed1cbf4
commit 40805a12e4
3 changed files with 44 additions and 17 deletions

View File

@ -115,24 +115,26 @@ cgraph_estimate_size_after_inlining (int times, struct cgraph_node *to,
void
cgraph_clone_inlined_nodes (struct cgraph_edge *e, bool duplicate, bool update_original)
{
struct cgraph_node *n;
/* We may eliminate the need for out-of-line copy to be output. In that
case just go ahead and re-use it. */
if (!e->callee->callers->next_caller
&& (!e->callee->needed || DECL_EXTERNAL (e->callee->decl))
&& duplicate
&& flag_unit_at_a_time)
if (duplicate)
{
gcc_assert (!e->callee->global.inlined_to);
if (!DECL_EXTERNAL (e->callee->decl))
overall_insns -= e->callee->global.insns, nfunctions_inlined++;
duplicate = 0;
}
else if (duplicate)
{
n = cgraph_clone_node (e->callee, e->count, e->loop_nest, update_original);
cgraph_redirect_edge_callee (e, n);
/* We may eliminate the need for out-of-line copy to be output.
In that case just go ahead and re-use it. */
if (!e->callee->callers->next_caller
&& !e->callee->needed
&& flag_unit_at_a_time)
{
gcc_assert (!e->callee->global.inlined_to);
if (DECL_SAVED_TREE (e->callee->decl))
overall_insns -= e->callee->global.insns, nfunctions_inlined++;
duplicate = false;
}
else
{
struct cgraph_node *n;
n = cgraph_clone_node (e->callee, e->count, e->loop_nest,
update_original);
cgraph_redirect_edge_callee (e, n);
}
}
if (e->caller->global.inlined_to)

View File

@ -1,3 +1,8 @@
2005-12-10 Mark Mitchell <mark@codesourcery.com>
PR c++/25010
* g++.dg/opt/inline10.C: New test.
2005-12-11 Steven G. Kargl <kargls@comcast.net>
* gfortran.dg/g77/19981216-0.f: Fix for fortran/25068.

View File

@ -0,0 +1,20 @@
// PR c++/25010
// { dg-options "-O2" }
#pragma interface
struct T
{
T *p;
void baz ()
{
p->baz ();
}
};
void foo (T *p)
{
p->baz ();
}