In r176401. - Fariborz
On Mar 1, 2013, at 4:29 PM, Dmitri Gribenko <[email protected]> wrote: > > > On Saturday, March 2, 2013, Fariborz Jahanian wrote: > Author: fjahanian > Date: Fri Mar 1 16:51:30 2013 > New Revision: 176387 > > URL: http://llvm.org/viewvc/llvm-project?rev=176387&view=rev > Log: > comment parsing. Keep the original command format > in AST for source fidelity and use it in diagnostics > to refer to the original format. // rdar://13066276 > > Modified: > cfe/trunk/include/clang/AST/Comment.h > cfe/trunk/include/clang/AST/CommentLexer.h > cfe/trunk/include/clang/Basic/DiagnosticCommentKinds.td > cfe/trunk/lib/AST/CommentLexer.cpp > cfe/trunk/lib/AST/CommentParser.cpp > cfe/trunk/lib/AST/CommentSema.cpp > cfe/trunk/test/Sema/warn-documentation.cpp > > Modified: cfe/trunk/include/clang/AST/Comment.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Comment.h?rev=176387&r1=176386&r2=176387&view=diff > ============================================================================== > --- cfe/trunk/include/clang/AST/Comment.h (original) > +++ cfe/trunk/include/clang/AST/Comment.h Fri Mar 1 16:51:30 2013 > @@ -570,13 +570,16 @@ protected: > > /// Paragraph argument. > ParagraphComment *Paragraph; > - > + > + /// Header Doc command, if true > + bool HDCommand; > + > BlockCommandComment(CommentKind K, > SourceLocation LocBegin, > SourceLocation LocEnd, > unsigned CommandID) : > BlockContentComment(K, LocBegin, LocEnd), > - Paragraph(NULL) { > + Paragraph(NULL), HDCommand(false) { > setLocation(getCommandNameBeginLoc()); > BlockCommandCommentBits.CommandID = CommandID; > } > @@ -586,7 +589,7 @@ public: > SourceLocation LocEnd, > unsigned CommandID) : > BlockContentComment(BlockCommandCommentKind, LocBegin, LocEnd), > - Paragraph(NULL) { > + Paragraph(NULL), HDCommand(false) { > setLocation(getCommandNameBeginLoc()); > BlockCommandCommentBits.CommandID = CommandID; > } > @@ -657,6 +660,14 @@ public: > if (NewLocEnd.isValid()) > setSourceRange(SourceRange(getLocStart(), NewLocEnd)); > } > + > + bool getHDCommand() const LLVM_READONLY { > + return HDCommand; > + } > + > + void setHDCommand(bool HDC) { > + HDCommand = HDC; > + } > }; > > /// Doxygen \\param command. > > Modified: cfe/trunk/include/clang/AST/CommentLexer.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/CommentLexer.h?rev=176387&r1=176386&r2=176387&view=diff > ============================================================================== > --- cfe/trunk/include/clang/AST/CommentLexer.h (original) > +++ cfe/trunk/include/clang/AST/CommentLexer.h Fri Mar 1 16:51:30 2013 > @@ -75,6 +75,9 @@ class Token { > /// unused (command spelling can be found with CommandTraits). Otherwise, > /// contains the length of the string that starts at TextPtr. > unsigned IntVal; > + > + /// This command is a Header Doc command (command starts with '@'). > + bool HDCommand; > > This is unfortunate that we increase sizeof Token. We use Token as a value > type that should be cheap to copy. I think we could carry this information > in the token kind, by defining 'backslash command' and 'at command' tokens. > > > public: > SourceLocation getLocation() const LLVM_READONLY { return Loc; } > @@ -122,6 +125,10 @@ public: > return IntVal; > } > > + bool getHDCommand() const LLVM_READONLY { > + return HDCommand; > + } > + > void setCommandID(unsigned ID) { > assert(is(tok::command)); > IntVal = ID; > > Modified: cfe/trunk/include/clang/Basic/DiagnosticCommentKinds.td > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticCommentKinds.td?rev=176387&r1=176386&r2=176387&view=diff > ============================================================================== > --- cfe/trunk/include/clang/Basic/DiagnosticCommentKinds.td (original) > +++ cfe/trunk/include/clang/Basic/DiagnosticCommentKinds.td Fri Mar 1 > 16:51:30 2013 > @@ -44,18 +44,18 @@ def note_doc_html_end_tag : Note< > // Commands > > def warn_doc_block_command_empty_paragraph : Warning< > - "empty paragraph passed to '\\%0' command">, > + "empty paragraph passed to '%select{\\|@}0%1' command">, > InGroup<Documentation>, DefaultIgnore; > > def warn_doc_block_command_duplicate : Warning< > - "duplicated command '\\%0'">, > + "duplicated command '%select{\\|@}0%1'">, > InGroup<Documentation>, DefaultIgnore; > > def note_doc_block_command_previous : Note< > - "previous command '\\%0' here">; > + "previous command '%select{\\|@}0%1' here">; > > def note_doc_block_command_previous_alias : Note< > - "previous command '\\%0' (an alias of '\\%1') here">; > + "previous command '%select{\\|@}0%1' (an alias of '\\%2') here">; > > // \param command > > @@ -111,14 +111,14 @@ def note_doc_tparam_name_suggestion : No > // \returns command > > def warn_doc_returns_not_attached_to_a_function_decl : Warning< > - "'\\%0' command used in a comment that is not attached to " > + "'%select{\\|@}0%1' command used in a comment that is not attached to " > "a function or method declaration">, > InGroup<Documentation>, DefaultIgnore; > > def warn_doc_returns_attached_to_a_void_function : Warning< > - "'\\%0' command used in a comment that is attached to a " > + "'%select{\\|@}0%1' command used in a comment that is attached to a " > "%select{function returning void|constructor|destructor|" > - "method returning void}1">, > + "method returning void}2">, > InGroup<Documentation>, DefaultIgnore; > > // \deprecated command > @@ -134,7 +134,7 @@ def note_add_deprecation_attr : Note< > // verbatim block commands > > def warn_verbatim_block_end_without_start : Warning< > - "'\\%0' command does not terminate a verbatim text block">, > + "'%select{\\|@}0%1' command does not terminate a verbatim text block">, > InGroup<Documentation>, DefaultIgnore; > > } // end of documentation issue category > > Modified: cfe/trunk/lib/AST/CommentLexer.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/CommentLexer.cpp?rev=176387&r1=176386&r2=176387&view=diff > ============================================================================== > --- cfe/trunk/lib/AST/CommentLexer.cpp (original) > +++ cfe/trunk/lib/AST/CommentLexer.cpp Fri Mar 1 16:51:30 2013 > @@ -298,6 +298,7 @@ void Lexer::lexCommentText(Token &T) { > switch(*TokenPtr) { > case '\\': > case '@': { > + T.HDCommand = (*TokenPtr == '@'); > TokenPtr++; > if (TokenPtr == CommentEnd) { > formTextToken(T, TokenPtr); > > Modified: cfe/trunk/lib/AST/CommentParser.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/CommentParser.cpp?rev=176387&r1=176386&r2=176387&view=diff > ============================================================================== > --- cfe/trunk/lib/AST/CommentParser.cpp (original) > +++ cfe/trunk/lib/AST/CommentParser.cpp Fri Mar 1 16:51:30 2013 > @@ -313,15 +313,18 @@ BlockCommandComment *Parser::parseBlockC > PC = S.actOnParamCommandStart(Tok.getLocation(), > Tok.getEndLocation(), > Tok.getCommandID()); > + PC->setHDCommand(Tok.getHDCommand()); > > This kind of fixups that are done after AST node is created is fragile -- we > could forget to insert a fixup in a new place where we create ASTnodes. This > flag (or an enum?!) should be an argument for the onstructor. > > Dmitri > > } else if (Info->IsTParamCommand) { > IsTParam = true; > TPC = S.actOnTParamCommandStart(Tok.getLocation(), > Tok.getEndLocation(), > Tok.getCommandID()); > + TPC->setHDCommand(Tok.getHDCommand()); > } else { > BC = S.actOnBlockCommandStart(Tok.getLocation(), > Tok.getEndLocation(), > Tok.getCommandID()); > + BC->setHDCommand(Tok.getHDCommand()); > } > consumeToken(); > > @@ -569,6 +572,7 @@ BlockContentComment *Parser::parseParagr > if (Info->IsVerbatimBlockEndCommand) { > Diag(Tok.getLocation(), > diag::warn_verbatim_block_end_without_start) > + << Tok.getHDCommand() > << Info->Name > << SourceRange(Tok.getLocation(), Tok.getEndLocation()); > consumeToken(); > > Modified: cfe/trunk/lib/AST/CommentSema.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/CommentSema.cpp?rev=176387&r1=176386&r2=176387&view=diff > ============================================================================== > --- cfe/trunk/lib/AST/CommentSema.cpp (original) > +++ cfe/trunk/lib/AST/CommentSema.cpp Fri Mar 1 16:51:30 2013 > @@ -432,6 +432,7 @@ void Sema::checkBlockCommandEmptyParagra > if (!DiagLoc.isValid()) > DiagLoc = Command->getCommandNameRange(Traits).getEnd(); > Diag(DiagLoc, diag::warn_doc_block_command_empty_paragraph) > + << Command->getHDCommand() > << Command->getCommandName(Traits) > << Command->getSourceRange(); > } > @@ -459,6 +460,7 @@ void Sema::checkReturnsCommand(const Blo > } > Diag(Command->getLocation(), > diag::warn_doc_returns_attached_to_a_void_function) > + << Command->getHDCommand() > << Command->getCommandName(Traits) > << DiagKind > << Command->getSourceRange(); > @@ -470,6 +472,7 @@ void Sema::checkReturnsCommand(const Blo > > Diag(Command->getLocation(), > diag::warn_doc_returns_not_attached_to_a_function_decl) > + << Command->getHDCommand() > << Command->getCommandName(Traits) > << Command->getSourceRange(); > } > @@ -502,15 +505,18 @@ void Sema::checkBlockCommandDuplicate(co > StringRef CommandName = Command->getCommandName(Traits); > StringRef PrevCommandName = PrevCommand->getCommandName(Traits); > Diag(Command->getLocation(), diag::warn_doc_block_command_duplicate) > + << Command->getHDCommand() > << CommandName > << Command->getSourceRange(); > if (CommandName == PrevCommandName) > Diag(PrevCommand->getLocation(), diag::note_doc_block_command_previous) > + << PrevCommand->getHDCommand() > << PrevCommandName > << PrevCommand->getSourceRange(); > else > Diag(PrevCommand->getLocation(), > diag::note_doc_block_command_previous_alias) > + << PrevCommand->getHDCommand() > << PrevCommandName > << CommandName; > } > > Modified: cfe/trunk/test/Sema/warn-documentation.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/warn-documentation.cpp?rev=176387&r1=176386&r2=176387&view=diff > ============================================================================== > --- cfe/trunk/test/Sema/warn-documentation.cpp (original) > +++ cfe/trunk/test/Sema/warn-documentation.cpp Fri Mar 1 16:51:30 2013 > @@ -862,28 +862,28 @@ int test_nocrash9; > > // We used to crash on this. PR15068 > > -// expected-warning@+2 {{empty paragraph passed to '\param' command}} > -// expected-warning@+2 {{empty paragraph passed to '\param' command}} > +// expected-warning@+2 {{empty paragraph passed to '@param' command}} > +// expected-warning@+2 {{empty paragraph passed to '@param' command}} > ///@param x > ///@param y > int test_nocrash10(int x, int y); > > -// expected-warning@+2 {{empty paragraph passed to '\param' command}} > expected-warning@+2 {{parameter 'x' not found in the function declaration}} > -// expected-warning@+2 {{empty paragraph passed to '\param' command}} > expected-warning@+2 {{parameter 'y' not found in the function declaration}} > +// expected-warning@+2 {{empty paragraph passed to '@param' command}} > expected-warning@+2 {{parameter 'x' not found in the function declaration}} > +// expected-warning@+2 {{empty paragraph passed to '@param' command}} > expected-warning@+2 {{parameter 'y' not found in the function declaration}} > ///@param x > ///@param y > int test_nocrash11(); > > -// expected-warning@+3 {{empty paragraph passed to '\param' command}} > expected-warning@+3 {{parameter 'x' not found in the function declaration}} > -// expected-warning@+3 {{empty paragraph passed to '\param' command}} > expected-warning@+3 {{parameter 'y' not found in the function declaration}} > +// expected-warning@+3 {{empty paragraph passed to '@param' command}} > expected-warning@+3 {{parameter 'x' not found in the function declaration}} > +// expected-warning@+3 {{empty paragraph passed to '@param' command}} > expected-warning@+3 {{parameter 'y' not found in the function declaration}} > /** > @param x > @param y > **/ > int test_nocrash12(); > > -// expected-warning@+2 {{empty paragraph passed to '\param' command}} > -// expected-warning@+1 {{empty paragraph passed to '\param' command}} > +// expected-warning@+2 {{empty paragraph passed to '@param' command}} > +// expected-warning@+1 {{empty paragraph passed to '@param' command}} > ///@param x@param y > int test_nocrash13(int x, int y); > > @@ -895,3 +895,15 @@ int test_nocrash13(int x, int y); > /// \headerfile foo.h > int test_duplicate_headerfile1(int); > > + > +// rdar://13066276 > +// expected-warning@+1 {{'@return' command used in a comment that is not > attached to a function or method declaration}} > +/** @return s */ > +struct s* f(void); > +struct s; > + > +// expected-warning@+1 {{'\return' command used in a comment that is not > attached to a function or method declaration}} > +/** \return s */ > +struct q* g(void); > +struct q; > + > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits > > > -- > main(i,j){for(i=2;;i++){for(j=2;j<i;j++){if(!(i%j)){j=0;break;}}if > (j){printf("%d\n",i);}}} /*Dmitri Gribenko <[email protected]>*/
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
