Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / clang / test / SemaObjC / super.m
bloba86dc6376e5d9ba41c4bdff9b49d01b2800bef60
1 // RUN: %clang_cc1 -fsyntax-only -verify -fblocks %s
3 void takevoidptr(void*);
6 @interface Foo
7 - iMethod;
8 + cMethod;
9 @end
11 @interface A
12 + superClassMethod;
13 - (void)instanceMethod;
14 @end
16 @interface B : A
17 - (void)instanceMethod;
18 + classMethod;
19 @end
21 @implementation B
23 - (void)instanceMethod {
24   [super iMethod]; // expected-warning{{'A' may not respond to 'iMethod'}}
25   
26   // Use of super in a block is ok and does codegen to the right thing.
27   takevoidptr(^{
28     [super instanceMethod];
29   });
32 + classMethod {
33   [super cMethod]; // expected-warning{{method '+cMethod' not found (return type defaults to 'id')}}
34   
35   id X[] = { [ super superClassMethod] };
36   id Y[] = {
37     [ super.superClassMethod iMethod],
38     super.superClassMethod,
39     (id)super.superClassMethod  // not a cast of super
40   };
41   return 0;
43 @end
45 @interface XX
46 - m;
47 @end
49 void f(id super) {
50   [super m];
52 void f0(int super) {
53   [super m]; // expected-warning{{receiver type 'int' is not 'id'}}
55 void f1(id puper) {  // expected-note {{'puper' declared here}}
56   [super m]; // expected-error{{use of undeclared identifier 'super'}}
59 typedef Foo super;
61 typedef Foo FooTD;
63 void test(void) {
64   [FooTD cMethod];
65   [super cMethod];
68 struct SomeStruct {
69   int X;
72 int test2(void) {
73   struct SomeStruct super = { 0 };
74   return super.X;
77 int test3(void) {
78   id super = 0;
79   [(B*)super instanceMethod];
80   int *s1 = (int*)super;
81   
82   id X[] = { [ super superClassMethod] };
83   return 0;