Index: gcc/doc/objc.texi
===================================================================
--- gcc/doc/objc.texi   (revision 179710)
+++ gcc/doc/objc.texi   (working copy)
@@ -635,7 +635,8 @@ following class does this:
 
 + (void)initialize
 @{
-  class_ivar_set_gcinvisible (self, "weakPointer", YES);
+  if (self == objc_lookUpClass ("WeakPointer"))
+    class_ivar_set_gcinvisible (self, "weakPointer", YES);
 @}
 
 - initWithPointer:(const void*)p
Index: gcc/ChangeLog
===================================================================
--- gcc/ChangeLog       (revision 179710)
+++ gcc/ChangeLog       (working copy)
@@ -1,3 +1,9 @@
+2011-10-08  Nicola Pero  <nicola.pero@meta-innovation.com>
+
+       PR libobjc/50428
+       * doc/objc.texi (Garbage Collection): Updated example to protect
+       +initialize against execution in subclasses.
+
 2011-10-07  Richard Henderson  <rth@redhat.com>
 
        * doc/extend.texi (__builtin_shuffle): Improve the description to
Index: gcc/testsuite/ChangeLog
===================================================================
--- gcc/testsuite/ChangeLog     (revision 179710)
+++ gcc/testsuite/ChangeLog     (working copy)
@@ -1,3 +1,8 @@
+2011-10-08  Nicola Pero  <nicola.pero@meta-innovation.com>
+
+       PR libobjc/50428        
+       * objc/execute/initialize-1.m: New test.
+
 2011-10-08  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/47844
Index: gcc/testsuite/objc/execute/initialize-1.m
===================================================================
--- gcc/testsuite/objc/execute/initialize-1.m   (revision 0)
+++ gcc/testsuite/objc/execute/initialize-1.m   (revision 0)
@@ -0,0 +1,47 @@
+/* Contributed by Nicola Pero - Sat  8 Oct 2011 16:47:48 BST */
+#include <objc/objc.h>
+
+/* Test that if a class has no +initialize method, the superclass
+   implementation is called.  */
+
+static int class_variable = 0;
+
+@interface TestClass
+{
+  Class isa;
+}
++ (void) initialize;
++ (int) classVariable;
+@end
+
+@implementation TestClass
++ (void) initialize
+{
+  class_variable++;
+}
++ (int) classVariable
+{
+  return class_variable;
+}
+@end
+
+@interface TestSubClass : TestClass
+@end
+
+@implementation TestSubClass
+@end
+
+int main (void)
+{
+  if ([TestClass classVariable] != 1)
+    {
+      abort ();
+    }
+
+  if ([TestSubClass classVariable] != 2)
+    {
+      abort ();
+    }
+
+  return 0;
+}
Index: libobjc/sendmsg.c
===================================================================
--- libobjc/sendmsg.c   (revision 179710)
+++ libobjc/sendmsg.c   (working copy)
@@ -516,34 +516,13 @@ __objc_send_initialize (Class class)
 
       {
        SEL op = sel_registerName ("initialize");
-       IMP imp = 0;
-        struct objc_method_list * method_list = class->class_pointer->methods;
-       
-        while (method_list)
+        struct objc_method *method = search_for_method_in_hierarchy (class->class_pointer, 
+                                                                    op);
+
+       if (method)
          {
-           int i;
-           struct objc_method * method;
-           
-           for (i = 0; i < method_list->method_count; i++)
-             {
-               method = &(method_list->method_list[i]);
-               if (method->method_name
-                   && method->method_name->sel_id == op->sel_id)
-                 {
-                   imp = method->method_imp;
-                   break;
-                 }
-             }
-           
-           if (imp)
-             break;
-           
-           method_list = method_list->method_next;
-         }
-       if (imp)
-         {
            DEBUG_PRINTF (" begin of [%s +initialize]\n", class->name);
-           (*imp) ((id) class, op);
+           (*method->method_imp) ((id)class, op);
            DEBUG_PRINTF (" end of [%s +initialize]\n", class->name);
          }
 #ifdef DEBUG
Index: libobjc/ChangeLog
===================================================================
--- libobjc/ChangeLog   (revision 179710)
+++ libobjc/ChangeLog   (working copy)
@@ -1,3 +1,14 @@
+2011-10-08  Richard Frith-Macdonald <rfm@gnu.org>
+            Nicola Pero  <nicola.pero@meta-innovation.com>
+
+       PR libobjc/50428
+       * sendmsg.c (__objc_send_initialize): If a class does not have an
+       +initialize method, search for an +initialize method in the
+       superclass and in the ancestor classes and execute the first one
+       that is found.  This makes the GNU runtime behave in the same way
+       as the Apple/NeXT runtime with respect to +initialize methods and
+       subclassing.
+
 2011-08-06  Nicola Pero  <nicola.pero@meta-innovation.com>
 
        PR libobjc/50002
