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// 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 105*/ 106typedef id ID; 107- (unsigned) Base64EncodeEx : (ID)Arg; 108@end 109 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 115/*! 116@interface IOCommandGate 117@classdesign Multiple paragraphs go here. 118@coclass myCoClass 119*/ 120 121typedef id OBJ; 122@interface IOCommandGate : NSObject { 123 OBJ iv; 124} 125@end 126 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 131/*! 132 @methodgroup Creating a request 133*/ 134/*! 135 @method initWithTimeout is the 2nd method 136*/ 137typedef unsigned int NSTimeInterval; 138- (id)initWithTimeout:(NSTimeInterval)timeout; 139@end 140 141// expected-warning@+2 {{'@protocol' command should not be used in a comment attached to a non-protocol declaration}} 142/*! 143@protocol PROTO 144*/ 145struct S; 146 147/*! 148 @interface NSArray This is an array 149*/ 150@class NSArray; 151@interface NSArray @end 152 153// expected-warning@+3 {{unknown command tag name}} 154/*! 155@interface NSMutableArray 156@super NSArray 157*/ 158@interface NSMutableArray : NSArray @end 159 160/*! 161 @protocol MyProto 162*/ 163@protocol MyProto @end 164 165// expected-warning@+2 {{'@protocol' command should not be used in a comment attached to a non-protocol declaration}} 166/*! 167 @protocol MyProto 168*/ 169@interface INTF <MyProto> @end 170 171// expected-warning@+2 {{'@struct' command should not be used in a comment attached to a non-struct declaration}} 172/*! 173 @struct S1 THIS IS IT 174*/ 175@interface S1 @end 176 177// expected-warning@+1 {{unknown command tag name}} 178/// \t bbb IS_DOXYGEN_END 179int FooBar(); 180 181// rdar://13836387 182/** \brief Module handling the incoming notifications from the system. 183 * 184 * This includes: 185 * - Network Reachability 186 * - Power State 187 * - Low Disk 188 */ 189@interface BRC : NSObject 190- (void)removeReach:(NSObject*)observer; 191@end 192 193@implementation BRC : NSObject 194- (void)removeReach:(NSObject*)observer // expected-note {{previous declaration is here}} 195{ 196} 197- (void)removeReach:(NSObject*)observer // expected-error {{duplicate declaration of method 'removeReach:'}} 198{ 199} 200@end 201 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 206 207// rdar://14024851 Check that this does not enter an infinite loop 208@interface rdar14024851 209-(void)meth; // expected-note {{declared here}} 210@end 211 212@implementation rdar14024851 // expected-warning {{method definition for 'meth' not found}} expected-note {{previous definition}} 213@end 214 215@implementation rdar14024851 // expected-error {{reimplementation}} 216/// \brief comment 217-(void)meth {} 218@end 219 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 226 227@implementation test_vararg1 228/// @param[in] arg something 229/// @param[in] ... This is vararg 230- (void) VarArgMeth : (id)arg, ... {} 231@end 232 233/** 234 * blockPointerVariable 235 * 236 * @param i is integer. 237 * @returns integer. 238 */ 239int (^blockPointerVariable)(int i); 240 241struct HasFields { 242 /** 243 * blockPointerField 244 * 245 * \param i is integer. 246 * \returns integer. 247 */ 248 int (^blockPointerFields)(int i); 249}; 250 251// expected-warning@+5 {{'\returns' command used in a comment that is attached to a function returning void}} 252/** 253 * functionPointerVariable 254 * 255 * \param p not here. 256 * \returns integer. 257 */ 258void (^_Nullable blockPointerVariableThatLeadsNowhere)(); 259 260@interface CheckFunctionBlockPointerVars { 261 /** 262 * functionPointerIVar 263 * 264 * @param i is integer. 265 * @returns integer. 266 */ 267 int (*functionPointerIVar)(int i); 268 269 /** 270 * blockPointerIVar 271 * 272 * \param i is integer. 273 * \returns integer. 274 */ 275 int (^blockPointerIVar)(int i); 276} 277 278/** 279 * functionPointerProperty 280 * 281 * @param i is integer. 282 * @returns integer. 283 */ 284@property int (*functionPointerProperty)(int i); 285 286/** 287 * blockPointerProperty 288 * 289 * \param i is integer. 290 * \returns integer. 291 */ 292@property int (^blockPointerProperty)(int i); 293 294/** 295 * blockReturnsNothing 296 * 297 * \returns Nothing, but can allow this as this pattern is used to document the 298 * value that the property getter returns. 299 */ 300@property void (^blockReturnsNothing)(); 301 302@end 303 304/*! 305 * Block typedef with variadic params. 306 * 307 * @param a 308 * works 309 * 310 * @param ... 311 * now should work too. 312 */ 313typedef void (^VariadicBlockType)(int a, ...); 314 315// PR42844 - Assertion failures when using typedefed block pointers 316typedef void(^VoidBlockType)(); 317typedef VoidBlockType VoidBlockTypeCall(); 318VoidBlockTypeCall *d; ///< \return none 319// expected-warning@-1 {{'\return' command used in a comment that is not attached to a function or method declaration}} 320VoidBlockTypeCall ^e; ///< \return none 321// expected-warning@-1 {{'\return' command used in a comment that is not attached to a function or method declaration}} 322 323#ifdef __cplusplus 324@interface HasAnonNamespace @end 325@implementation HasAnonNamespace 326namespace {} 327@end 328#endif 329