| //===- unittests/Basic/DiagnosticTest.cpp -- Diagnostic engine tests ------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "clang/Basic/Diagnostic.h" |
| #include "clang/Basic/DiagnosticError.h" |
| #include "clang/Basic/DiagnosticIDs.h" |
| #include "gtest/gtest.h" |
| |
| using namespace llvm; |
| using namespace clang; |
| |
| namespace { |
| |
| // Check that DiagnosticErrorTrap works with SuppressAllDiagnostics. |
| TEST(DiagnosticTest, suppressAndTrap) { |
| DiagnosticsEngine Diags(new DiagnosticIDs(), |
| new DiagnosticOptions, |
| new IgnoringDiagConsumer()); |
| Diags.setSuppressAllDiagnostics(true); |
| |
| { |
| DiagnosticErrorTrap trap(Diags); |
| |
| // Diag that would set UncompilableErrorOccurred and ErrorOccurred. |
| Diags.Report(diag::err_target_unknown_triple) << "unknown"; |
| |
| // Diag that would set UnrecoverableErrorOccurred and ErrorOccurred. |
| Diags.Report(diag::err_cannot_open_file) << "file" << "error"; |
| |
| // Diag that would set FatalErrorOccurred |
| // (via non-note following a fatal error). |
| Diags.Report(diag::warn_mt_message) << "warning"; |
| |
| EXPECT_TRUE(trap.hasErrorOccurred()); |
| EXPECT_TRUE(trap.hasUnrecoverableErrorOccurred()); |
| } |
| |
| EXPECT_FALSE(Diags.hasErrorOccurred()); |
| EXPECT_FALSE(Diags.hasFatalErrorOccurred()); |
| EXPECT_FALSE(Diags.hasUncompilableErrorOccurred()); |
| EXPECT_FALSE(Diags.hasUnrecoverableErrorOccurred()); |
| } |
| |
| // 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.setFatalsAsError(FatalsAsError); |
| |
| // Diag that would set UnrecoverableErrorOccurred and ErrorOccurred. |
| Diags.Report(diag::err_cannot_open_file) << "file" << "error"; |
| |
| // Diag that would set FatalErrorOccurred |
| // (via non-note following a fatal error). |
| Diags.Report(diag::warn_mt_message) << "warning"; |
| |
| EXPECT_TRUE(Diags.hasErrorOccurred()); |
| 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(), FatalsAsError); |
| } |
| } |
| TEST(DiagnosticTest, diagnosticError) { |
| DiagnosticsEngine Diags(new DiagnosticIDs(), new DiagnosticOptions, |
| new IgnoringDiagConsumer()); |
| PartialDiagnostic::DiagStorageAllocator Alloc; |
| llvm::Expected<std::pair<int, int>> Value = DiagnosticError::create( |
| SourceLocation(), PartialDiagnostic(diag::err_cannot_open_file, Alloc) |
| << "file" |
| << "error"); |
| ASSERT_TRUE(!Value); |
| llvm::Error Err = Value.takeError(); |
| Optional<PartialDiagnosticAt> ErrDiag = DiagnosticError::take(Err); |
| llvm::cantFail(std::move(Err)); |
| ASSERT_FALSE(!ErrDiag); |
| EXPECT_EQ(ErrDiag->first, SourceLocation()); |
| EXPECT_EQ(ErrDiag->second.getDiagID(), diag::err_cannot_open_file); |
| |
| Value = std::make_pair(20, 1); |
| ASSERT_FALSE(!Value); |
| EXPECT_EQ(*Value, std::make_pair(20, 1)); |
| EXPECT_EQ(Value->first, 20); |
| } |
| } |