//===- 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> Value = DiagnosticError::create( SourceLocation(), PartialDiagnostic(diag::err_cannot_open_file, Alloc) << "file" << "error"); ASSERT_TRUE(!Value); llvm::Error Err = Value.takeError(); Optional 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); } }