[PATCH] D58501: [libclang] Fix CXTranslationUnit_KeepGoing
This revision was automatically updated to reflect the committed changes. Closed by commit rL355586: [libclang] Fix CXTranslationUnit_KeepGoing (authored by yvvan, committed by ). Herald added a project: LLVM. Herald added a subscriber: llvm-commits. Changed prior to commit: https://reviews.llvm.org/D58501?vs=187765=189668#toc Repository: rL LLVM CHANGES SINCE LAST ACTION https://reviews.llvm.org/D58501/new/ https://reviews.llvm.org/D58501 Files: cfe/trunk/include/clang/Basic/Diagnostic.h cfe/trunk/lib/Basic/DiagnosticIDs.cpp cfe/trunk/test/Index/Inputs/keep-going-template-instantiations.h cfe/trunk/test/Index/keep-going-template-instantiations.cpp cfe/trunk/test/Index/keep-going.cpp cfe/trunk/tools/libclang/CIndex.cpp cfe/trunk/unittests/Basic/DiagnosticTest.cpp Index: cfe/trunk/lib/Basic/DiagnosticIDs.cpp === --- cfe/trunk/lib/Basic/DiagnosticIDs.cpp +++ cfe/trunk/lib/Basic/DiagnosticIDs.cpp @@ -481,6 +481,11 @@ Result = diag::Severity::Fatal; } + // If explicitly requested, map fatal errors to errors. + if (Result == diag::Severity::Fatal && + Diag.CurDiagID != diag::fatal_too_many_errors && Diag.FatalsAsError) +Result = diag::Severity::Error; + // Custom diagnostics always are emitted in system headers. bool ShowInSystemHeader = !GetDiagInfo(DiagID) || GetDiagInfo(DiagID)->WarnShowInSystemHeader; @@ -660,7 +665,7 @@ // If a fatal error has already been emitted, silence all subsequent // diagnostics. - if (Diag.FatalErrorOccurred && Diag.SuppressAfterFatalError) { + if (Diag.FatalErrorOccurred) { if (DiagLevel >= DiagnosticIDs::Error && Diag.Client->IncludeInDiagnosticCounts()) { ++Diag.NumErrors; Index: cfe/trunk/unittests/Basic/DiagnosticTest.cpp === --- cfe/trunk/unittests/Basic/DiagnosticTest.cpp +++ cfe/trunk/unittests/Basic/DiagnosticTest.cpp @@ -46,13 +46,13 @@ EXPECT_FALSE(Diags.hasUnrecoverableErrorOccurred()); } -// Check that SuppressAfterFatalError works as intended -TEST(DiagnosticTest, suppressAfterFatalError) { - for (unsigned Suppress = 0; Suppress != 2; ++Suppress) { +// Check that FatalsAsError works as intended +TEST(DiagnosticTest, fatalsAsError) { + for (unsigned FatalsAsError = 0; FatalsAsError != 2; ++FatalsAsError) { DiagnosticsEngine Diags(new DiagnosticIDs(), new DiagnosticOptions, new IgnoringDiagConsumer()); -Diags.setSuppressAfterFatalError(Suppress); +Diags.setFatalsAsError(FatalsAsError); // Diag that would set UnrecoverableErrorOccurred and ErrorOccurred. Diags.Report(diag::err_cannot_open_file) << "file" << "error"; @@ -62,16 +62,15 @@ Diags.Report(diag::warn_mt_message) << "warning"; EXPECT_TRUE(Diags.hasErrorOccurred()); -EXPECT_TRUE(Diags.hasFatalErrorOccurred()); +EXPECT_EQ(Diags.hasFatalErrorOccurred(), FatalsAsError ? 0u : 1u); EXPECT_TRUE(Diags.hasUncompilableErrorOccurred()); EXPECT_TRUE(Diags.hasUnrecoverableErrorOccurred()); // The warning should be emitted and counted only if we're not suppressing // after fatal errors. -EXPECT_EQ(Diags.getNumWarnings(), Suppress ? 0u : 1u); +EXPECT_EQ(Diags.getNumWarnings(), FatalsAsError); } } - TEST(DiagnosticTest, diagnosticError) { DiagnosticsEngine Diags(new DiagnosticIDs(), new DiagnosticOptions, new IgnoringDiagConsumer()); Index: cfe/trunk/tools/libclang/CIndex.cpp === --- cfe/trunk/tools/libclang/CIndex.cpp +++ cfe/trunk/tools/libclang/CIndex.cpp @@ -3408,7 +3408,7 @@ Diags(CompilerInstance::createDiagnostics(new DiagnosticOptions)); if (options & CXTranslationUnit_KeepGoing) -Diags->setSuppressAfterFatalError(false); +Diags->setFatalsAsError(true); // Recover resources if we crash before exiting this function. llvm::CrashRecoveryContextCleanupRegistrarErrorsAsFatal = Val; } bool getErrorsAsFatal() const { return GetCurDiagState()->ErrorsAsFatal; } - /// When set to true (the default), suppress further diagnostics after - /// a fatal error. - void setSuppressAfterFatalError(bool Val) { SuppressAfterFatalError = Val; } + /// \brief When set to true, any fatal error reported is made an error. + /// + /// This setting takes precedence over the setErrorsAsFatal setting above. + void setFatalsAsError(bool Val) { FatalsAsError = Val; } + bool getFatalsAsError() const { return FatalsAsError; } /// When set to true mask warnings that come from system headers. void setSuppressSystemWarnings(bool Val) { Index: cfe/trunk/test/Index/keep-going-template-instantiations.cpp === --- cfe/trunk/test/Index/keep-going-template-instantiations.cpp +++
[PATCH] D58501: [libclang] Fix CXTranslationUnit_KeepGoing
nik updated this revision to Diff 187765. nik added a comment. Fixed minor typo. Repository: rC Clang CHANGES SINCE LAST ACTION https://reviews.llvm.org/D58501/new/ https://reviews.llvm.org/D58501 Files: include/clang/Basic/Diagnostic.h lib/Basic/DiagnosticIDs.cpp test/Index/Inputs/keep-going-template-instantiations.h test/Index/keep-going-template-instantiations.cpp test/Index/keep-going.cpp tools/libclang/CIndex.cpp unittests/Basic/DiagnosticTest.cpp Index: unittests/Basic/DiagnosticTest.cpp === --- unittests/Basic/DiagnosticTest.cpp +++ unittests/Basic/DiagnosticTest.cpp @@ -46,13 +46,13 @@ EXPECT_FALSE(Diags.hasUnrecoverableErrorOccurred()); } -// Check that SuppressAfterFatalError works as intended -TEST(DiagnosticTest, suppressAfterFatalError) { - for (unsigned Suppress = 0; Suppress != 2; ++Suppress) { +// Check that FatalsAsError works as intended +TEST(DiagnosticTest, fatalsAsError) { + for (unsigned FatalsAsError = 0; FatalsAsError != 2; ++FatalsAsError) { DiagnosticsEngine Diags(new DiagnosticIDs(), new DiagnosticOptions, new IgnoringDiagConsumer()); -Diags.setSuppressAfterFatalError(Suppress); +Diags.setFatalsAsError(FatalsAsError); // Diag that would set UnrecoverableErrorOccurred and ErrorOccurred. Diags.Report(diag::err_cannot_open_file) << "file" << "error"; @@ -62,13 +62,13 @@ Diags.Report(diag::warn_mt_message) << "warning"; EXPECT_TRUE(Diags.hasErrorOccurred()); -EXPECT_TRUE(Diags.hasFatalErrorOccurred()); +EXPECT_EQ(Diags.hasFatalErrorOccurred(), FatalsAsError ? 0u : 1u); EXPECT_TRUE(Diags.hasUncompilableErrorOccurred()); EXPECT_TRUE(Diags.hasUnrecoverableErrorOccurred()); // The warning should be emitted and counted only if we're not suppressing // after fatal errors. -EXPECT_EQ(Diags.getNumWarnings(), Suppress ? 0u : 1u); +EXPECT_EQ(Diags.getNumWarnings(), FatalsAsError); } } Index: tools/libclang/CIndex.cpp === --- tools/libclang/CIndex.cpp +++ tools/libclang/CIndex.cpp @@ -3409,7 +3409,7 @@ Diags(CompilerInstance::createDiagnostics(new DiagnosticOptions)); if (options & CXTranslationUnit_KeepGoing) -Diags->setSuppressAfterFatalError(false); +Diags->setFatalsAsError(true); // Recover resources if we crash before exiting this function. llvm::CrashRecoveryContextCleanupRegistrar + +// RUN: env CINDEXTEST_KEEP_GOING=1 c-index-test -test-load-source none -I%S/Inputs %s 2>&1 | FileCheck %s +// CHECK-NOT: error: expected class name Index: test/Index/Inputs/keep-going-template-instantiations.h === --- /dev/null +++ test/Index/Inputs/keep-going-template-instantiations.h @@ -0,0 +1,3 @@ +template struct c {}; +using d = c; +struct foo : public d {}; Index: lib/Basic/DiagnosticIDs.cpp === --- lib/Basic/DiagnosticIDs.cpp +++ lib/Basic/DiagnosticIDs.cpp @@ -481,6 +481,11 @@ Result = diag::Severity::Fatal; } + // If explicitly requested, map fatal errors to errors. + if (Result == diag::Severity::Fatal && + Diag.CurDiagID != diag::fatal_too_many_errors && Diag.FatalsAsError) +Result = diag::Severity::Error; + // Custom diagnostics always are emitted in system headers. bool ShowInSystemHeader = !GetDiagInfo(DiagID) || GetDiagInfo(DiagID)->WarnShowInSystemHeader; @@ -660,7 +665,7 @@ // If a fatal error has already been emitted, silence all subsequent // diagnostics. - if (Diag.FatalErrorOccurred && Diag.SuppressAfterFatalError) { + if (Diag.FatalErrorOccurred) { if (DiagLevel >= DiagnosticIDs::Error && Diag.Client->IncludeInDiagnosticCounts()) { ++Diag.NumErrors; Index: include/clang/Basic/Diagnostic.h === --- include/clang/Basic/Diagnostic.h +++ include/clang/Basic/Diagnostic.h @@ -209,8 +209,8 @@ // Used by __extension__ unsigned char AllExtensionsSilenced = 0; - // Suppress diagnostics after a fatal error? - bool SuppressAfterFatalError = true; + // Treat fatal errors like errors. + bool FatalsAsError = false; // Suppress all diagnostics. bool SuppressAllDiagnostics = false; @@ -614,9 +614,11 @@ void setErrorsAsFatal(bool Val) { GetCurDiagState()->ErrorsAsFatal = Val; } bool getErrorsAsFatal() const { return GetCurDiagState()->ErrorsAsFatal; } - /// When set to true (the default), suppress further diagnostics after - /// a fatal error. - void setSuppressAfterFatalError(bool Val) { SuppressAfterFatalError = Val; } + /// \brief When set to true, any fatal error reported is made an error. + /// + /// This setting takes precedence over the setErrorsAsFatal setting above. + void
[PATCH] D58501: [libclang] Fix CXTranslationUnit_KeepGoing
nik created this revision. Herald added subscribers: cfe-commits, arphaman. Herald added a project: clang. Since commit 56f5487e4387a69708f70724d00e9e076153 [modules] Round-trip -Werror flag through explicit module build. the behavior of CXTranslationUnit_KeepGoing changed: Unresolved #includes are fatal errors again. As a consequence, some templates are not instantiated and lead to confusing errors. Revert to the old behavior: With CXTranslationUnit_KeepGoing fatal errors are mapped to errors. Repository: rC Clang https://reviews.llvm.org/D58501 Files: include/clang/Basic/Diagnostic.h lib/Basic/DiagnosticIDs.cpp test/Index/Inputs/keep-going-template-instantiations.h test/Index/keep-going-template-instantiations.cpp test/Index/keep-going.cpp tools/libclang/CIndex.cpp unittests/Basic/DiagnosticTest.cpp Index: unittests/Basic/DiagnosticTest.cpp === --- unittests/Basic/DiagnosticTest.cpp +++ unittests/Basic/DiagnosticTest.cpp @@ -46,13 +46,13 @@ EXPECT_FALSE(Diags.hasUnrecoverableErrorOccurred()); } -// Check that SuppressAfterFatalError works as intended -TEST(DiagnosticTest, suppressAfterFatalError) { - for (unsigned Suppress = 0; Suppress != 2; ++Suppress) { +// Check that FatalsAsError works as intended +TEST(DiagnosticTest, fatalAsError) { + for (unsigned FatalAsError = 0; FatalAsError != 2; ++FatalAsError) { DiagnosticsEngine Diags(new DiagnosticIDs(), new DiagnosticOptions, new IgnoringDiagConsumer()); -Diags.setSuppressAfterFatalError(Suppress); +Diags.setFatalsAsError(FatalAsError); // Diag that would set UnrecoverableErrorOccurred and ErrorOccurred. Diags.Report(diag::err_cannot_open_file) << "file" << "error"; @@ -62,13 +62,13 @@ Diags.Report(diag::warn_mt_message) << "warning"; EXPECT_TRUE(Diags.hasErrorOccurred()); -EXPECT_TRUE(Diags.hasFatalErrorOccurred()); +EXPECT_EQ(Diags.hasFatalErrorOccurred(), FatalAsError ? 0u : 1u); EXPECT_TRUE(Diags.hasUncompilableErrorOccurred()); EXPECT_TRUE(Diags.hasUnrecoverableErrorOccurred()); // The warning should be emitted and counted only if we're not suppressing // after fatal errors. -EXPECT_EQ(Diags.getNumWarnings(), Suppress ? 0u : 1u); +EXPECT_EQ(Diags.getNumWarnings(), FatalAsError); } } Index: tools/libclang/CIndex.cpp === --- tools/libclang/CIndex.cpp +++ tools/libclang/CIndex.cpp @@ -3409,7 +3409,7 @@ Diags(CompilerInstance::createDiagnostics(new DiagnosticOptions)); if (options & CXTranslationUnit_KeepGoing) -Diags->setSuppressAfterFatalError(false); +Diags->setFatalsAsError(true); // Recover resources if we crash before exiting this function. llvm::CrashRecoveryContextCleanupRegistrar + +// RUN: env CINDEXTEST_KEEP_GOING=1 c-index-test -test-load-source none -I%S/Inputs %s 2>&1 | FileCheck %s +// CHECK-NOT: error: expected class name Index: test/Index/Inputs/keep-going-template-instantiations.h === --- /dev/null +++ test/Index/Inputs/keep-going-template-instantiations.h @@ -0,0 +1,3 @@ +template struct c {}; +using d = c; +struct foo : public d {}; Index: lib/Basic/DiagnosticIDs.cpp === --- lib/Basic/DiagnosticIDs.cpp +++ lib/Basic/DiagnosticIDs.cpp @@ -481,6 +481,11 @@ Result = diag::Severity::Fatal; } + // If explicitly requested, map fatal errors to errors. + if (Result == diag::Severity::Fatal && + Diag.CurDiagID != diag::fatal_too_many_errors && Diag.FatalsAsError) +Result = diag::Severity::Error; + // Custom diagnostics always are emitted in system headers. bool ShowInSystemHeader = !GetDiagInfo(DiagID) || GetDiagInfo(DiagID)->WarnShowInSystemHeader; @@ -660,7 +665,7 @@ // If a fatal error has already been emitted, silence all subsequent // diagnostics. - if (Diag.FatalErrorOccurred && Diag.SuppressAfterFatalError) { + if (Diag.FatalErrorOccurred) { if (DiagLevel >= DiagnosticIDs::Error && Diag.Client->IncludeInDiagnosticCounts()) { ++Diag.NumErrors; Index: include/clang/Basic/Diagnostic.h === --- include/clang/Basic/Diagnostic.h +++ include/clang/Basic/Diagnostic.h @@ -209,8 +209,8 @@ // Used by __extension__ unsigned char AllExtensionsSilenced = 0; - // Suppress diagnostics after a fatal error? - bool SuppressAfterFatalError = true; + // Treat fatal errors like errors. + bool FatalsAsError = false; // Suppress all diagnostics. bool SuppressAllDiagnostics = false; @@ -614,9 +614,11 @@ void setErrorsAsFatal(bool Val) { GetCurDiagState()->ErrorsAsFatal = Val; } bool getErrorsAsFatal() const { return GetCurDiagState()->ErrorsAsFatal; }