xref: /aosp_15_r20/external/clang/test/SemaObjC/call-super-2.m (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li// RUN: %clang_cc1 -fsyntax-only -verify %s
2*67e74705SXin Li
3*67e74705SXin Li#include <stddef.h>
4*67e74705SXin Li
5*67e74705SXin Litypedef struct objc_object *id;
6*67e74705SXin Liid objc_getClass(const char *s);
7*67e74705SXin Li
8*67e74705SXin Li@interface Object
9*67e74705SXin Li- (id) initWithInt: (int) i;
10*67e74705SXin Li@end
11*67e74705SXin Li
12*67e74705SXin Li@protocol Func
13*67e74705SXin Li+ (int) class_func0;
14*67e74705SXin Li- (int) instance_func0;
15*67e74705SXin Li@end
16*67e74705SXin Li
17*67e74705SXin Li@interface Derived: Object // expected-note {{receiver is instance of class declared here}}
18*67e74705SXin Li+ (int) class_func1;
19*67e74705SXin Li+ (int) class_func2;
20*67e74705SXin Li+ (int) class_func3;
21*67e74705SXin Li+ (int) class_func4;
22*67e74705SXin Li+ (int) class_func5;
23*67e74705SXin Li+ (int) class_func6;
24*67e74705SXin Li+ (int) class_func7;
25*67e74705SXin Li- (int) instance_func1;
26*67e74705SXin Li- (int) instance_func2;
27*67e74705SXin Li- (int) instance_func3;
28*67e74705SXin Li- (int) instance_func4;
29*67e74705SXin Li- (int) instance_func5;
30*67e74705SXin Li- (int) instance_func6;
31*67e74705SXin Li- (int) instance_func7;
32*67e74705SXin Li- (id) initWithInt: (int) i;
33*67e74705SXin Li@end
34*67e74705SXin Li
35*67e74705SXin Li@implementation Derived
36*67e74705SXin Li+ (int) class_func1
37*67e74705SXin Li{
38*67e74705SXin Li   int i = (size_t)[self class_func0];       // expected-warning {{class method '+class_func0' not found (return type defaults to 'id'); did you mean '+class_func}}
39*67e74705SXin Li   return i + (size_t)[super class_func0];   // expected-warning {{class method '+class_func0' not found (return type defaults to 'id')}}
40*67e74705SXin Li}
41*67e74705SXin Li+ (int) class_func2
42*67e74705SXin Li{
43*67e74705SXin Li   int i = [(id <Func>)self class_func0];
44*67e74705SXin Li   i += [(id <Func>)super class_func0];    // expected-error {{cannot cast 'super' (it isn't an expression)}}
45*67e74705SXin Li   i += [(Class <Func>)self class_func0];  //
46*67e74705SXin Li   return i + [(Class <Func>)super class_func0]; // // expected-error {{cannot cast 'super' (it isn't an expression)}}
47*67e74705SXin Li}
48*67e74705SXin Li+ (int) class_func3
49*67e74705SXin Li{
50*67e74705SXin Li   return [(Object <Func> *)super class_func0];  // expected-error {{cannot cast 'super' (it isn't an expression)}}
51*67e74705SXin Li}
52*67e74705SXin Li+ (int) class_func4
53*67e74705SXin Li{
54*67e74705SXin Li   return [(Derived <Func> *)super class_func0]; // expected-error {{cannot cast 'super' (it isn't an expression)}}
55*67e74705SXin Li}
56*67e74705SXin Li+ (int) class_func5
57*67e74705SXin Li{
58*67e74705SXin Li   int i = (size_t)[Derived class_func0];    // expected-warning {{class method '+class_func0' not found (return type defaults to 'id')}}
59*67e74705SXin Li   return i + (size_t)[Object class_func0];  // expected-warning {{class method '+class_func0' not found (return type defaults to 'id')}}
60*67e74705SXin Li}
61*67e74705SXin Li+ (int) class_func6
62*67e74705SXin Li{
63*67e74705SXin Li   return (size_t)[objc_getClass("Object") class_func1]; // GCC warns about this
64*67e74705SXin Li}
65*67e74705SXin Li+ (int) class_func7
66*67e74705SXin Li{
67*67e74705SXin Li   return [objc_getClass("Derived") class_func1];
68*67e74705SXin Li}
69*67e74705SXin Li- (int) instance_func1
70*67e74705SXin Li{
71*67e74705SXin Li   int i = (size_t)[self instance_func0];     // expected-warning {{instance method '-instance_func0' not found (return type defaults to 'id'); did you mean}}
72*67e74705SXin Li   return i + (size_t)[super instance_func0]; // expected-warning {{'Object' may not respond to 'instance_func0'}}
73*67e74705SXin Li}
74*67e74705SXin Li- (int) instance_func2
75*67e74705SXin Li{
76*67e74705SXin Li   return [(id <Func>)super instance_func0]; // expected-error {{cannot cast 'super' (it isn't an expression)}}
77*67e74705SXin Li}
78*67e74705SXin Li- (int) instance_func3
79*67e74705SXin Li{
80*67e74705SXin Li   return [(Object <Func> *)super instance_func0]; // expected-error {{cannot cast 'super' (it isn't an expression)}}
81*67e74705SXin Li}
82*67e74705SXin Li- (int) instance_func4
83*67e74705SXin Li{
84*67e74705SXin Li   return [(Derived <Func> *)super instance_func0]; // expected-error {{cannot cast 'super' (it isn't an expression)}}
85*67e74705SXin Li}
86*67e74705SXin Li- (int) instance_func5
87*67e74705SXin Li{
88*67e74705SXin Li   int i = (size_t)[Derived instance_func1]; // expected-warning {{class method '+instance_func1' not found (return type defaults to 'id')}}
89*67e74705SXin Li   return i + (size_t)[Object instance_func1]; // expected-warning {{class method '+instance_func1' not found (return type defaults to 'id')}}
90*67e74705SXin Li}
91*67e74705SXin Li- (int) instance_func6
92*67e74705SXin Li{
93*67e74705SXin Li   return (size_t)[objc_getClass("Object") class_func1];
94*67e74705SXin Li}
95*67e74705SXin Li- (int) instance_func7
96*67e74705SXin Li{
97*67e74705SXin Li   return [objc_getClass("Derived") class_func1];
98*67e74705SXin Li}
99*67e74705SXin Li- (id) initWithInt: (int) i
100*67e74705SXin Li{
101*67e74705SXin Li   // Don't warn about parentheses here.
102*67e74705SXin Li   if (self = [super initWithInt: i]) {
103*67e74705SXin Li     [self instance_func1];
104*67e74705SXin Li   }
105*67e74705SXin Li   return self;
106*67e74705SXin Li}
107*67e74705SXin Li@end
108*67e74705SXin Li
109