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)