From bec80a45fd419b66bb7fc6d658e24019b1395575 Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Sat, 2 Nov 2002 01:03:03 +0000 Subject: [PATCH] re PR c++/8391 (infinite loop in cp/decl2.c(finish_file)) PR c++/8391 * toplev.c (rest_of_compilation): Do not refuse to output code for an inline function in a local class. PR c++/8391 * g++.dg/opt/local1.C: New test. From-SVN: r58734 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/opt/local1.C | 20 ++++++++++++++++++++ gcc/toplev.c | 3 +++ 4 files changed, 34 insertions(+) create mode 100644 gcc/testsuite/g++.dg/opt/local1.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 20e95b7000a..1d4a1ff71db 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2002-11-01 Mark Mitchell + + PR c++/8391 + * toplev.c (rest_of_compilation): Do not refuse to output code for + an inline function in a local class. + 2002-11-01 David O'Brien * config/sparc/freebsd.h (CPP_CPU64_DEFAULT_SPEC): Define __arch64__. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 437893d0b51..90877e84ac1 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2002-11-01 Mark Mitchell + + PR c++/8391 + * g++.dg/opt/local1.C: New test. + 2002-10-30 Mark Mitchell PR c++/8160 diff --git a/gcc/testsuite/g++.dg/opt/local1.C b/gcc/testsuite/g++.dg/opt/local1.C new file mode 100644 index 00000000000..9cecaee6f2a --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/local1.C @@ -0,0 +1,20 @@ +// { dg-options "-O" } + +struct Outer { + struct Inner { virtual bool f() = 0; }; + void g(Inner &) const; +}; + +inline void h(const Outer &o) +{ + struct Local : public Outer::Inner { + virtual bool f() {}; + }; + Local l; + o.g(l); +} + +void f(Outer &req) { + h (req); +} + diff --git a/gcc/toplev.c b/gcc/toplev.c index 2f3d127441d..9e57576ebab 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -2429,6 +2429,9 @@ rest_of_compilation (decl) DECL_INITIAL (decl) = 0; goto exit_rest_of_compilation; } + else if (TYPE_P (parent)) + /* A function in a local class should be treated normally. */ + break; /* If requested, consider whether to make this function inline. */ if ((DECL_INLINE (decl) && !flag_no_inline) -- 2.30.2