1/* Test if instance methods of root classes are used as class methods, if no
2   "real" methods are found.  For receivers of type 'id' and 'Class', all
3   root classes must be considered.  */
4/* Author: Ziemowit Laski <zlaski@apple.com>.  */
5/* { dg-do run } */
6/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
7#include <objc/objc.h>
8#include "../objc-obj-c++-shared/runtime.h"
9
10#include <stdlib.h>
11#include <string.h>
12
13#define CHECK_IF(expr) if(!(expr)) abort()
14
15@protocol Proto
16- (const char *) method4;
17@end
18
19@interface Root
20{ Class isa; }
21+ (const char *) method2;
22@end
23
24@interface Derived: Root
25- (const char *) method1;
26- (const char *) method2;
27- (const char *) method3;
28@end
29
30@interface Root (Categ)
31- (const char *) method3;
32@end
33
34@implementation Root (Categ)
35- (const char *) method3 { return "Root(Categ)::-method3"; }
36- (const char *) method4 { return "Root(Categ)::-method4"; }
37@end
38
39@implementation Derived
40- (const char *) method1 { return "Derived::-method1"; }
41- (const char *) method2 { return "Derived::-method2"; }
42- (const char *) method3 { return "Derived::-method3"; }
43@end
44
45@implementation Root
46+ initialize { return self; }
47- (const char *) method1 { return "Root::-method1"; }
48+ (const char *) method2 { return "Root::+method2"; }
49@end
50
51int main(void)
52{
53  Class obj = objc_getClass("Derived");
54
55  /* None of the following should elicit compiler-time warnings.  */
56
57  CHECK_IF(!strcmp([Root method1], "Root::-method1"));
58  CHECK_IF(!strcmp([Root method2], "Root::+method2"));
59  CHECK_IF(!strcmp([Root method3], "Root(Categ)::-method3"));
60  CHECK_IF(!strcmp([Root method4], "Root(Categ)::-method4"));
61  CHECK_IF(!strcmp([Derived method1], "Root::-method1"));
62  CHECK_IF(!strcmp([Derived method2], "Root::+method2"));
63  CHECK_IF(!strcmp([Derived method3], "Root(Categ)::-method3"));
64  CHECK_IF(!strcmp([Derived method4], "Root(Categ)::-method4"));
65  CHECK_IF(!strcmp([obj method1], "Root::-method1"));
66  CHECK_IF(!strcmp([obj method2], "Root::+method2"));
67  CHECK_IF(!strcmp([obj method3], "Root(Categ)::-method3"));
68  CHECK_IF(!strcmp([obj method4], "Root(Categ)::-method4"));
69
70  return 0;
71}
72
73