OSDN Git Service

PR c++/8391
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 2 Nov 2002 01:03:03 +0000 (01:03 +0000)
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 2 Nov 2002 01:03:03 +0000 (01:03 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@58734 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/opt/local1.C [new file with mode: 0644]
gcc/toplev.c

index 20e95b7..1d4a1ff 100644 (file)
@@ -1,3 +1,9 @@
+2002-11-01  Mark Mitchell  <mark@codesourcery.com>
+
+       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  <obrien@FreeBSD.org>
 
        * config/sparc/freebsd.h (CPP_CPU64_DEFAULT_SPEC): Define __arch64__.
index 437893d..90877e8 100644 (file)
@@ -1,3 +1,8 @@
+2002-11-01  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/8391
+       * g++.dg/opt/local1.C: New test.
+
 2002-10-30  Mark Mitchell  <mark@codesourcery.com>
 
        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 (file)
index 0000000..9cecaee
--- /dev/null
@@ -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);
+}
index 2f3d127..9e57576 100644 (file)
@@ -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)