summaryrefslogtreecommitdiffstats
path: root/clang/unittests/Frontend/OutputStreamTest.cpp
diff options
context:
space:
mode:
authorScott Linder <scott@scottlinder.com>2019-10-21 19:04:56 +0000
committerScott Linder <scott@scottlinder.com>2019-10-21 19:04:56 +0000
commit87cb734c04beab4731b51ff6763f5e63a9e604d6 (patch)
treeb0fc6b2d93a59bf44e0582ee19207421e02effd3 /clang/unittests/Frontend/OutputStreamTest.cpp
parentca7f4d8b85b0e1f2f7ab4afab8a31b6aee5964cb (diff)
downloadbcm5719-llvm-87cb734c04beab4731b51ff6763f5e63a9e604d6.tar.gz
bcm5719-llvm-87cb734c04beab4731b51ff6763f5e63a9e604d6.zip
[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
Diffstat (limited to 'clang/unittests/Frontend/OutputStreamTest.cpp')
-rw-r--r--clang/unittests/Frontend/OutputStreamTest.cpp55
1 files changed, 55 insertions, 0 deletions
diff --git a/clang/unittests/Frontend/OutputStreamTest.cpp b/clang/unittests/Frontend/OutputStreamTest.cpp
index a973582f5de..14537ecdc56 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<CompilerInvocation>();
+ 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<DiagnosticOptions> 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<CompilerInvocation>();
+ 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<raw_ostream> VerboseStream =
+ std::make_unique<raw_string_ostream>(VerboseBuffer);
+
+ Compiler.setInvocation(std::move(Invocation));
+ IntrusiveRefCntPtr<DiagnosticOptions> 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"));
+}
}
OpenPOWER on IntegriCloud