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