[clang] Handle __declspec() attributes in using
[llvm-project.git] / clang / test / Sema / warn-documentation.m
blob962a5f63fb75d8ddb9ba3f62d1e672ec305b622b
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
4 @class NSString;
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;
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;
23 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
24 /// \brief\author Aaa
25 @property int test3; // a property: ObjCPropertyDecl
27 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
28 /// \brief\author Aaa
29 @property int test4; // a property: ObjCPropertyDecl
30 @end
32 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
33 /// \brief\author Aaa
34 @interface Test1()
35 @end
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;
44 + (NSString *)test2:(NSString *)aaa {
45   return 0;
48 @synthesize test3; // a property implementation: ObjCPropertyImplDecl
49 @dynamic test4; // a property implementation: ObjCPropertyImplDecl
51 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
52 /// \brief\author Aaa
53 NSString *_test5;
54 @end
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
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;
70 @end
72 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
73 /// \brief\author Aaa
74 @protocol TestProto1 // a protocol: ObjCProtocolDecl
75 @end
77 int a;
79 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
80 /// \brief\author Aaa
81 @interface Test4
82 @end
84 int b;
86 @interface TestReturns1
87 /// \returns Aaa
88 - (int)test1:(NSString *)aaa;
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
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.
99 typedef int (^test_param1)(int aaa, int ccc);
101 // rdar://13094352
102 // expected-warning@+2 {{'@method' command should be used in a comment attached to an Objective-C method declaration}}
103 @interface I
104 /*!     @method Base64EncodeEx
106 typedef id ID;
107 - (unsigned) Base64EncodeEx : (ID)Arg;
108 @end
110 // rdar://12379114
111 // expected-warning@+5 {{'@interface' command should not be used in a comment attached to a non-interface declaration}} 
112 // expected-warning@+5 {{'@classdesign' command should not be used in a comment attached to a non-container declaration}}
113 // expected-warning@+5 {{'@coclass' command should not be used in a comment attached to a non-container declaration}} 
114 @interface NSObject @end
116 @interface IOCommandGate
117 @classdesign Multiple paragraphs go here.
118 @coclass myCoClass 
121 typedef id OBJ;
122 @interface IOCommandGate : NSObject {
123   OBJ iv;
125 @end
127 // rdar://12379114
128 // expected-warning@+4 {{'@methodgroup' command should be used in a comment attached to an Objective-C method declaration}}
129 // expected-warning@+6 {{'@method' command should be used in a comment attached to an Objective-C method declaratio}}
130 @interface rdar12379114
132  @methodgroup Creating a request
135  @method initWithTimeout is the 2nd method
137 typedef unsigned int NSTimeInterval;
138 - (id)initWithTimeout:(NSTimeInterval)timeout;
139 @end
141 // expected-warning@+2 {{'@protocol' command should not be used in a comment attached to a non-protocol declaration}}
143 @protocol PROTO
145 struct S;
148   @interface NSArray This is an array
150 @class NSArray;
151 @interface NSArray @end
153 // expected-warning@+3 {{unknown command tag name}}
155 @interface NSMutableArray 
156 @super NSArray
158 @interface NSMutableArray : NSArray @end
161   @protocol MyProto
163 @protocol MyProto @end
165 // expected-warning@+2 {{'@protocol' command should not be used in a comment attached to a non-protocol declaration}}
167  @protocol MyProto
169 @interface INTF <MyProto> @end
171 // expected-warning@+2 {{'@struct' command should not be used in a comment attached to a non-struct declaration}}
173   @struct S1 THIS IS IT
175 @interface S1 @end
177 // expected-warning@+1 {{unknown command tag name}}
178 /// \t bbb IS_DOXYGEN_END
179 int FooBar(void);
181 // rdar://13836387
182 /** \brief Module handling the incoming notifications from the system.
184  * This includes:
185  * - Network Reachability
186  * - Power State
187  * - Low Disk
188  */
189 @interface BRC : NSObject
190 - (void)removeReach:(NSObject*)observer;
191 @end
193 @implementation BRC : NSObject
194 - (void)removeReach:(NSObject*)observer // expected-note {{previous declaration is here}}
197 - (void)removeReach:(NSObject*)observer // expected-error {{duplicate declaration of method 'removeReach:'}}
200 @end
202 // rdar://13927330
203 /// @class Asset  <- '@class' may be used in a comment attached to a an interface declaration
204 @interface Asset : NSObject
205 @end
207 // rdar://14024851 Check that this does not enter an infinite loop
208 @interface rdar14024851
209 -(void)meth; // expected-note {{declared here}}
210 @end
212 @implementation rdar14024851 // expected-warning {{method definition for 'meth' not found}} expected-note {{previous definition}}
213 @end
215 @implementation rdar14024851 // expected-error {{reimplementation}}
216 /// \brief comment
217 -(void)meth {}
218 @end
220 // rdar://14124644
221 @interface test_vararg1
222 /// @param[in] arg something
223 /// @param[in] ... This is vararg
224 - (void) VarArgMeth : (id)arg, ...;
225 @end
227 @implementation test_vararg1
228 /// @param[in] arg something
229 /// @param[in] ... This is vararg
230 - (void) VarArgMeth : (id)arg, ... {}
231 @end
234  * blockPointerVariable
236  * @param i is integer.
237  * @returns integer.
238  */
239 int (^blockPointerVariable)(int i);
241 struct HasFields {
242   /**
243    * blockPointerField
244    *
245    * \param i is integer.
246    * \returns integer.
247    */
248   int (^blockPointerFields)(int i);
251 // expected-warning@+5 {{parameter 'p' not found in the function declaration}}
252 // expected-warning@+5 {{'\returns' command used in a comment that is attached to a function returning void}}
254  * functionPointerVariable
256  * \param p not here.
257  * \returns integer.
258  */
259 void (^_Nullable blockPointerVariableThatLeadsNowhere)(void);
261 @interface CheckFunctionBlockPointerVars {
262   /**
263    * functionPointerIVar
264    *
265    * @param i is integer.
266    * @returns integer.
267    */
268   int (*functionPointerIVar)(int i);
270   /**
271    * blockPointerIVar
272    *
273    * \param i is integer.
274    * \returns integer.
275    */
276   int (^blockPointerIVar)(int i);
280  * functionPointerProperty
282  * @param i is integer.
283  * @returns integer.
284  */
285 @property int (*functionPointerProperty)(int i);
288  * blockPointerProperty
290  * \param i is integer.
291  * \returns integer.
292  */
293 @property int (^blockPointerProperty)(int i);
296  * blockReturnsNothing
298  * \returns Nothing, but can allow this as this pattern is used to document the
299  * value that the property getter returns.
300  */
301 @property void (^blockReturnsNothing)(void);
303 @end
306  * Block typedef with variadic params.
308  * @param a
309  * works
311  * @param ...
312  * now should work too.
313  */
314 typedef void (^VariadicBlockType)(int a, ...);
316 // PR42844 - Assertion failures when using typedefed block pointers
317 typedef void(^VoidBlockType)(void);
318 typedef VoidBlockType VoidBlockTypeCall(void);
319 VoidBlockTypeCall *d; ///< \return none
320 // expected-warning@-1 {{'\return' command used in a comment that is not attached to a function or method declaration}}
321 VoidBlockTypeCall ^e; ///< \return none
322 // expected-warning@-1 {{'\return' command used in a comment that is not attached to a function or method declaration}}
324 #ifdef __cplusplus
325 @interface HasAnonNamespace @end
326 @implementation HasAnonNamespace
327 namespace {}
328 @end
329 #endif