+2004-10-26  Ziemowit Laski  <zlaski@apple.com>
+
+       * objc-act.c (finish_class): Do not synthesize bogus
+       'extern objc_object *_Foo;' declarations for @interface Foo.
+
 2004-10-25  Ziemowit Laski  <zlaski@apple.com>
            David Ayers  <d.ayers@inode.at>
 
 
                             IDENTIFIER_POINTER (CLASS_SUPER_NAME (objc_implementation_context)));
        }
     }
-
-  else if (TREE_CODE (class) == CLASS_INTERFACE_TYPE)
-    {
-      tree decl;
-      const char *class_name = IDENTIFIER_POINTER (CLASS_NAME (class));
-      char *string = (char *) alloca (strlen (class_name) + 3);
-
-      /* extern struct objc_object *_<my_name>; */
-
-      sprintf (string, "_%s", class_name);
-
-      decl = build_decl (VAR_DECL, get_identifier (string),
-                        build_pointer_type (objc_object_reference));
-      DECL_EXTERNAL (decl) = 1;
-      lang_hooks.decls.pushdecl (decl);
-      finish_decl (decl, NULL_TREE, NULL_TREE);
-    }
 }
 
 static tree
 
+2004-10-26  Ziemowit Laski  <zlaski@apple.com>
+
+       * objc.dg/super-class-3.m: New test.
+
 2004-10-26  Nathan Sidwell  <nathan@codesourcery.com>
 
        * gcc.dg/cpp/direct2.c: Adjust expected errors, robustify parser
 
--- /dev/null
+/* Ensure that the compiler does not emit spurious extern declarations named '_Foo', where 'Foo'
+   is an ObjC class name.  */
+/* Contributed by Ziemowit Laski <zlaski@apple.com>.  */
+/* { dg-do run } */
+
+#include <objc/Object.h>
+#include <stdlib.h>
+#define CHECK_IF(expr) if(!(expr)) abort()
+
+@interface _Child: Object
++ (int) flashCache;
+@end
+
+@interface Child: _Child
++ (int) flushCache1;
+@end
+
+@interface Child (Categ)
++ (int) flushCache2;
+@end
+
+int _Object = 23;  /* Should not conflict with @interface Object.  */
+
+@implementation _Child
++ (int) flashCache { return 12 + _Object; }
+@end
+
+@implementation Child
++ (int) flushCache1 { return 7 + [super flashCache]; }
+@end
+
+@implementation Child (Categ)
++ (int) flushCache2 { return 9 + [super flashCache]; }
+@end
+
+int main(void) {
+  CHECK_IF([_Child flashCache] == 35);
+  CHECK_IF([Child flushCache1] == 42);
+  CHECK_IF([Child flushCache2] == 44);
+
+  return 0; 
+}
+