// RUN: %clang_cc1 -fsyntax-only -fblocks -Wno-objc-root-class -Wdocumentation -Wdocumentation-pedantic -verify %s // RUN: %clang_cc1 -xobjective-c++ -fsyntax-only -fblocks -Wno-objc-root-class -Wdocumentation -Wdocumentation-pedantic -verify %s @class NSString; // expected-warning@+1 {{empty paragraph passed to '\brief' command}} /// \brief\author Aaa @interface Test1 // expected-warning@+2 {{empty paragraph passed to '\brief' command}} /** * \brief\author Aaa * \param aaa Aaa * \param bbb Bbb */ + (NSString *)test1:(NSString *)aaa suffix:(NSString *)bbb; // expected-warning@+2 {{parameter 'aab' not found in the function declaration}} expected-note@+2 {{did you mean 'aaa'?}} /** * \param aab Aaa */ + (NSString *)test2:(NSString *)aaa; // expected-warning@+1 {{empty paragraph passed to '\brief' command}} /// \brief\author Aaa @property int test3; // a property: ObjCPropertyDecl // expected-warning@+1 {{empty paragraph passed to '\brief' command}} /// \brief\author Aaa @property int test4; // a property: ObjCPropertyDecl @end // expected-warning@+1 {{empty paragraph passed to '\brief' command}} /// \brief\author Aaa @interface Test1() @end // expected-warning@+1 {{empty paragraph passed to '\brief' command}} /// \brief\author Aaa @implementation Test1 // a class implementation : ObjCImplementationDecl + (NSString *)test1:(NSString *)aaa suffix:(NSString *)bbb { return 0; } + (NSString *)test2:(NSString *)aaa { return 0; } @synthesize test3; // a property implementation: ObjCPropertyImplDecl @dynamic test4; // a property implementation: ObjCPropertyImplDecl // expected-warning@+1 {{empty paragraph passed to '\brief' command}} /// \brief\author Aaa NSString *_test5; @end // expected-warning@+1 {{empty paragraph passed to '\brief' command}} /// \brief\author Aaa @interface Test1(Test1Category) // a category: ObjCCategoryDecl // expected-warning@+1 {{empty paragraph passed to '\brief' command}} /// \brief\author Aaa + (NSString *)test3:(NSString *)aaa; @end // expected-warning@+1 {{empty paragraph passed to '\brief' command}} /// \brief\author Aaa @implementation Test1(Test1Category) // a category implementation: ObjCCategoryImplDecl + (NSString *)test3:(NSString *)aaa { return 0; } @end // expected-warning@+1 {{empty paragraph passed to '\brief' command}} /// \brief\author Aaa @protocol TestProto1 // a protocol: ObjCProtocolDecl @end int a; // expected-warning@+1 {{empty paragraph passed to '\brief' command}} /// \brief\author Aaa @interface Test4 @end int b; @interface TestReturns1 /// \returns Aaa - (int)test1:(NSString *)aaa; // expected-warning@+1 {{'\returns' command used in a comment that is attached to a method returning void}} /// \returns Aaa - (void)test2:(NSString *)aaa; @end // expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'ccc'?}} /// \param aaa Meow. /// \param bbb Bbb. /// \returns aaa. typedef int (^test_param1)(int aaa, int ccc); // rdar://13094352 // expected-warning@+2 {{'@method' command should be used in a comment attached to an Objective-C method declaration}} @interface I /*! @method Base64EncodeEx */ typedef id ID; - (unsigned) Base64EncodeEx : (ID)Arg; @end // rdar://12379114 // expected-warning@+5 {{'@interface' command should not be used in a comment attached to a non-interface declaration}} // expected-warning@+5 {{'@classdesign' command should not be used in a comment attached to a non-container declaration}} // expected-warning@+5 {{'@coclass' command should not be used in a comment attached to a non-container declaration}} @interface NSObject @end /*! @interface IOCommandGate @classdesign Multiple paragraphs go here. @coclass myCoClass */ typedef id OBJ; @interface IOCommandGate : NSObject { OBJ iv; } @end // rdar://12379114 // expected-warning@+4 {{'@methodgroup' command should be used in a comment attached to an Objective-C method declaration}} // expected-warning@+6 {{'@method' command should be used in a comment attached to an Objective-C method declaratio}} @interface rdar12379114 /*! @methodgroup Creating a request */ /*! @method initWithTimeout is the 2nd method */ typedef unsigned int NSTimeInterval; - (id)initWithTimeout:(NSTimeInterval)timeout; @end // expected-warning@+2 {{'@protocol' command should not be used in a comment attached to a non-protocol declaration}} /*! @protocol PROTO */ struct S; /*! @interface NSArray This is an array */ @class NSArray; @interface NSArray @end // expected-warning@+3 {{unknown command tag name}} /*! @interface NSMutableArray @super NSArray */ @interface NSMutableArray : NSArray @end /*! @protocol MyProto */ @protocol MyProto @end // expected-warning@+2 {{'@protocol' command should not be used in a comment attached to a non-protocol declaration}} /*! @protocol MyProto */ @interface INTF @end // expected-warning@+2 {{'@struct' command should not be used in a comment attached to a non-struct declaration}} /*! @struct S1 THIS IS IT */ @interface S1 @end // expected-warning@+1 {{unknown command tag name}} /// \t bbb IS_DOXYGEN_END int FooBar(); // rdar://13836387 /** \brief Module handling the incoming notifications from the system. * * This includes: * - Network Reachability * - Power State * - Low Disk */ @interface BRC : NSObject - (void)removeReach:(NSObject*)observer; @end @implementation BRC : NSObject - (void)removeReach:(NSObject*)observer // expected-note {{previous declaration is here}} { } - (void)removeReach:(NSObject*)observer // expected-error {{duplicate declaration of method 'removeReach:'}} { } @end // rdar://13927330 /// @class Asset <- '@class' may be used in a comment attached to a an interface declaration @interface Asset : NSObject @end // rdar://14024851 Check that this does not enter an infinite loop @interface rdar14024851 -(void)meth; // expected-note {{declared here}} @end @implementation rdar14024851 // expected-warning {{method definition for 'meth' not found}} expected-note {{previous definition}} @end @implementation rdar14024851 // expected-error {{reimplementation}} /// \brief comment -(void)meth {} @end // rdar://14124644 @interface test_vararg1 /// @param[in] arg something /// @param[in] ... This is vararg - (void) VarArgMeth : (id)arg, ...; @end @implementation test_vararg1 /// @param[in] arg something /// @param[in] ... This is vararg - (void) VarArgMeth : (id)arg, ... {} @end /** * blockPointerVariable * * @param i is integer. * @returns integer. */ int (^blockPointerVariable)(int i); struct HasFields { /** * blockPointerField * * \param i is integer. * \returns integer. */ int (^blockPointerFields)(int i); }; // expected-warning@+5 {{'\returns' command used in a comment that is attached to a function returning void}} /** * functionPointerVariable * * \param p not here. * \returns integer. */ void (^_Nullable blockPointerVariableThatLeadsNowhere)(); @interface CheckFunctionBlockPointerVars { /** * functionPointerIVar * * @param i is integer. * @returns integer. */ int (*functionPointerIVar)(int i); /** * blockPointerIVar * * \param i is integer. * \returns integer. */ int (^blockPointerIVar)(int i); } /** * functionPointerProperty * * @param i is integer. * @returns integer. */ @property int (*functionPointerProperty)(int i); /** * blockPointerProperty * * \param i is integer. * \returns integer. */ @property int (^blockPointerProperty)(int i); /** * blockReturnsNothing * * \returns Nothing, but can allow this as this pattern is used to document the * value that the property getter returns. */ @property void (^blockReturnsNothing)(); @end /*! * Block typedef with variadic params. * * @param a * works * * @param ... * now should work too. */ typedef void (^VariadicBlockType)(int a, ...); // PR42844 - Assertion failures when using typedefed block pointers typedef void(^VoidBlockType)(); typedef VoidBlockType VoidBlockTypeCall(); VoidBlockTypeCall *d; ///< \return none // expected-warning@-1 {{'\return' command used in a comment that is not attached to a function or method declaration}} VoidBlockTypeCall ^e; ///< \return none // expected-warning@-1 {{'\return' command used in a comment that is not attached to a function or method declaration}} #ifdef __cplusplus @interface HasAnonNamespace @end @implementation HasAnonNamespace namespace {} @end #endif