[cfe-commits] r161650 - in /cfe/trunk: include/clang/Frontend/VerifyDiagnosticConsumer.h lib/ARCMigrate/ARCMT.cpp lib/Frontend/VerifyDiagnosticConsumer.cpp test/ARCMT/verify.m test/ASTMerge/function.c test/Frontend/verify.c test/Frontend/verify2.c test/Frontend/verify2.h test/Modules/Inputs/category_right.h test/Modules/lookup.cpp test/Modules/objc-categories.m
Vassil Vassilev
vasil.georgiev.vasilev at cern.ch
Fri Aug 10 06:08:32 PDT 2012
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 at -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 at 3 {{external function 'f1' declared with incompatible types}}
> +// expected-note at 2 {{declared here}}
> +// expected-error at 5 {{external function 'f3' declared with incompatible types}}
> +// expected-note at 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 at 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
>
> - at interface Foo(Duplicate) // expected-warning {{duplicate definition of category}}
> + at 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 at 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 at 11 {{duplicate definition of category}}
>
> @interface Foo(Source)
> -(void)source;
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list