diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp index 3dcbd5b8deb8d..649d7ddcf8997 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -1274,7 +1274,7 @@ const char *tools::SplitDebugName(const JobAction &JA, const ArgList &Args, 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 index 4ddeadac2103f..8d3853a7b4a6d 100644 --- a/clang/unittests/Driver/ToolChainTest.cpp +++ b/clang/unittests/Driver/ToolChainTest.cpp @@ -367,6 +367,16 @@ TEST(ToolChainTest, PostCallback) { 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"};