]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
objc-act.c (get_super_receiver): If inside a class method of a category...
authorZiemowit Laski <zlaski@apple.com>
Mon, 26 Aug 2002 21:17:20 +0000 (21:17 +0000)
committerZiemowit Laski <zlaski@gcc.gnu.org>
Mon, 26 Aug 2002 21:17:20 +0000 (21:17 +0000)
[gcc]
2002-08-26  Ziemowit Laski <zlaski@apple.com>

        * objc/objc-act.c (get_super_receiver): If inside a class method
        of a category, cast the receiver to 'id' before accessing the 'isa'
        field so that <objc/objc-class.h> is not needed.  For NeXT runtime.

[gcc/testsuite]
2002-08-26  Ziemowit Laski  <zlaski@apple.com>

        * objc.dg/super-class-2.m: New test.

From-SVN: r56587

gcc/ChangeLog
gcc/objc/objc-act.c
gcc/testsuite/ChangeLog
gcc/testsuite/objc.dg/super-class-2.m [new file with mode: 0644]

index 4192aad6bc7ea8a62db5703e6bd307a359425bc1..4783fea3a840d927c3d3fefe61183a6d6febe2b3 100644 (file)
@@ -1,3 +1,9 @@
+2002-08-26  Ziemowit Laski <zlaski@apple.com>
+
+       * objc/objc-act.c (get_super_receiver): If inside a class method
+       of a category, cast the receiver to 'id' before accessing the 'isa'
+       field so that <objc/objc-class.h> is not needed.  For NeXT runtime.
+
 2002-08-26  Ulrich Weigand  <uweigand@de.ibm.com>
 
        * config/s390/s390-protos.h (s390_function_prologue, 
index e1c630d6be60d78679401c74471832a49b97e3f5..0819369136995bd1dcf3ff58cd1d338b4696c459 100644 (file)
@@ -7042,9 +7042,13 @@ get_super_receiver ()
            {
              super_class = get_class_reference (super_name);
              if (TREE_CODE (objc_method_context) == CLASS_METHOD_DECL)
+               /* Cast the super class to 'id', since the user may not have
+                  included <objc/objc-class.h>, leaving 'struct objc_class'
+                  an incomplete type.  */
                super_class
-                 = build_component_ref (build_indirect_ref (super_class, "->"),
-                                        get_identifier ("isa"));
+                 = build_component_ref (build_indirect_ref 
+                                        (build_c_cast (id_type, super_class), "->"),
+                                         get_identifier ("isa"));
            }
          else
            {
index f509299f6e5d772ca1790bcfd0e6533eb6357487..496fc950a9dcbe24dea25383744d13be894e04ce 100644 (file)
@@ -1,3 +1,7 @@
+2002-08-26  Ziemowit Laski  <zlaski@apple.com>
+
+        * objc.dg/super-class-2.m: New test.
+
 2002-08-24  Matt Austern  <austern@apple.com>
 
        * g++.dg/ext/lvaddr.C: New test.
diff --git a/gcc/testsuite/objc.dg/super-class-2.m b/gcc/testsuite/objc.dg/super-class-2.m
new file mode 100644 (file)
index 0000000..15d018e
--- /dev/null
@@ -0,0 +1,45 @@
+/* Test calling super from within a category class method.  */
+/* Author: Ziemowit Laski <zlaski@apple.com>  */
+/* { dg-do compile } */
+/* { dg-options "-fnext-runtime" } */
+
+typedef struct objc_object { struct objc_class *isa; } *id;
+
+@interface NSObject
++ (int) test_func0;
+@end
+@interface NSMenuItem: NSObject
++ (int) test_func0;
+@end
+
+@implementation NSObject
++ (int) test_func0
+{}
+@end
+
+@implementation NSMenuItem
++ (int) test_func0
+{
+  return [super test_func0];
+}
+@end
+
+@interface NSObject (Test)
++ (int) test_func;
+@end
+
+@implementation NSObject (Test)
++ (int) test_func
+{}
+@end
+
+@interface NSMenuItem (Test)
++ (int) test_func;
+@end
+
+@implementation NSMenuItem (Test)
++ (int) test_func
+{
+   return [super test_func];  /* { dg-bogus "dereferencing pointer to incomplete type" } */
+}
+@end