Index: llvm/trunk/lib/Support/Path.cpp =================================================================== --- llvm/trunk/lib/Support/Path.cpp +++ llvm/trunk/lib/Support/Path.cpp @@ -726,6 +726,10 @@ SmallString<256> buffer = path::root_path(path, style); for (StringRef C : components) path::append(buffer, style, C); + // If the buffer is empty, then return ".". Many other path utilities + // do this so it seems to be an expected result. + if (buffer.empty()) + buffer.append(1, '.'); return buffer; } Index: llvm/trunk/unittests/Support/Path.cpp =================================================================== --- llvm/trunk/unittests/Support/Path.cpp +++ llvm/trunk/unittests/Support/Path.cpp @@ -1146,7 +1146,7 @@ TEST(Support, RemoveDots) { EXPECT_EQ("foolz\\wat", remove_dots(".\\.\\\\foolz\\wat", false, path::Style::windows)); - EXPECT_EQ("", remove_dots(".\\\\\\\\\\", false, path::Style::windows)); + EXPECT_EQ(".", remove_dots(".\\\\\\\\\\", false, path::Style::windows)); EXPECT_EQ("a\\..\\b\\c", remove_dots(".\\a\\..\\b\\c", false, path::Style::windows)); @@ -1163,7 +1163,8 @@ EXPECT_EQ("foolz/wat", remove_dots("././/foolz/wat", false, path::Style::posix)); - EXPECT_EQ("", remove_dots("./////", false, path::Style::posix)); + EXPECT_EQ(".", remove_dots("./////", false, path::Style::posix)); + EXPECT_EQ(".", remove_dots("", false, path::Style::posix)); EXPECT_EQ("a/../b/c", remove_dots("./a/../b/c", false, path::Style::posix)); EXPECT_EQ("b/c", remove_dots("./a/../b/c", true, path::Style::posix));