From: Douglas Gregor Date: Wed, 14 Apr 2010 22:19:45 +0000 (+0000) Subject: Once we've emitted a fatal diagnostic, keep counting errors but with a X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1864f2eb59471d07db51adfc3e5b1a229eed631a;p=clang Once we've emitted a fatal diagnostic, keep counting errors but with a separate count of "suppressed" errors. This way, semantic analysis bits that depend on the error count to determine whether problems occured (e.g., some template argument deduction failures, jump-scope checking) will not get confused. The actual problem here is that a missing #include (which is a fatal error) could cause the jump-scope checker to run on invalid code, which it is not prepared to do. Trivial fix for both and . git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@101297 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/Diagnostic.h b/include/clang/Basic/Diagnostic.h index 8c959b7cea..21e2b3e1a5 100644 --- a/include/clang/Basic/Diagnostic.h +++ b/include/clang/Basic/Diagnostic.h @@ -214,7 +214,8 @@ private: unsigned NumWarnings; // Number of warnings reported unsigned NumErrors; // Number of errors reported - + unsigned NumErrorsSuppressed; // Number of errors suppressed + /// CustomDiagInfo - Information for uniquing and looking up custom diags. diag::CustomDiagInfo *CustomDiagInfo; @@ -343,6 +344,7 @@ public: bool hasFatalErrorOccurred() const { return FatalErrorOccurred; } unsigned getNumErrors() const { return NumErrors; } + unsigned getNumErrorsSuppressed() const { return NumErrorsSuppressed; } unsigned getNumWarnings() const { return NumWarnings; } /// getCustomDiagID - Return an ID for a diagnostic with the specified message diff --git a/lib/Basic/Diagnostic.cpp b/lib/Basic/Diagnostic.cpp index bd1d6e8b70..755fbed66f 100644 --- a/lib/Basic/Diagnostic.cpp +++ b/lib/Basic/Diagnostic.cpp @@ -227,6 +227,7 @@ Diagnostic::Diagnostic(DiagnosticClient *client) : Client(client) { NumWarnings = 0; NumErrors = 0; + NumErrorsSuppressed = 0; CustomDiagInfo = 0; CurDiagID = ~0U; LastDiagLevel = Ignored; @@ -537,8 +538,14 @@ bool Diagnostic::ProcessDiag() { // If a fatal error has already been emitted, silence all subsequent // diagnostics. - if (FatalErrorOccurred) + if (FatalErrorOccurred) { + if (DiagLevel >= Diagnostic::Error) { + ++NumErrors; + ++NumErrorsSuppressed; + } + return false; + } // If the client doesn't care about this message, don't issue it. If this is // a note and the last real diagnostic was ignored, ignore it too. diff --git a/lib/Frontend/CompilerInstance.cpp b/lib/Frontend/CompilerInstance.cpp index 685e6c281c..5ed9c409a3 100644 --- a/lib/Frontend/CompilerInstance.cpp +++ b/lib/Frontend/CompilerInstance.cpp @@ -515,7 +515,8 @@ bool CompilerInstance::ExecuteAction(FrontendAction &Act) { if (getDiagnosticOpts().ShowCarets) { unsigned NumWarnings = getDiagnostics().getNumWarnings(); - unsigned NumErrors = getDiagnostics().getNumErrors(); + unsigned NumErrors = getDiagnostics().getNumErrors() - + getDiagnostics().getNumErrorsSuppressed(); if (NumWarnings) OS << NumWarnings << " warning" << (NumWarnings == 1 ? "" : "s"); diff --git a/test/SemaCXX/missing-header.cpp b/test/SemaCXX/missing-header.cpp new file mode 100644 index 0000000000..f436579900 --- /dev/null +++ b/test/SemaCXX/missing-header.cpp @@ -0,0 +1,9 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s + +#include "not exist" // expected-error{{'not exist' file not found}} + +class AnalysisContext {}; +static ControlFlowKind CheckFallThrough(AnalysisContext &AC) { + if (const AsmStmt *AS = dyn_cast(S)) {} + bool NoReturnEdge = false; +}