[clang][cli] Add explicit round-trip test

This patch adds a test that verifies all `CompilerInvocation` members are filled correctly during command line round-trip.

Reviewed By: dexonsmith

Differential Revision: https://reviews.llvm.org/D96705
This commit is contained in:
Jan Svoboda 2021-02-16 14:41:25 +01:00
parent f64c626069
commit ed86328515
1 changed files with 83 additions and 0 deletions

View File

@ -7,8 +7,10 @@
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
#include "clang/Frontend/CompilerInvocation.h" #include "clang/Frontend/CompilerInvocation.h"
#include "clang/Basic/TargetOptions.h"
#include "clang/Frontend/CompilerInstance.h" #include "clang/Frontend/CompilerInstance.h"
#include "clang/Frontend/TextDiagnosticBuffer.h" #include "clang/Frontend/TextDiagnosticBuffer.h"
#include "clang/Lex/PreprocessorOptions.h"
#include "llvm/Support/Host.h" #include "llvm/Support/Host.h"
#include "gmock/gmock.h" #include "gmock/gmock.h"
@ -740,4 +742,85 @@ TEST_F(CommandLineTest, DigraphsEnabled) {
Invocation.generateCC1CommandLine(GeneratedArgs, *this); Invocation.generateCC1CommandLine(GeneratedArgs, *this);
ASSERT_THAT(GeneratedArgs, Contains(StrEq("-fdigraphs"))); ASSERT_THAT(GeneratedArgs, Contains(StrEq("-fdigraphs")));
} }
TEST_F(CommandLineTest, RoundTrip) {
// Testing one marshalled and one manually generated option from each
// CompilerInvocation member.
const char *Args[] = {
"-round-trip-args",
// LanguageOptions
"-std=c17",
"-fmax-tokens=10",
// TargetOptions
"-target-sdk-version=1.2.3",
"-meabi",
"4",
// DiagnosticOptions
"-Wundef-prefix=XY",
"-fdiagnostics-format",
"clang",
// HeaderSearchOptions
"-stdlib=libc++",
"-fimplicit-module-maps",
// PreprocessorOptions
"-DXY=AB",
"-include-pch",
"a.pch",
// AnalyzerOptions
"-analyzer-config",
"ctu-import-threshold=42",
"-unoptimized-cfg",
// MigratorOptions (no manually handled arguments)
"-no-ns-alloc-error",
// CodeGenOptions
"-debug-info-kind=limited",
"-debug-info-macro",
// DependencyOutputOptions
"--show-includes",
"-H",
// FileSystemOptions (no manually handled arguments)
"-working-directory",
"folder",
// FrontendOptions
"-load",
"plugin",
"-ast-merge",
// PreprocessorOutputOptions
"-dD",
"-CC",
};
ASSERT_TRUE(CompilerInvocation::CreateFromArgs(Invocation, Args, *Diags));
ASSERT_TRUE(Invocation.getLangOpts()->C17);
ASSERT_EQ(Invocation.getLangOpts()->MaxTokens, 10u);
ASSERT_EQ(Invocation.getTargetOpts().SDKVersion, llvm::VersionTuple(1, 2, 3));
ASSERT_EQ(Invocation.getTargetOpts().EABIVersion, EABI::EABI4);
ASSERT_THAT(Invocation.getDiagnosticOpts().UndefPrefixes,
Contains(StrEq("XY")));
ASSERT_EQ(Invocation.getDiagnosticOpts().getFormat(),
TextDiagnosticFormat::Clang);
ASSERT_TRUE(Invocation.getHeaderSearchOpts().UseLibcxx);
ASSERT_TRUE(Invocation.getHeaderSearchOpts().ImplicitModuleMaps);
ASSERT_THAT(Invocation.getPreprocessorOpts().Macros,
Contains(std::make_pair(std::string("XY=AB"), false)));
ASSERT_EQ(Invocation.getPreprocessorOpts().ImplicitPCHInclude, "a.pch");
ASSERT_EQ(Invocation.getAnalyzerOpts()->Config["ctu-import-threshold"], "42");
ASSERT_TRUE(Invocation.getAnalyzerOpts()->UnoptimizedCFG);
ASSERT_TRUE(Invocation.getMigratorOpts().NoNSAllocReallocError);
ASSERT_EQ(Invocation.getCodeGenOpts().getDebugInfo(),
codegenoptions::DebugInfoKind::LimitedDebugInfo);
ASSERT_TRUE(Invocation.getCodeGenOpts().MacroDebugInfo);
ASSERT_EQ(Invocation.getDependencyOutputOpts().ShowIncludesDest,
ShowIncludesDestination::Stdout);
ASSERT_TRUE(Invocation.getDependencyOutputOpts().ShowHeaderIncludes);
}
} // anonymous namespace } // anonymous namespace