summaryrefslogtreecommitdiff
path: root/gcc/testsuite/objc.dg/method-13.m
diff options
context:
space:
mode:
authorzlaski <zlaski@138bc75d-0d04-0410-961f-82ee72b054a4>2003-10-03 22:24:03 +0000
committerzlaski <zlaski@138bc75d-0d04-0410-961f-82ee72b054a4>2003-10-03 22:24:03 +0000
commit945e49ce2421ece76aa0c7ccaba358fbe003d3d6 (patch)
treee37abdb5f9046a1b3c2c5a65570f0a9f40582a2b /gcc/testsuite/objc.dg/method-13.m
parent67c65562f54b79711c2faccaebb6faa31fdbdd4f (diff)
downloadgcc-945e49ce2421ece76aa0c7ccaba358fbe003d3d6.tar.gz
[gcc]
2003-10-03 Alexander Malmberg <alexander@malmberg.org> Ziemowit Laski <zlaski@apple.com> * objc/objc-act.c (add_method_to_hash_list, lookup_category): New functions. (lookup_method_in_hash_lists): New parameter indicating whether we are messaging 'Class' or 'id'. (check_duplicates): Likewise; do not assume all methods will be either class or instance methods. (generate_category, finish_class): Use lookup_category(). (add_method): Use add_method_to_hash_list(); insert instance methods of root classes into the global class method hash table. (add_category): Use lookup_category(); avoid constructing duplicate categories. (really_start_method): Add method to corresponding @interface, if not already there (and if the @interface exists). (finish_message_expr, finish_objc): Adjust calls to check_duplicates(). [gcc/testsuite] 2003-10-03 Alexander Malmberg <alexander@malmberg.org> Ziemowit Laski <zlaski@apple.com> * objc.dg/method-6.m ('starboard'): Move prototype from 'Base' to 'Derived', so that it is never considered a class method; add new warning for '+port' method ambiguity. * objc.dg/method-12.m: Include <objc/objc.h> instead of <objc/objc-api.h> (needed on Mac OS X). * objc.dg/method-13.m: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@72080 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/testsuite/objc.dg/method-13.m')
-rw-r--r--gcc/testsuite/objc.dg/method-13.m77
1 files changed, 77 insertions, 0 deletions
diff --git a/gcc/testsuite/objc.dg/method-13.m b/gcc/testsuite/objc.dg/method-13.m
new file mode 100644
index 00000000000..c824398ac5b
--- /dev/null
+++ b/gcc/testsuite/objc.dg/method-13.m
@@ -0,0 +1,77 @@
+/* Test if instance methods of root classes are used as class methods, if no
+ "real" methods are found. For receivers of type 'id' and 'Class', all
+ root classes must be considered. */
+/* Author: Ziemowit Laski <zlaski@apple.com>. */
+/* { dg-do run } */
+
+#include <objc/objc.h>
+
+#ifdef __NEXT_RUNTIME__
+#define OBJC_GETCLASS objc_getClass
+#else
+#define OBJC_GETCLASS objc_get_class
+#endif
+
+extern void abort(void);
+extern int strcmp(const char *, const char *);
+#define CHECK_IF(expr) if(!(expr)) abort()
+
+@protocol Proto
+- (const char *) method4;
+@end
+
+@interface Root
+{ Class isa; }
++ (const char *) method2;
+@end
+
+@interface Derived: Root
+- (const char *) method1;
+- (const char *) method2;
+- (const char *) method3;
+@end
+
+@interface Root (Categ)
+- (const char *) method3;
+@end
+
+@implementation Root (Categ)
+- (const char *) method3 { return "Root(Categ)::-method3"; }
+- (const char *) method4 { return "Root(Categ)::-method4"; }
+@end
+
+@implementation Derived
+- (const char *) method1 { return "Derived::-method1"; }
+- (const char *) method2 { return "Derived::-method2"; }
+- (const char *) method3 { return "Derived::-method3"; }
+@end
+
+@implementation Root
+#ifdef __NEXT_RUNTIME__
++ initialize { return self; }
+#endif
+- (const char *) method1 { return "Root::-method1"; }
++ (const char *) method2 { return "Root::+method2"; }
+@end
+
+int main(void)
+{
+ Class obj = OBJC_GETCLASS("Derived");
+
+ /* None of the following should elicit compiler-time warnings. */
+
+ CHECK_IF(!strcmp([Root method1], "Root::-method1"));
+ CHECK_IF(!strcmp([Root method2], "Root::+method2"));
+ CHECK_IF(!strcmp([Root method3], "Root(Categ)::-method3"));
+ CHECK_IF(!strcmp([Root method4], "Root(Categ)::-method4"));
+ CHECK_IF(!strcmp([Derived method1], "Root::-method1"));
+ CHECK_IF(!strcmp([Derived method2], "Root::+method2"));
+ CHECK_IF(!strcmp([Derived method3], "Root(Categ)::-method3"));
+ CHECK_IF(!strcmp([Derived method4], "Root(Categ)::-method4"));
+ CHECK_IF(!strcmp([obj method1], "Root::-method1"));
+ CHECK_IF(!strcmp([obj method2], "Root::+method2"));
+ CHECK_IF(!strcmp([obj method3], "Root(Categ)::-method3"));
+ CHECK_IF(!strcmp([obj method4], "Root(Categ)::-method4"));
+
+ return 0;
+}