From 87cb734c04beab4731b51ff6763f5e63a9e604d6 Mon Sep 17 00:00:00 2001 From: Scott Linder Date: Mon, 21 Oct 2019 19:04:56 +0000 Subject: [Clang] Add VerboseOutputStream to CompilerInstance Remove one instance of a hardcoded output stream in CompilerInstance::ExecuteAction. There are still other cases of output being hard-coded to standard streams in ExecuteCompilerInvocation, but this patch covers the case when no flags like -version or -help are passed, namely the "X warnings and Y errors generated." diagnostic. Differential Revision: https://reviews.llvm.org/D53768 llvm-svn: 375442 --- clang/unittests/Frontend/OutputStreamTest.cpp | 55 +++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) (limited to 'clang/unittests/Frontend/OutputStreamTest.cpp') diff --git a/clang/unittests/Frontend/OutputStreamTest.cpp b/clang/unittests/Frontend/OutputStreamTest.cpp index a973582..14537ec 100644 --- a/clang/unittests/Frontend/OutputStreamTest.cpp +++ b/clang/unittests/Frontend/OutputStreamTest.cpp @@ -10,6 +10,7 @@ #include "clang/CodeGen/BackendUtil.h" #include "clang/CodeGen/CodeGenAction.h" #include "clang/Frontend/CompilerInstance.h" +#include "clang/Frontend/TextDiagnosticPrinter.h" #include "clang/FrontendTool/Utils.h" #include "clang/Lex/PreprocessorOptions.h" #include "gtest/gtest.h" @@ -43,4 +44,58 @@ TEST(FrontendOutputTests, TestOutputStream) { EXPECT_TRUE(!IRBuffer.empty()); EXPECT_TRUE(StringRef(IRBuffer.data()).startswith("BC")); } + +TEST(FrontendOutputTests, TestVerboseOutputStreamShared) { + auto Invocation = std::make_shared(); + Invocation->getPreprocessorOpts().addRemappedFile( + "test.cc", MemoryBuffer::getMemBuffer("invalid").release()); + Invocation->getFrontendOpts().Inputs.push_back( + FrontendInputFile("test.cc", Language::CXX)); + Invocation->getFrontendOpts().ProgramAction = EmitBC; + Invocation->getTargetOpts().Triple = "i386-unknown-linux-gnu"; + CompilerInstance Compiler; + + std::string VerboseBuffer; + raw_string_ostream VerboseStream(VerboseBuffer); + + Compiler.setInvocation(std::move(Invocation)); + IntrusiveRefCntPtr DiagOpts = new DiagnosticOptions(); + Compiler.createDiagnostics( + new TextDiagnosticPrinter(llvm::nulls(), &*DiagOpts), true); + Compiler.setVerboseOutputStream(VerboseStream); + + bool Success = ExecuteCompilerInvocation(&Compiler); + EXPECT_FALSE(Success); + EXPECT_TRUE(!VerboseStream.str().empty()); + EXPECT_TRUE(StringRef(VerboseBuffer.data()).contains("errors generated")); +} + +TEST(FrontendOutputTests, TestVerboseOutputStreamOwned) { + std::string VerboseBuffer; + bool Success; + { + auto Invocation = std::make_shared(); + Invocation->getPreprocessorOpts().addRemappedFile( + "test.cc", MemoryBuffer::getMemBuffer("invalid").release()); + Invocation->getFrontendOpts().Inputs.push_back( + FrontendInputFile("test.cc", Language::CXX)); + Invocation->getFrontendOpts().ProgramAction = EmitBC; + Invocation->getTargetOpts().Triple = "i386-unknown-linux-gnu"; + CompilerInstance Compiler; + + std::unique_ptr VerboseStream = + std::make_unique(VerboseBuffer); + + Compiler.setInvocation(std::move(Invocation)); + IntrusiveRefCntPtr DiagOpts = new DiagnosticOptions(); + Compiler.createDiagnostics( + new TextDiagnosticPrinter(llvm::nulls(), &*DiagOpts), true); + Compiler.setVerboseOutputStream(std::move(VerboseStream)); + + Success = ExecuteCompilerInvocation(&Compiler); + } + EXPECT_FALSE(Success); + EXPECT_TRUE(!VerboseBuffer.empty()); + EXPECT_TRUE(StringRef(VerboseBuffer.data()).contains("errors generated")); +} } -- cgit v1.1