diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -1269,7 +1269,7 @@ F += ".dwo"; }; if (Arg *A = Args.getLastArg(options::OPT_gsplit_dwarf_EQ)) - if (StringRef(A->getValue()) == "single") + if (StringRef(A->getValue()) == "single" && Output.isFilename()) return Args.MakeArgString(Output.getFilename()); SmallString<128> T; diff --git a/clang/unittests/Driver/ToolChainTest.cpp b/clang/unittests/Driver/ToolChainTest.cpp --- a/clang/unittests/Driver/ToolChainTest.cpp +++ b/clang/unittests/Driver/ToolChainTest.cpp @@ -367,6 +367,18 @@ EXPECT_TRUE(CallbackHasCalled); } +TEST(CompilerInvocation, SplitSwarfSingleCrash) { + static constexpr const char *Args[] = {"clang", + "--target=arm-linux-gnueabi", + "-gdwarf-4", + "-gsplit-dwarf=single", + "-c", + "foo.cpp"}; + CreateInvocationOptions CIOpts; + std::unique_ptr CI = createInvocation(Args, CIOpts); + EXPECT_TRUE(CI); // no-crash +} + TEST(GetDriverMode, PrefersLastDriverMode) { static constexpr const char *Args[] = {"clang-cl", "--driver-mode=foo", "--driver-mode=bar", "foo.cpp"};