I think originally it was so that we don't reparse files that have been opened twice (like a file that #includes itself). I'm not sure it's still necessary, though; it seems like (!E || FilesParsedForDirectives.count(E) || HS.findModuleForHeader(E)) would work just as well. Andy?
That said, what is cling using this for? I wouldn't expect people to type comments into cling just for the purposes of -verify. Jordan On Aug 10, 2012, at 6:08 AM, Vassil Vassilev <[email protected]> wrote: > Hi, > If I understand correctly: > > + if (E && (FilesParsedForDirectives.count(E) > + || HS.findModuleForHeader(E))) > + continue; > > This doesn't handle the case where the files come from memory buffers and > have only FileIDs. It breaks cling's use case. > Is there any reason for caching FileEntry * rather than FileIDs (typedef > llvm::SmallPtrSet<const FileEntry *, 4> FilesWithDirectivesSet;) > > Vassil > > On 08/10/2012 03:06 AM, Jordan Rose wrote: >> Author: jrose >> Date: Thu Aug 9 20:06:16 2012 >> New Revision: 161650 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=161650&view=rev >> Log: >> Update VerifyDiagnosticConsumer to only get directives during parsing. >> >> The old behavior was to re-scan any files (like modules) where we may have >> directives but won't actually be parsing during the -verify invocation. >> Now, we keep the old behavior in Debug builds as a sanity check (though >> modules are a known entity), and expect all legitimate directives to come >> from comments seen by the preprocessor. >> >> This also affects the ARC migration tool, which captures diagnostics in >> order to filter some out. This change adds an explicit cleanup to >> CaptureDiagnosticsConsumer in order to let its sub-consumer handle the >> real end of diagnostics. >> >> This was originally split into four patches, but the tests do not run >> cleanly without all four, so I've combined them into one commit. >> >> Patches by Andy Gibbs, with slight modifications from me. >> >> Added: >> cfe/trunk/test/ARCMT/verify.m >> cfe/trunk/test/Frontend/verify2.c >> cfe/trunk/test/Frontend/verify2.h >> Modified: >> cfe/trunk/include/clang/Frontend/VerifyDiagnosticConsumer.h >> cfe/trunk/lib/ARCMigrate/ARCMT.cpp >> cfe/trunk/lib/Frontend/VerifyDiagnosticConsumer.cpp >> cfe/trunk/test/ASTMerge/function.c >> cfe/trunk/test/Frontend/verify.c >> cfe/trunk/test/Modules/Inputs/category_right.h >> cfe/trunk/test/Modules/lookup.cpp >> cfe/trunk/test/Modules/objc-categories.m >> >> Modified: cfe/trunk/include/clang/Frontend/VerifyDiagnosticConsumer.h >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/VerifyDiagnosticConsumer.h?rev=161650&r1=161649&r2=161650&view=diff >> ============================================================================== >> --- cfe/trunk/include/clang/Frontend/VerifyDiagnosticConsumer.h (original) >> +++ cfe/trunk/include/clang/Frontend/VerifyDiagnosticConsumer.h Thu Aug 9 >> 20:06:16 2012 >> @@ -166,17 +166,22 @@ >> } >> }; >> -private: >> +#ifndef NDEBUG >> typedef llvm::DenseSet<FileID> FilesWithDiagnosticsSet; >> - typedef llvm::SmallPtrSet<const FileEntry *, 4> FilesWithDirectivesSet; >> + typedef llvm::SmallPtrSet<const FileEntry *, 4> >> FilesParsedForDirectivesSet; >> +#endif >> +private: >> DiagnosticsEngine &Diags; >> DiagnosticConsumer *PrimaryClient; >> bool OwnsPrimaryClient; >> OwningPtr<TextDiagnosticBuffer> Buffer; >> const Preprocessor *CurrentPreprocessor; >> + unsigned ActiveSourceFiles; >> +#ifndef NDEBUG >> FilesWithDiagnosticsSet FilesWithDiagnostics; >> - FilesWithDirectivesSet FilesWithDirectives; >> + FilesParsedForDirectivesSet FilesParsedForDirectives; >> +#endif >> ExpectedData ED; >> void CheckDiagnostics(); >> @@ -192,6 +197,13 @@ >> virtual void EndSourceFile(); >> + /// \brief Manually register a file as parsed. >> + inline void appendParsedFile(const FileEntry *File) { >> +#ifndef NDEBUG >> + FilesParsedForDirectives.insert(File); >> +#endif >> + } >> + >> virtual bool HandleComment(Preprocessor &PP, SourceRange Comment); >> virtual void HandleDiagnostic(DiagnosticsEngine::Level DiagLevel, >> >> Modified: cfe/trunk/lib/ARCMigrate/ARCMT.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/ARCMigrate/ARCMT.cpp?rev=161650&r1=161649&r2=161650&view=diff >> ============================================================================== >> --- cfe/trunk/lib/ARCMigrate/ARCMT.cpp (original) >> +++ cfe/trunk/lib/ARCMigrate/ARCMT.cpp Thu Aug 9 20:06:16 2012 >> @@ -91,11 +91,40 @@ >> class CaptureDiagnosticConsumer : public DiagnosticConsumer { >> DiagnosticsEngine &Diags; >> + DiagnosticConsumer &DiagClient; >> CapturedDiagList &CapturedDiags; >> + bool HasBegunSourceFile; >> public: >> CaptureDiagnosticConsumer(DiagnosticsEngine &diags, >> - CapturedDiagList &capturedDiags) >> - : Diags(diags), CapturedDiags(capturedDiags) { } >> + DiagnosticConsumer &client, >> + CapturedDiagList &capturedDiags) >> + : Diags(diags), DiagClient(client), CapturedDiags(capturedDiags), >> + HasBegunSourceFile(false) { } >> + >> + virtual void BeginSourceFile(const LangOptions &Opts, >> + const Preprocessor *PP) { >> + // Pass BeginSourceFile message onto DiagClient on first call. >> + // The corresponding EndSourceFile call will be made from an >> + // explicit call to FinishCapture. >> + if (!HasBegunSourceFile) { >> + DiagClient.BeginSourceFile(Opts, PP); >> + HasBegunSourceFile = true; >> + } >> + } >> + >> + void FinishCapture() { >> + // Call EndSourceFile on DiagClient on completion of capture to >> + // enable VerifyDiagnosticConsumer to check diagnostics *after* >> + // it has received the diagnostic list. >> + if (HasBegunSourceFile) { >> + DiagClient.EndSourceFile(); >> + HasBegunSourceFile = false; >> + } >> + } >> + >> + virtual ~CaptureDiagnosticConsumer() { >> + assert(!HasBegunSourceFile && "FinishCapture not called!"); >> + } >> virtual void HandleDiagnostic(DiagnosticsEngine::Level level, >> const Diagnostic &Info) { >> @@ -260,13 +289,15 @@ >> new DiagnosticsEngine(DiagID, DiagClient, /*ShouldOwnClient=*/false)); >> // Filter of all diagnostics. >> - CaptureDiagnosticConsumer errRec(*Diags, capturedDiags); >> + CaptureDiagnosticConsumer errRec(*Diags, *DiagClient, capturedDiags); >> Diags->setClient(&errRec, /*ShouldOwnClient=*/false); >> OwningPtr<ASTUnit> Unit( >> ASTUnit::LoadFromCompilerInvocationAction(CInvok.take(), Diags)); >> - if (!Unit) >> + if (!Unit) { >> + errRec.FinishCapture(); >> return true; >> + } >> // Don't filter diagnostics anymore. >> Diags->setClient(DiagClient, /*ShouldOwnClient=*/false); >> @@ -278,6 +309,7 @@ >> DiagClient->BeginSourceFile(Ctx.getLangOpts(), >> &Unit->getPreprocessor()); >> capturedDiags.reportDiagnostics(*Diags); >> DiagClient->EndSourceFile(); >> + errRec.FinishCapture(); >> return true; >> } >> @@ -315,6 +347,7 @@ >> capturedDiags.reportDiagnostics(*Diags); >> DiagClient->EndSourceFile(); >> + errRec.FinishCapture(); >> // If we are migrating code that gets the '-fobjc-arc' flag, make sure >> // to remove it so that we don't get errors from normal compilation. >> @@ -563,7 +596,7 @@ >> new DiagnosticsEngine(DiagID, DiagClient, /*ShouldOwnClient=*/false)); >> // Filter of all diagnostics. >> - CaptureDiagnosticConsumer errRec(*Diags, capturedDiags); >> + CaptureDiagnosticConsumer errRec(*Diags, *DiagClient, capturedDiags); >> Diags->setClient(&errRec, /*ShouldOwnClient=*/false); >> OwningPtr<ARCMTMacroTrackerAction> ASTAction; >> @@ -572,8 +605,10 @@ >> OwningPtr<ASTUnit> Unit( >> ASTUnit::LoadFromCompilerInvocationAction(CInvok.take(), Diags, >> ASTAction.get())); >> - if (!Unit) >> + if (!Unit) { >> + errRec.FinishCapture(); >> return true; >> + } >> Unit->setOwnsRemappedFileBuffers(false); // FileRemapper manages that. >> // Don't filter diagnostics anymore. >> @@ -586,6 +621,7 @@ >> DiagClient->BeginSourceFile(Ctx.getLangOpts(), >> &Unit->getPreprocessor()); >> capturedDiags.reportDiagnostics(*Diags); >> DiagClient->EndSourceFile(); >> + errRec.FinishCapture(); >> return true; >> } >> @@ -609,6 +645,7 @@ >> } >> DiagClient->EndSourceFile(); >> + errRec.FinishCapture(); >> if (DiagClient->getNumErrors()) >> return true; >> >> Modified: cfe/trunk/lib/Frontend/VerifyDiagnosticConsumer.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/VerifyDiagnosticConsumer.cpp?rev=161650&r1=161649&r2=161650&view=diff >> ============================================================================== >> --- cfe/trunk/lib/Frontend/VerifyDiagnosticConsumer.cpp (original) >> +++ cfe/trunk/lib/Frontend/VerifyDiagnosticConsumer.cpp Thu Aug 9 20:06:16 >> 2012 >> @@ -15,6 +15,7 @@ >> #include "clang/Frontend/VerifyDiagnosticConsumer.h" >> #include "clang/Frontend/FrontendDiagnostic.h" >> #include "clang/Frontend/TextDiagnosticBuffer.h" >> +#include "clang/Lex/HeaderSearch.h" >> #include "clang/Lex/Preprocessor.h" >> #include "llvm/ADT/SmallString.h" >> #include "llvm/Support/Regex.h" >> @@ -26,46 +27,91 @@ >> typedef VerifyDiagnosticConsumer::ExpectedData ExpectedData; >> VerifyDiagnosticConsumer::VerifyDiagnosticConsumer(DiagnosticsEngine >> &_Diags) >> - : Diags(_Diags), PrimaryClient(Diags.getClient()), >> - OwnsPrimaryClient(Diags.ownsClient()), >> - Buffer(new TextDiagnosticBuffer()), CurrentPreprocessor(0) >> + : Diags(_Diags), >> + PrimaryClient(Diags.getClient()), OwnsPrimaryClient(Diags.ownsClient()), >> + Buffer(new TextDiagnosticBuffer()), CurrentPreprocessor(0), >> + ActiveSourceFiles(0) >> { >> Diags.takeClient(); >> } >> VerifyDiagnosticConsumer::~VerifyDiagnosticConsumer() { >> + assert(!ActiveSourceFiles && "Incomplete parsing of source files!"); >> + assert(!CurrentPreprocessor && "CurrentPreprocessor should be invalid!"); >> CheckDiagnostics(); >> Diags.takeClient(); >> if (OwnsPrimaryClient) >> delete PrimaryClient; >> } >> +#ifndef NDEBUG >> +namespace { >> +class VerifyFileTracker : public PPCallbacks { >> + typedef VerifyDiagnosticConsumer::FilesParsedForDirectivesSet ListType; >> + ListType &FilesList; >> + SourceManager &SM; >> + >> +public: >> + VerifyFileTracker(ListType &FilesList, SourceManager &SM) >> + : FilesList(FilesList), SM(SM) { } >> + >> + /// \brief Hook into the preprocessor and update the list of parsed >> + /// files when the preprocessor indicates a new file is entered. >> + virtual void FileChanged(SourceLocation Loc, FileChangeReason Reason, >> + SrcMgr::CharacteristicKind FileType, >> + FileID PrevFID) { >> + if (const FileEntry *E = SM.getFileEntryForID(SM.getFileID(Loc))) >> + FilesList.insert(E); >> + } >> +}; >> +} // End anonymous namespace. >> +#endif >> + >> // DiagnosticConsumer interface. >> void VerifyDiagnosticConsumer::BeginSourceFile(const LangOptions >> &LangOpts, >> const Preprocessor *PP) { >> - CurrentPreprocessor = PP; >> - if (PP) const_cast<Preprocessor*>(PP)->addCommentHandler(this); >> + // Attach comment handler on first invocation. >> + if (++ActiveSourceFiles == 1) { >> + if (PP) { >> + CurrentPreprocessor = PP; >> + const_cast<Preprocessor*>(PP)->addCommentHandler(this); >> +#ifndef NDEBUG >> + VerifyFileTracker *V = new VerifyFileTracker(FilesParsedForDirectives, >> + PP->getSourceManager()); >> + const_cast<Preprocessor*>(PP)->addPPCallbacks(V); >> +#endif >> + } >> + } >> + assert((!PP || CurrentPreprocessor == PP) && "Preprocessor changed!"); >> PrimaryClient->BeginSourceFile(LangOpts, PP); >> } >> void VerifyDiagnosticConsumer::EndSourceFile() { >> - if (CurrentPreprocessor) >> - >> const_cast<Preprocessor*>(CurrentPreprocessor)->removeCommentHandler(this); >> - CheckDiagnostics(); >> - >> + assert(ActiveSourceFiles && "No active source files!"); >> PrimaryClient->EndSourceFile(); >> - CurrentPreprocessor = 0; >> + // Detach comment handler once last active source file completed. >> + if (--ActiveSourceFiles == 0) { >> + if (CurrentPreprocessor) >> + >> const_cast<Preprocessor*>(CurrentPreprocessor)->removeCommentHandler(this); >> + >> + // Check diagnostics once last file completed. >> + CheckDiagnostics(); >> + CurrentPreprocessor = 0; >> + } >> } >> void VerifyDiagnosticConsumer::HandleDiagnostic( >> DiagnosticsEngine::Level DiagLevel, const Diagnostic &Info) { >> +#ifndef NDEBUG >> if (Info.hasSourceManager()) { >> - const SourceManager &SM = Info.getSourceManager(); >> - FilesWithDiagnostics.insert(SM.getFileID(Info.getLocation())); >> + FileID FID = Info.getSourceManager().getFileID(Info.getLocation()); >> + if (!FID.isInvalid()) >> + FilesWithDiagnostics.insert(FID); >> } >> +#endif >> // Send the diagnostic to the buffer, we will check it once we reach the >> end >> // of the source file (or are destructed). >> Buffer->HandleDiagnostic(DiagLevel, Info); >> @@ -192,7 +238,7 @@ >> /// diagnostics. If so, then put them in the appropriate directive list. >> /// >> /// Returns true if any valid directives were found. >> -static bool ParseDirective(StringRef S, ExpectedData &ED, SourceManager &SM, >> +static bool ParseDirective(StringRef S, ExpectedData *ED, SourceManager &SM, >> SourceLocation Pos, DiagnosticsEngine &Diags) { >> // A single comment may contain multiple directives. >> bool FoundDirective = false; >> @@ -210,15 +256,20 @@ >> // Next token: { error | warning | note } >> DirectiveList* DL = NULL; >> if (PH.Next("error")) >> - DL = &ED.Errors; >> + DL = ED ? &ED->Errors : NULL; >> else if (PH.Next("warning")) >> - DL = &ED.Warnings; >> + DL = ED ? &ED->Warnings : NULL; >> else if (PH.Next("note")) >> - DL = &ED.Notes; >> + DL = ED ? &ED->Notes : NULL; >> else >> continue; >> PH.Advance(); >> + // If a directive has been found but we're not interested >> + // in storing the directive information, return now. >> + if (!DL) >> + return true; >> + >> // Default directive kind. >> bool RegexKind = false; >> const char* KindStr = "string"; >> @@ -360,9 +411,7 @@ >> // Fold any "\<EOL>" sequences >> size_t loc = C.find('\\'); >> if (loc == StringRef::npos) { >> - if (ParseDirective(C, ED, SM, CommentBegin, PP.getDiagnostics())) >> - if (const FileEntry *E = >> SM.getFileEntryForID(SM.getFileID(CommentBegin))) >> - FilesWithDirectives.insert(E); >> + ParseDirective(C, &ED, SM, CommentBegin, PP.getDiagnostics()); >> return false; >> } >> @@ -392,19 +441,20 @@ >> } >> if (!C2.empty()) >> - if (ParseDirective(C2, ED, SM, CommentBegin, PP.getDiagnostics())) >> - if (const FileEntry *E = >> SM.getFileEntryForID(SM.getFileID(CommentBegin))) >> - FilesWithDirectives.insert(E); >> + ParseDirective(C2, &ED, SM, CommentBegin, PP.getDiagnostics()); >> return false; >> } >> -/// FindExpectedDiags - Lex the main source file to find all of the >> -// expected errors and warnings. >> -static void FindExpectedDiags(const Preprocessor &PP, ExpectedData &ED, >> - FileID FID) { >> +#ifndef NDEBUG >> +/// \brief Lex the specified source file to determine whether it contains >> +/// any expected-* directives. As a Lexer is used rather than a full-blown >> +/// Preprocessor, directives inside skipped #if blocks will still be found. >> +/// >> +/// \return true if any directives were found. >> +static bool findDirectives(const Preprocessor &PP, FileID FID) { >> // Create a raw lexer to pull all the comments out of FID. >> if (FID.isInvalid()) >> - return; >> + return false; >> SourceManager& SM = PP.getSourceManager(); >> // Create a lexer to lex all the tokens of the main file in raw mode. >> @@ -416,6 +466,7 @@ >> Token Tok; >> Tok.setKind(tok::comment); >> + bool Found = false; >> while (Tok.isNot(tok::eof)) { >> RawLex.Lex(Tok); >> if (!Tok.is(tok::comment)) continue; >> @@ -424,9 +475,12 @@ >> if (Comment.empty()) continue; >> // Find all expected errors/warnings/notes. >> - ParseDirective(Comment, ED, SM, Tok.getLocation(), PP.getDiagnostics()); >> - }; >> + Found |= ParseDirective(Comment, 0, SM, Tok.getLocation(), >> + PP.getDiagnostics()); >> + } >> + return Found; >> } >> +#endif // !NDEBUG >> /// \brief Takes a list of diagnostics that have been generated but not >> matched >> /// by an expected-* directive and produces a diagnostic to the user from >> this. >> @@ -556,22 +610,28 @@ >> // markers. If not then any diagnostics are unexpected. >> if (CurrentPreprocessor) { >> SourceManager &SM = CurrentPreprocessor->getSourceManager(); >> - // Only check for expectations in other diagnostic locations not >> - // captured during normal parsing. >> - // FIXME: This check is currently necessary while synthesized files may >> - // not have their expected-* directives captured during parsing. These >> - // cases should be fixed and the following loop replaced with one which >> - // checks only during a debug build and asserts on a mismatch. >> + >> +#ifndef NDEBUG >> + // In a debug build, scan through any files that may have been missed >> + // during parsing and issue a fatal error if directives are contained >> + // within these files. If a fatal error occurs, this suggests that >> + // this file is being parsed separately from the main file. >> + HeaderSearch &HS = CurrentPreprocessor->getHeaderSearchInfo(); >> for (FilesWithDiagnosticsSet::iterator I = FilesWithDiagnostics.begin(), >> End = FilesWithDiagnostics.end(); >> I != End; ++I) { >> const FileEntry *E = SM.getFileEntryForID(*I); >> - if (!E || !FilesWithDirectives.count(E)) { >> - if (E) >> - FilesWithDirectives.insert(E); >> - FindExpectedDiags(*CurrentPreprocessor, ED, *I); >> - } >> + // Don't check files already parsed or those handled as modules. >> + if (E && (FilesParsedForDirectives.count(E) >> + || HS.findModuleForHeader(E))) >> + continue; >> + >> + if (findDirectives(*CurrentPreprocessor, *I)) >> + llvm::report_fatal_error(Twine("-verify directives found after >> rather" >> + " than during normal parsing of ", >> + StringRef(E ? E->getName() : >> "(unknown)"))); >> } >> +#endif >> // Check that the expected diagnostics occurred. >> NumErrors += CheckResults(Diags, SM, *Buffer, ED); >> >> Added: cfe/trunk/test/ARCMT/verify.m >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ARCMT/verify.m?rev=161650&view=auto >> ============================================================================== >> --- cfe/trunk/test/ARCMT/verify.m (added) >> +++ cfe/trunk/test/ARCMT/verify.m Thu Aug 9 20:06:16 2012 >> @@ -0,0 +1,13 @@ >> +// RUN: %clang_cc1 -arcmt-check -verify %s >> +// RUN: %clang_cc1 -arcmt-check -verify %t.invalid 2>&1 | FileCheck %s >> + >> +#if 0 >> +// expected-error {{should be ignored}} >> +#endif >> + >> +#error should not be ignored >> +// expected-error@-1 {{should not be ignored}} >> + >> +// CHECK: error: 'error' diagnostics seen but not expected: >> +// CHECK-NEXT: (frontend): error reading '{{.*}}verify.m.tmp.invalid' >> +// CHECK-NEXT: 1 error generated. >> >> Modified: cfe/trunk/test/ASTMerge/function.c >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ASTMerge/function.c?rev=161650&r1=161649&r2=161650&view=diff >> ============================================================================== >> --- cfe/trunk/test/ASTMerge/function.c (original) >> +++ cfe/trunk/test/ASTMerge/function.c Thu Aug 9 20:06:16 2012 >> @@ -1,9 +1,15 @@ >> // RUN: %clang_cc1 -emit-pch -o %t.1.ast %S/Inputs/function1.c >> // RUN: %clang_cc1 -emit-pch -o %t.2.ast %S/Inputs/function2.c >> // RUN: %clang_cc1 -ast-merge %t.1.ast -ast-merge %t.2.ast -fsyntax-only %s >> 2>&1 | FileCheck %s >> +// RUN: %clang_cc1 -ast-merge %t.1.ast -ast-merge %t.2.ast -fsyntax-only >> -verify %s >> // CHECK: function2.c:3:6: error: external function 'f1' declared with >> incompatible types in different translation units ('void (Int, double)' vs. >> 'void (int, float)') >> // CHECK: function1.c:2:6: note: declared here with type 'void (int, float)' >> // CHECK: function2.c:5:6: error: external function 'f3' declared with >> incompatible types in different translation units ('void (int)' vs. 'void >> (void)') >> // CHECK: function1.c:4:6: note: declared here with type 'void (void)' >> // CHECK: 2 errors generated >> + >> +// expected-error@3 {{external function 'f1' declared with incompatible >> types}} >> +// expected-note@2 {{declared here}} >> +// expected-error@5 {{external function 'f3' declared with incompatible >> types}} >> +// expected-note@4 {{declared here}} >> >> Modified: cfe/trunk/test/Frontend/verify.c >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Frontend/verify.c?rev=161650&r1=161649&r2=161650&view=diff >> ============================================================================== >> --- cfe/trunk/test/Frontend/verify.c (original) >> +++ cfe/trunk/test/Frontend/verify.c Thu Aug 9 20:06:16 2012 >> @@ -108,3 +108,18 @@ >> // CHECK5-NEXT: 2 errors generated. >> #endif >> +#if 0 >> +// RUN: %clang_cc1 -verify %t.invalid 2>&1 | FileCheck -check-prefix=CHECK6 >> %s >> + >> +// CHECK6: error: 'error' diagnostics seen but not expected: >> +// CHECK6-NEXT: (frontend): error reading '{{.*}}verify.c.tmp.invalid' >> +// CHECK6-NEXT: 1 error generated. >> + >> +// RUN: echo -e '//expected-error@2{{1}}\n#error 2' | %clang_cc1 -verify >> 2>&1 | FileCheck -check-prefix=CHECK7 %s >> + >> +// CHECK7: error: 'error' diagnostics expected but not seen: >> +// CHECK7-NEXT: Line 2 (directive at <stdin>:1): 1 >> +// CHECK7-NEXT: error: 'error' diagnostics seen but not expected: >> +// CHECK7-NEXT: Line 2: 2 >> +// CHECK7-NEXT: 2 errors generated. >> +#endif >> >> Added: cfe/trunk/test/Frontend/verify2.c >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Frontend/verify2.c?rev=161650&view=auto >> ============================================================================== >> --- cfe/trunk/test/Frontend/verify2.c (added) >> +++ cfe/trunk/test/Frontend/verify2.c Thu Aug 9 20:06:16 2012 >> @@ -0,0 +1,19 @@ >> +#if 0 >> +// RUN: %clang_cc1 -verify %s 2>&1 | FileCheck %s >> + >> +// Please note that all comments are inside "#if 0" blocks so that >> +// VerifyDiagnosticConsumer sees no comments while processing this >> +// test-case. >> +#endif >> + >> +#include "verify2.h" >> +#error source >> + >> +#if 0 >> +// expected-error {{should be ignored}} >> + >> +// CHECK: error: 'error' diagnostics seen but not expected: >> +// CHECK-NEXT: Line 1: header >> +// CHECK-NEXT: Line 10: source >> +// CHECK-NEXT: 2 errors generated. >> +#endif >> >> Added: cfe/trunk/test/Frontend/verify2.h >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Frontend/verify2.h?rev=161650&view=auto >> ============================================================================== >> --- cfe/trunk/test/Frontend/verify2.h (added) >> +++ cfe/trunk/test/Frontend/verify2.h Thu Aug 9 20:06:16 2012 >> @@ -0,0 +1,5 @@ >> +#error header >> + >> +#if 0 >> +// expected-error {{should be ignored}} >> +#endif >> >> Modified: cfe/trunk/test/Modules/Inputs/category_right.h >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/category_right.h?rev=161650&r1=161649&r2=161650&view=diff >> ============================================================================== >> --- cfe/trunk/test/Modules/Inputs/category_right.h (original) >> +++ cfe/trunk/test/Modules/Inputs/category_right.h Thu Aug 9 20:06:16 2012 >> @@ -8,5 +8,5 @@ >> -(void)right2; >> @end >> -@interface Foo(Duplicate) // expected-warning {{duplicate definition of >> category}} >> +@interface Foo(Duplicate) >> @end >> >> Modified: cfe/trunk/test/Modules/lookup.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/lookup.cpp?rev=161650&r1=161649&r2=161650&view=diff >> ============================================================================== >> --- cfe/trunk/test/Modules/lookup.cpp (original) >> +++ cfe/trunk/test/Modules/lookup.cpp Thu Aug 9 20:06:16 2012 >> @@ -5,6 +5,8 @@ >> #define IMPORT(X) @__experimental_modules_import X >> IMPORT(lookup_right_cxx); >> +// in lookup_left.hpp: expected-warning@3 {{weak identifier >> 'weak_identifier' never declared}} >> + >> void test(int i, float f) { >> // unqualified lookup >> f0(&i); >> >> Modified: cfe/trunk/test/Modules/objc-categories.m >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/objc-categories.m?rev=161650&r1=161649&r2=161650&view=diff >> ============================================================================== >> --- cfe/trunk/test/Modules/objc-categories.m (original) >> +++ cfe/trunk/test/Modules/objc-categories.m Thu Aug 9 20:06:16 2012 >> @@ -12,6 +12,7 @@ >> // in category_left.h: expected-note {{previous definition}} >> +// in category_right.h: expected-warning@11 {{duplicate definition of >> category}} >> @interface Foo(Source) >> -(void)source; >> >> >> _______________________________________________ >> cfe-commits mailing list >> [email protected] >> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits > _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
