1// RUN: %clang_cc1 -fsyntax-only -triple x86_64-apple-darwin10 -DNON_FIXITS -verify -Wno-objc-root-class %s
2// RUN: cp %s %t
3// RUN: not %clang_cc1 -x objective-c -fsyntax-only -triple x86_64-apple-darwin10 -fixit -Wno-objc-root-class %t
4// RUN: %clang_cc1 -x objective-c -fsyntax-only -triple x86_64-apple-darwin10 -pedantic -Werror -Wno-objc-root-class %t
5// RUN: grep "@implementation Sub3" %t
6
7@interface NSString // expected-note 2{{'NSString' declared here}}
8+ (int)method:(int)x;
9@end
10
11void test() {
12  NSstring *str = @"A string"; // expected-error{{unknown type name 'NSstring'; did you mean 'NSString'?}}
13}
14
15@protocol P1
16@optional
17@property int *sprop; // expected-note{{'sprop' declared here}}
18@end
19
20@interface A
21{
22  int his_ivar; // expected-note 2{{'his_ivar' declared here}}
23  float wibble;
24}
25- (void)methodA;
26+ (void)methodA;
27@property int his_prop; // expected-note{{'his_prop' declared here}}
28@end
29
30@interface B : A <P1>
31{
32  int her_ivar; // expected-note 2{{'her_ivar' declared here}}
33}
34
35@property int her_prop; // expected-note{{'her_prop' declared here}}
36- (void)inst_method1:(int)a;
37+ (void)class_method1;
38@end
39
40@implementation A
41@synthesize his_prop = his_ivar;
42- (void)methodA { }
43+ (void)methodA { }
44@end
45
46@implementation B
47@synthesize her_prop = her_ivar;
48
49-(void)inst_method1:(int)a {
50  herivar = a; // expected-error{{use of undeclared identifier 'herivar'; did you mean 'her_ivar'?}}
51  hisivar = a; // expected-error{{use of undeclared identifier 'hisivar'; did you mean 'his_ivar'?}}
52  self->herivar = a; // expected-error{{'B' does not have a member named 'herivar'; did you mean 'her_ivar'?}}
53  self->hisivar = a; // expected-error{{'B' does not have a member named 'hisivar'; did you mean 'his_ivar'?}}
54  self.hisprop = 0; // expected-error{{property 'hisprop' not found on object of type 'B *'; did you mean 'his_prop'?}}
55  self.herprop = 0; // expected-error{{property 'herprop' not found on object of type 'B *'; did you mean 'her_prop'?}}
56  self.s_prop = 0; // expected-error{{property 's_prop' not found on object of type 'B *'; did you mean 'sprop'?}}
57}
58
59+(void)class_method1 {
60}
61@end
62
63void test_message_send(B* b) {
64  [NSstring method:17]; // expected-error{{unknown receiver 'NSstring'; did you mean 'NSString'?}}
65}
66
67@interface Collide // expected-note{{'Collide' declared here}}
68{
69@public
70  int value; // expected-note{{'value' declared here}}
71}
72
73@property int value; // expected-note{{'value' declared here}}
74@end
75
76@implementation Collide
77@synthesize value = value;
78@end
79
80void test2(Collide *a) {
81  a.valu = 17; // expected-error{{property 'valu' not found on object of type 'Collide *'; did you mean 'value'?}}
82  a->vale = 17; // expected-error{{'Collide' does not have a member named 'vale'; did you mean 'value'?}}
83}
84
85#ifdef NON_FIXITS
86@interface Derived : Collid // expected-error{{cannot find interface declaration for 'Collid', superclass of 'Derived'; did you mean 'Collide'?}}
87@end
88#endif
89
90#ifdef NON_FIXITS
91@protocol NetworkSocket // expected-note{{'NetworkSocket' declared here}}
92- (int)send:(void*)buffer bytes:(int)bytes;
93@end
94
95@interface IPv6 <Network_Socket> // expected-error{{cannot find protocol declaration for 'Network_Socket'; did you mean 'NetworkSocket'?}}
96@end
97#endif
98
99@interface Super
100- (int)method; // expected-note{{using}}
101- (int)method2;
102- (int)method3:(id)x;
103@end
104
105@interface Sub : Super
106- (int)method;
107@end
108
109@implementation Sub
110- (int)method {
111  return [supper method]; // expected-error{{unknown receiver 'supper'; did you mean 'super'?}}
112}
113  
114@end
115
116double *isupper(int);
117
118@interface Sub2 : Super
119- (int)method2;
120@end
121
122@implementation Sub2
123- (int)method2 {
124  return [supper method2]; // expected-error{{unknown receiver 'supper'; did you mean 'super'?}}
125}
126@end
127
128@interface Ivar
129@end
130
131@protocol Proto
132@property (retain) id ivar;
133@end
134
135#ifdef NON_FIXITS
136@interface User <Proto>
137- (void)method; // expected-note{{also found}}
138@end
139
140@implementation User
141@synthesize ivar;
142
143- (void)method {
144  // Test that we don't correct 'ivar' to 'Ivar'  e
145  [ivar method]; // expected-warning{{multiple methods named 'method' found}}
146}
147@end
148#endif
149
150void f(A *a) {
151  f(a) // expected-error{{expected ';' after expression}}
152  [a methodA] // expected-error{{expected ';' after expression}}
153  [A methodA] // expected-error{{expected ';' after expression}}
154}
155
156#ifdef NON_FIXITS
157@interface Sub3 : Super
158- (int)method3;
159@end
160
161@implementation Sub3
162- (int)method3 {
163  int x = super; // expected-error{{use of undeclared identifier 'super'}}
164  return 0;
165}
166@end
167#endif
168