xref: /llvm-project/clang/test/Sema/warn-documentation.m (revision 0f1c1be1968076d6f96f8a7bcc4a15cf195ecd97)
1// RUN: %clang_cc1 -fsyntax-only -fblocks -Wno-objc-root-class -Wdocumentation -Wdocumentation-pedantic -verify %s
2// RUN: %clang_cc1 -xobjective-c++ -fsyntax-only -fblocks -Wno-objc-root-class -Wdocumentation -Wdocumentation-pedantic -verify %s
3
4@class NSString;
5
6// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
7/// \brief\author Aaa
8@interface Test1
9// expected-warning@+2 {{empty paragraph passed to '\brief' command}}
10/**
11 * \brief\author Aaa
12 * \param aaa Aaa
13 * \param bbb Bbb
14 */
15+ (NSString *)test1:(NSString *)aaa suffix:(NSString *)bbb;
16
17// expected-warning@+2 {{parameter 'aab' not found in the function declaration}} expected-note@+2 {{did you mean 'aaa'?}}
18/**
19 * \param aab Aaa
20 */
21+ (NSString *)test2:(NSString *)aaa;
22
23// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
24/// \brief\author Aaa
25@property int test3; // a property: ObjCPropertyDecl
26
27// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
28/// \brief\author Aaa
29@property int test4; // a property: ObjCPropertyDecl
30@end
31
32// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
33/// \brief\author Aaa
34@interface Test1()
35@end
36
37// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
38/// \brief\author Aaa
39@implementation Test1 // a class implementation : ObjCImplementationDecl
40+ (NSString *)test1:(NSString *)aaa suffix:(NSString *)bbb {
41  return 0;
42}
43
44+ (NSString *)test2:(NSString *)aaa {
45  return 0;
46}
47
48@synthesize test3; // a property implementation: ObjCPropertyImplDecl
49@dynamic test4; // a property implementation: ObjCPropertyImplDecl
50
51// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
52/// \brief\author Aaa
53NSString *_test5;
54@end
55
56// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
57/// \brief\author Aaa
58@interface Test1(Test1Category) // a category: ObjCCategoryDecl
59// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
60/// \brief\author Aaa
61+ (NSString *)test3:(NSString *)aaa;
62@end
63
64// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
65/// \brief\author Aaa
66@implementation Test1(Test1Category) // a category implementation: ObjCCategoryImplDecl
67+ (NSString *)test3:(NSString *)aaa {
68  return 0;
69}
70@end
71
72// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
73/// \brief\author Aaa
74@protocol TestProto1 // a protocol: ObjCProtocolDecl
75@end
76
77int a;
78
79// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
80/// \brief\author Aaa
81@interface Test4
82@end
83
84int b;
85
86@interface TestReturns1
87/// \returns Aaa
88- (int)test1:(NSString *)aaa;
89
90// expected-warning@+1 {{'\returns' command used in a comment that is attached to a method returning void}}
91/// \returns Aaa
92- (void)test2:(NSString *)aaa;
93@end
94
95// expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'ccc'?}}
96/// \param aaa Meow.
97/// \param bbb Bbb.
98/// \returns aaa.
99typedef int (^test_param1)(int aaa, int ccc);
100
101// expected-warning@+2 {{'@method' command should be used in a comment attached to an Objective-C method declaration}}
102@interface I
103/*!	@method Base64EncodeEx
104*/
105typedef id ID;
106- (unsigned) Base64EncodeEx : (ID)Arg;
107@end
108
109// expected-warning@+5 {{'@interface' command should not be used in a comment attached to a non-interface declaration}}
110// expected-warning@+5 {{'@classdesign' command should not be used in a comment attached to a non-container declaration}}
111// expected-warning@+5 {{'@coclass' command should not be used in a comment attached to a non-container declaration}}
112@interface NSObject @end
113/*!
114@interface IOCommandGate
115@classdesign Multiple paragraphs go here.
116@coclass myCoClass
117*/
118
119typedef id OBJ;
120@interface IOCommandGate : NSObject {
121  OBJ iv;
122}
123@end
124
125// expected-warning@+4 {{'@methodgroup' command should be used in a comment attached to an Objective-C method declaration}}
126// expected-warning@+6 {{'@method' command should be used in a comment attached to an Objective-C method declaratio}}
127@interface rdar12379114
128/*!
129 @methodgroup Creating a request
130*/
131/*!
132 @method initWithTimeout is the 2nd method
133*/
134typedef unsigned int NSTimeInterval;
135- (id)initWithTimeout:(NSTimeInterval)timeout;
136@end
137
138// expected-warning@+2 {{'@protocol' command should not be used in a comment attached to a non-protocol declaration}}
139/*!
140@protocol PROTO
141*/
142struct S;
143
144/*!
145  @interface NSArray This is an array
146*/
147@class NSArray;
148@interface NSArray @end
149
150// expected-warning@+3 {{unknown command tag name}}
151/*!
152@interface NSMutableArray
153@super NSArray
154*/
155@interface NSMutableArray : NSArray @end
156
157/*!
158  @protocol MyProto
159*/
160@protocol MyProto @end
161
162// expected-warning@+2 {{'@protocol' command should not be used in a comment attached to a non-protocol declaration}}
163/*!
164 @protocol MyProto
165*/
166@interface INTF <MyProto> @end
167
168// expected-warning@+2 {{'@struct' command should not be used in a comment attached to a non-struct declaration}}
169/*!
170  @struct S1 THIS IS IT
171*/
172@interface S1 @end
173
174// expected-warning@+1 {{unknown command tag name}}
175/// \t bbb IS_DOXYGEN_END
176int FooBar(void);
177
178/** \brief Module handling the incoming notifications from the system.
179 *
180 * This includes:
181 * - Network Reachability
182 * - Power State
183 * - Low Disk
184 */
185@interface BRC : NSObject
186- (void)removeReach:(NSObject*)observer;
187@end
188
189@implementation BRC : NSObject
190- (void)removeReach:(NSObject*)observer // expected-note {{previous declaration is here}}
191{
192}
193- (void)removeReach:(NSObject*)observer // expected-error {{duplicate declaration of method 'removeReach:'}}
194{
195}
196@end
197
198/// @class Asset  <- '@class' may be used in a comment attached to a an interface declaration
199@interface Asset : NSObject
200@end
201
202// Check that this does not enter an infinite loop
203@interface rdar14024851
204-(void)meth; // expected-note {{declared here}}
205@end
206
207@implementation rdar14024851 // expected-warning {{method definition for 'meth' not found}} expected-note {{previous definition}}
208@end
209
210@implementation rdar14024851 // expected-error {{reimplementation}}
211/// \brief comment
212-(void)meth {}
213@end
214
215@interface test_vararg1
216/// @param[in] arg something
217/// @param[in] ... This is vararg
218- (void) VarArgMeth : (id)arg, ...;
219@end
220
221@implementation test_vararg1
222/// @param[in] arg something
223/// @param[in] ... This is vararg
224- (void) VarArgMeth : (id)arg, ... {}
225@end
226
227/**
228 * blockPointerVariable
229 *
230 * @param i is integer.
231 * @returns integer.
232 */
233int (^blockPointerVariable)(int i);
234
235struct HasFields {
236  /**
237   * blockPointerField
238   *
239   * \param i is integer.
240   * \returns integer.
241   */
242  int (^blockPointerFields)(int i);
243};
244
245// expected-warning@+5 {{parameter 'p' not found in the function declaration}}
246// expected-warning@+5 {{'\returns' command used in a comment that is attached to a function returning void}}
247/**
248 * functionPointerVariable
249 *
250 * \param p not here.
251 * \returns integer.
252 */
253void (^_Nullable blockPointerVariableThatLeadsNowhere)(void);
254
255@interface CheckFunctionBlockPointerVars {
256  /**
257   * functionPointerIVar
258   *
259   * @param i is integer.
260   * @returns integer.
261   */
262  int (*functionPointerIVar)(int i);
263
264  /**
265   * blockPointerIVar
266   *
267   * \param i is integer.
268   * \returns integer.
269   */
270  int (^blockPointerIVar)(int i);
271}
272
273/**
274 * functionPointerProperty
275 *
276 * @param i is integer.
277 * @returns integer.
278 */
279@property int (*functionPointerProperty)(int i);
280
281/**
282 * blockPointerProperty
283 *
284 * \param i is integer.
285 * \returns integer.
286 */
287@property int (^blockPointerProperty)(int i);
288
289/**
290 * blockReturnsNothing
291 *
292 * \returns Nothing, but can allow this as this pattern is used to document the
293 * value that the property getter returns.
294 */
295@property void (^blockReturnsNothing)(void);
296
297@end
298
299/*!
300 * Block typedef with variadic params.
301 *
302 * @param a
303 * works
304 *
305 * @param ...
306 * now should work too.
307 */
308typedef void (^VariadicBlockType)(int a, ...);
309
310// PR42844 - Assertion failures when using typedefed block pointers
311typedef void(^VoidBlockType)(void);
312typedef VoidBlockType VoidBlockTypeCall(void);
313VoidBlockTypeCall *d; ///< \return none
314// expected-warning@-1 {{'\return' command used in a comment that is not attached to a function or method declaration}}
315VoidBlockTypeCall ^e; ///< \return none
316// expected-warning@-1 {{'\return' command used in a comment that is not attached to a function or method declaration}}
317
318#ifdef __cplusplus
319@interface HasAnonNamespace @end
320@implementation HasAnonNamespace
321namespace {}
322@end
323#endif
324