xref: /aosp_15_r20/external/clang/test/SemaObjC/super.m (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li// RUN: %clang_cc1 -fsyntax-only -verify -fblocks %s
2*67e74705SXin Li
3*67e74705SXin Livoid takevoidptr(void*);
4*67e74705SXin Li
5*67e74705SXin Li
6*67e74705SXin Li@interface Foo
7*67e74705SXin Li- iMethod;
8*67e74705SXin Li+ cMethod;
9*67e74705SXin Li@end
10*67e74705SXin Li
11*67e74705SXin Li@interface A
12*67e74705SXin Li+ superClassMethod;
13*67e74705SXin Li- (void)instanceMethod;
14*67e74705SXin Li@end
15*67e74705SXin Li
16*67e74705SXin Li@interface B : A
17*67e74705SXin Li- (void)instanceMethod;
18*67e74705SXin Li+ classMethod;
19*67e74705SXin Li@end
20*67e74705SXin Li
21*67e74705SXin Li@implementation B
22*67e74705SXin Li
23*67e74705SXin Li- (void)instanceMethod {
24*67e74705SXin Li  [super iMethod]; // expected-warning{{'A' may not respond to 'iMethod'}}
25*67e74705SXin Li
26*67e74705SXin Li  // Use of super in a block is ok and does codegen to the right thing.
27*67e74705SXin Li  // rdar://7852959
28*67e74705SXin Li  takevoidptr(^{
29*67e74705SXin Li    [super instanceMethod];
30*67e74705SXin Li  });
31*67e74705SXin Li}
32*67e74705SXin Li
33*67e74705SXin Li+ classMethod {
34*67e74705SXin Li  [super cMethod]; // expected-warning{{method '+cMethod' not found (return type defaults to 'id')}}
35*67e74705SXin Li
36*67e74705SXin Li  id X[] = { [ super superClassMethod] };
37*67e74705SXin Li  id Y[] = {
38*67e74705SXin Li    [ super.superClassMethod iMethod],
39*67e74705SXin Li    super.superClassMethod,
40*67e74705SXin Li    (id)super.superClassMethod  // not a cast of super: rdar://7853261
41*67e74705SXin Li  };
42*67e74705SXin Li  return 0;
43*67e74705SXin Li}
44*67e74705SXin Li@end
45*67e74705SXin Li
46*67e74705SXin Li@interface XX
47*67e74705SXin Li- m;
48*67e74705SXin Li@end
49*67e74705SXin Li
50*67e74705SXin Livoid f(id super) {
51*67e74705SXin Li  [super m];
52*67e74705SXin Li}
53*67e74705SXin Livoid f0(int super) {
54*67e74705SXin Li  [super m]; // expected-warning{{receiver type 'int' is not 'id'}}
55*67e74705SXin Li}
56*67e74705SXin Livoid f1(id puper) {  // expected-note {{'puper' declared here}}
57*67e74705SXin Li  [super m]; // expected-error{{use of undeclared identifier 'super'}}
58*67e74705SXin Li}
59*67e74705SXin Li
60*67e74705SXin Li// radar 7400691
61*67e74705SXin Litypedef Foo super;
62*67e74705SXin Li
63*67e74705SXin Litypedef Foo FooTD;
64*67e74705SXin Li
65*67e74705SXin Livoid test() {
66*67e74705SXin Li  [FooTD cMethod];
67*67e74705SXin Li  [super cMethod];
68*67e74705SXin Li}
69*67e74705SXin Li
70*67e74705SXin Listruct SomeStruct {
71*67e74705SXin Li  int X;
72*67e74705SXin Li};
73*67e74705SXin Li
74*67e74705SXin Liint test2() {
75*67e74705SXin Li  struct SomeStruct super = { 0 };
76*67e74705SXin Li  return super.X;
77*67e74705SXin Li}
78*67e74705SXin Li
79*67e74705SXin Liint test3() {
80*67e74705SXin Li  id super = 0;
81*67e74705SXin Li  [(B*)super instanceMethod];
82*67e74705SXin Li  int *s1 = (int*)super;
83*67e74705SXin Li
84*67e74705SXin Li  id X[] = { [ super superClassMethod] };
85*67e74705SXin Li  return 0;
86*67e74705SXin Li}
87