diff options
author | Jan Svoboda <jan_svoboda@apple.com> | 2020-12-11 14:22:21 +0100 |
---|---|---|
committer | Jan Svoboda <jan_svoboda@apple.com> | 2020-12-12 09:46:20 +0100 |
commit | 6f26a6de489e66830c3181b747f6b18e439f36be (patch) | |
tree | 1676fe64b43ef15116360cfd62acce016cb0f7d6 /clang/unittests/Frontend/CompilerInvocationTest.cpp | |
parent | eb44682d671d66e422b02595a636050582a4d84a (diff) | |
download | llvm-6f26a6de489e66830c3181b747f6b18e439f36be.zip llvm-6f26a6de489e66830c3181b747f6b18e439f36be.tar.gz llvm-6f26a6de489e66830c3181b747f6b18e439f36be.tar.bz2 |
Reland "[clang][cli] CompilerInvocationTest: add tests for boolean options"
Add more tests of the command line marshalling infrastructure.
The new tests now make a "round-trip": from arguments, to CompilerInvocation instance to arguments again in a single test case.
The TODOs are resolved in a follow-up patch.
Depends on D92830.
Reviewed By: dexonsmith
Differential Revision: https://reviews.llvm.org/D92774
Diffstat (limited to 'clang/unittests/Frontend/CompilerInvocationTest.cpp')
-rw-r--r-- | clang/unittests/Frontend/CompilerInvocationTest.cpp | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/clang/unittests/Frontend/CompilerInvocationTest.cpp b/clang/unittests/Frontend/CompilerInvocationTest.cpp index c3bdd6bf..c2dc35c 100644 --- a/clang/unittests/Frontend/CompilerInvocationTest.cpp +++ b/clang/unittests/Frontend/CompilerInvocationTest.cpp @@ -77,6 +77,155 @@ TEST_F(CommandLineTest, BoolOptionDefaultTrueSingleFlagUnknownPresent) { ASSERT_TRUE(Invocation.getFrontendOpts().UseTemporary); } +// Boolean option with a keypath that defaults to true. +// The flag with negative spelling can set the keypath to false. +// The flag with positive spelling can reset the keypath to true. + +TEST_F(CommandLineTest, BoolOptionDefaultTruePresentNone) { + const char *Args[] = {""}; + + CompilerInvocation::CreateFromArgs(Invocation, Args, *Diags); + ASSERT_FALSE(Diags->hasErrorOccurred()); + ASSERT_TRUE(Invocation.getCodeGenOpts().Autolink); + + // TODO: Test argument generation. +} + +TEST_F(CommandLineTest, BoolOptionDefaultTruePresentNegChange) { + const char *Args[] = {"-fno-autolink"}; + + CompilerInvocation::CreateFromArgs(Invocation, Args, *Diags); + ASSERT_FALSE(Diags->hasErrorOccurred()); + ASSERT_FALSE(Invocation.getCodeGenOpts().Autolink); + + // TODO: Test argument generation. +} + +TEST_F(CommandLineTest, BoolOptionDefaultTruePresentPosReset) { + const char *Args[] = {"-fautolink"}; + + CompilerInvocation::CreateFromArgs(Invocation, Args, *Diags); + ASSERT_TRUE(Diags->hasErrorOccurred()); // Driver-only flag. + ASSERT_TRUE(Invocation.getCodeGenOpts().Autolink); +} + +// Boolean option with a keypath that defaults to false. +// The flag with negative spelling can set the keypath to true. +// The flag with positive spelling can reset the keypath to false. + +TEST_F(CommandLineTest, BoolOptionDefaultFalsePresentNone) { + const char *Args[] = {""}; + + CompilerInvocation::CreateFromArgs(Invocation, Args, *Diags); + ASSERT_FALSE(Diags->hasErrorOccurred()); + ASSERT_FALSE(Invocation.getCodeGenOpts().NoInlineLineTables); + + // TODO: Test argument generation. +} + +TEST_F(CommandLineTest, BoolOptionDefaultFalsePresentNegChange) { + const char *Args[] = {"-gno-inline-line-tables"}; + + CompilerInvocation::CreateFromArgs(Invocation, Args, *Diags); + ASSERT_FALSE(Diags->hasErrorOccurred()); + ASSERT_TRUE(Invocation.getCodeGenOpts().NoInlineLineTables); + + // TODO: Test argument generation. +} + +TEST_F(CommandLineTest, BoolOptionDefaultFalsePresentPosReset) { + const char *Args[] = {"-ginline-line-tables"}; + + CompilerInvocation::CreateFromArgs(Invocation, Args, *Diags); + ASSERT_TRUE(Diags->hasErrorOccurred()); // Driver-only flag. + ASSERT_FALSE(Invocation.getCodeGenOpts().NoInlineLineTables); +} + +// Boolean option with a keypath that defaults to false. +// The flag with positive spelling can set the keypath to true. +// The flag with negative spelling can reset the keypath to false. + +TEST_F(CommandLineTest, BoolOptionDefaultFalsePresentNoneX) { + const char *Args[] = {""}; + + CompilerInvocation::CreateFromArgs(Invocation, Args, *Diags); + ASSERT_FALSE(Diags->hasErrorOccurred()); + ASSERT_FALSE(Invocation.getCodeGenOpts().CodeViewGHash); + + // TODO: Test argument generation. +} + +TEST_F(CommandLineTest, BoolOptionDefaultFalsePresentPosChange) { + const char *Args[] = {"-gcodeview-ghash"}; + + CompilerInvocation::CreateFromArgs(Invocation, Args, *Diags); + ASSERT_FALSE(Diags->hasErrorOccurred()); + ASSERT_TRUE(Invocation.getCodeGenOpts().CodeViewGHash); + + // TODO: Test argument generation. +} + +TEST_F(CommandLineTest, BoolOptionDefaultFalsePresentNegReset) { + const char *Args[] = {"-gno-codeview-ghash"}; + + CompilerInvocation::CreateFromArgs(Invocation, Args, *Diags); + ASSERT_TRUE(Diags->hasErrorOccurred()); // Driver-only flag. + ASSERT_FALSE(Invocation.getCodeGenOpts().CodeViewGHash); +} + +// Boolean option with a keypath that defaults to an arbitrary expression. +// The flag with positive spelling can set the keypath to true. +// The flag with negative spelling can set the keypath to false. + +static constexpr unsigned PassManagerDefault = + !static_cast<unsigned>(LLVM_ENABLE_NEW_PASS_MANAGER); + +static constexpr const char *PassManagerResetByFlag = + LLVM_ENABLE_NEW_PASS_MANAGER ? "-fno-legacy-pass-manager" + : "-flegacy-pass-manager"; + +static constexpr const char *PassManagerChangedByFlag = + LLVM_ENABLE_NEW_PASS_MANAGER ? "-flegacy-pass-manager" + : "-fno-legacy-pass-manager"; + +TEST_F(CommandLineTest, BoolOptionDefaultArbitraryTwoFlagsPresentNone) { + const char *Args = {""}; + + CompilerInvocation::CreateFromArgs(Invocation, Args, *Diags); + + ASSERT_FALSE(Diags->hasErrorOccurred()); + ASSERT_EQ(Invocation.getCodeGenOpts().LegacyPassManager, PassManagerDefault); + + Invocation.generateCC1CommandLine(GeneratedArgs, *this); + + ASSERT_THAT(GeneratedArgs, Contains(StrEq(PassManagerResetByFlag))); + ASSERT_THAT(GeneratedArgs, Not(Contains(StrEq(PassManagerChangedByFlag)))); +} + +TEST_F(CommandLineTest, BoolOptionDefaultArbitraryTwoFlagsPresentChange) { + const char *Args[] = {PassManagerChangedByFlag}; + + CompilerInvocation::CreateFromArgs(Invocation, Args, *Diags); + ASSERT_FALSE(Diags->hasErrorOccurred()); + ASSERT_EQ(Invocation.getCodeGenOpts().LegacyPassManager, !PassManagerDefault); + + Invocation.generateCC1CommandLine(GeneratedArgs, *this); + ASSERT_THAT(GeneratedArgs, Contains(StrEq(PassManagerChangedByFlag))); + ASSERT_THAT(GeneratedArgs, Not(Contains(StrEq(PassManagerResetByFlag)))); +} + +TEST_F(CommandLineTest, BoolOptionDefaultArbitraryTwoFlagsPresentReset) { + const char *Args[] = {PassManagerResetByFlag}; + + CompilerInvocation::CreateFromArgs(Invocation, Args, *Diags); + ASSERT_FALSE(Diags->hasErrorOccurred()); + ASSERT_EQ(Invocation.getCodeGenOpts().LegacyPassManager, PassManagerDefault); + + Invocation.generateCC1CommandLine(GeneratedArgs, *this); + ASSERT_THAT(GeneratedArgs, Contains(StrEq(PassManagerResetByFlag))); + ASSERT_THAT(GeneratedArgs, Not(Contains(StrEq(PassManagerChangedByFlag)))); +} + TEST_F(CommandLineTest, CanGenerateCC1CommandLineFlag) { const char *Args[] = {"-fmodules-strict-context-hash"}; |