re PR c++/6316 (trap when compiling file)

PR c++/6316
	* decl2.c (finish_file): Clear DECL_EXTERNAL in a separate loop
	before expanding.

	* g++.dg/opt/inline1.C: New test.

From-SVN: r52434
This commit is contained in:
Jakub Jelinek 2002-04-17 19:17:55 +02:00 committed by Jakub Jelinek
parent 03408d2b80
commit 32121b96b6
4 changed files with 61 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2002-04-17 Jakub Jelinek <jakub@redhat.com>
PR c++/6316
* decl2.c (finish_file): Clear DECL_EXTERNAL in a separate loop
before expanding.
2002-04-16 Mark Mitchell <mark@codesourcery.com>
* init.c (begin_init_stmts): Remove commented out code.

View File

@ -3432,7 +3432,11 @@ finish_file ()
not defined when they really are. This keeps these functions
from being put out unnecessarily. But, we must stop lying
when the functions are referenced, or if they are not comdat
since they need to be put out now. */
since they need to be put out now.
This is done in a separate for cycle, because if some deferred
function is contained in another deferred function later in
deferred_fns varray, rest_of_compilation would skip this
function and we really cannot expand the same function twice. */
for (i = 0; i < deferred_fns_used; ++i)
{
tree decl = VARRAY_TREE (deferred_fns, i);
@ -3441,6 +3445,11 @@ finish_file ()
&& DECL_INITIAL (decl)
&& DECL_NEEDED_P (decl))
DECL_EXTERNAL (decl) = 0;
}
for (i = 0; i < deferred_fns_used; ++i)
{
tree decl = VARRAY_TREE (deferred_fns, i);
/* If we're going to need to write this function out, and
there's already a body for it, create RTL for it now.

View File

@ -2,6 +2,8 @@
* gcc.dg/20020416-1.c: New test.
* g++.dg/opt/inline1.C: New test.
2002-04-16 Jakub Jelinek <jakub@redhat.com>
* gcc.dg/altivec-5.c: New test.

View File

@ -0,0 +1,43 @@
// PR c++/6316
// This testcase ICEd because when deferred bar()::F::F() was being
// expanded, containing bar() was still deferred and had DECL_EXTERNAL set
// (and DECL_NOT_REALLY_EXTERN too).
// { dg-do compile }
// { dg-options "-O3" }
struct A { ~A() throw() {} };
template<typename T, typename U> struct B { U a; B(const T *); };
typedef B<char, A> C;
struct D { D(); };
struct E { virtual ~E(); };
E *bar ();
void
foo ()
{
E *a = bar ();
}
extern char *z [];
E *
bar ()
{
struct F : public E
{
F ()
{
for (int i = 0; i < 2; i++)
C e = z[i];
}
D x, y;
};
return new F ();
}
int
main ()
{
foo ();
}