summaryrefslogtreecommitdiff
path: root/gcc/testsuite/objc.dg
diff options
context:
space:
mode:
authornicola <nicola@138bc75d-0d04-0410-961f-82ee72b054a4>2010-12-19 14:00:10 +0000
committernicola <nicola@138bc75d-0d04-0410-961f-82ee72b054a4>2010-12-19 14:00:10 +0000
commit1b3366786e3f84bf397a0718fa897c579c731f31 (patch)
tree240c3c05ef45f8f3dafa30688e5d70e847230756 /gcc/testsuite/objc.dg
parentbb681846a00f990c09d44a0b5303ba47efa12db3 (diff)
downloadgcc-1b3366786e3f84bf397a0718fa897c579c731f31.tar.gz
In gcc/testsuite/:
2010-12-19 Nicola Pero <nicola.pero@meta-innovation.com> * objc.dg/gnu-api-2-objc_msg_lookup.m: New. * obj-c++.dg/gnu-api-2-objc_msg_lookup.mm: New. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@168052 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/testsuite/objc.dg')
-rw-r--r--gcc/testsuite/objc.dg/gnu-api-2-objc_msg_lookup.m77
1 files changed, 77 insertions, 0 deletions
diff --git a/gcc/testsuite/objc.dg/gnu-api-2-objc_msg_lookup.m b/gcc/testsuite/objc.dg/gnu-api-2-objc_msg_lookup.m
new file mode 100644
index 00000000000..5751f3fd298
--- /dev/null
+++ b/gcc/testsuite/objc.dg/gnu-api-2-objc_msg_lookup.m
@@ -0,0 +1,77 @@
+/* Test the Modern GNU Objective-C Runtime API.
+
+ This is test 'objc_msg_lookup', covering objc_msg_lookup(),
+ objc_msg_lookup_super() and struct objc_super. */
+
+/* { dg-do run } */
+/* { dg-skip-if "" { *-*-* } { "-fnext-runtime" } { "" } } */
+
+/* To get the modern GNU Objective-C Runtime API, you include
+ objc/runtime.h. */
+#include <objc/runtime.h>
+
+/* For objc_msg_lookup(), objc_msg_lookup_super() and struct
+ objc_super. */
+#include <objc/message.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+@interface MyRootClass
+{ Class isa; }
++ alloc;
+- init;
+- (int) test;
+@end
+
+@implementation MyRootClass
++ alloc { return class_createInstance (self, 0); }
+- init { return self; }
+- (int) test { return 20; }
+@end
+
+@interface MySubClass : MyRootClass
+- (int) test;
+@end
+
+@implementation MySubClass
+- (int) test { return 11; }
+@end
+
+int main (int argc, void **args)
+{
+ /* Functions are tested in alphabetical order. */
+
+ printf ("Testing objc_msg_lookup ()...\n");
+ {
+ MySubClass *object = [[MySubClass alloc] init];
+ int (* test_IMP) (id receiver, SEL selector);
+
+ test_IMP = (int (*)(id, SEL))objc_msg_lookup (object, @selector (test));
+
+ if (test_IMP (object, @selector (test)) != 11)
+ abort ();
+ }
+
+ printf ("Testing objc_msg_lookup_super ()...\n");
+ {
+ MySubClass *object = [[MySubClass alloc] init];
+ struct objc_super super = { 0, 0 };
+ int (* test_IMP) (id receiver, SEL selector);
+
+ /* Get the implementation of -test for the superclass of object -
+ as if we were calling [super test] inside a method
+ implementation of object. */
+ super.self = object;
+ super.super_class = class_getSuperclass (object_getClass (object));
+ test_IMP = (int (*)(id, SEL))objc_msg_lookup_super (&super, @selector (test));
+
+ /* Invoke it. The method in MyRootClass, not the one in
+ MySubClass, should be invoked. */
+ if (test_IMP (object, @selector (test)) != 20)
+ abort ();
+ }
+
+ return 0;
+}