aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicola Pero <nicola.pero@meta-innovation.com>2010-12-19 14:00:10 +0000
committerNicola Pero <nicola@gcc.gnu.org>2010-12-19 14:00:10 +0000
commite582b5e430271e1faf40c1b7700e6caafecfe0da (patch)
tree240c3c05ef45f8f3dafa30688e5d70e847230756
parent2899534b2c76c416d71d077c396f2396a784c4c5 (diff)
downloadgcc-e582b5e430271e1faf40c1b7700e6caafecfe0da.zip
gcc-e582b5e430271e1faf40c1b7700e6caafecfe0da.tar.gz
gcc-e582b5e430271e1faf40c1b7700e6caafecfe0da.tar.bz2
In gcc/testsuite/: 2010-12-19 Nicola Pero <nicola.pero@meta-innovation.com>
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. From-SVN: r168052
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/obj-c++.dg/gnu-api-2-objc_msg_lookup.mm77
-rw-r--r--gcc/testsuite/objc.dg/gnu-api-2-objc_msg_lookup.m77
3 files changed, 159 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index d8c5146..0696079 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+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.
+
2010-12-19 Chung-Lin Tang <cltang@codesourcery.com>
* gcc.target/arm/vfp-1.c (test_ldst): New test for VFP
diff --git a/gcc/testsuite/obj-c++.dg/gnu-api-2-objc_msg_lookup.mm b/gcc/testsuite/obj-c++.dg/gnu-api-2-objc_msg_lookup.mm
new file mode 100644
index 0000000..dcbf6d2
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/gnu-api-2-objc_msg_lookup.mm
@@ -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 <iostream>
+#include <cstring>
+
+@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 ()
+{
+ /* Functions are tested in alphabetical order. */
+
+ std::cout << "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 ();
+ }
+
+ std::cout << "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);
+}
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 0000000..5751f3f
--- /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;
+}