aboutsummaryrefslogtreecommitdiff
path: root/clang/unittests/Frontend/CompilerInvocationTest.cpp
diff options
context:
space:
mode:
authorJan Svoboda <jan_svoboda@apple.com>2020-12-11 14:22:21 +0100
committerJan Svoboda <jan_svoboda@apple.com>2020-12-12 09:46:20 +0100
commit6f26a6de489e66830c3181b747f6b18e439f36be (patch)
tree1676fe64b43ef15116360cfd62acce016cb0f7d6 /clang/unittests/Frontend/CompilerInvocationTest.cpp
parenteb44682d671d66e422b02595a636050582a4d84a (diff)
downloadllvm-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.cpp149
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"};