Index: llvm/include/llvm/Support/Path.h =================================================================== --- llvm/include/llvm/Support/Path.h +++ llvm/include/llvm/Support/Path.h @@ -27,6 +27,16 @@ enum class Style { windows, posix, native }; +/// Return \a Style::windows or \a Style::posix, whichever one is equivalent to +/// \a Style::native on the current host. +constexpr Style system_style() { +#if defined(_WIN32) + return Style::windows; +#else + return Style::posix; +#endif +} + /// @name Lexical Component Iterator /// @{ Index: llvm/lib/Support/Path.cpp =================================================================== --- llvm/lib/Support/Path.cpp +++ llvm/lib/Support/Path.cpp @@ -37,11 +37,7 @@ using llvm::sys::path::Style; inline Style real_style(Style style) { -#ifdef _WIN32 - return (style == Style::posix) ? Style::posix : Style::windows; -#else - return (style == Style::windows) ? Style::windows : Style::posix; -#endif + return style == Style::native ? llvm::sys::path::system_style() : style; } inline const char *separators(Style style) { Index: llvm/unittests/Support/Path.cpp =================================================================== --- llvm/unittests/Support/Path.cpp +++ llvm/unittests/Support/Path.cpp @@ -69,6 +69,10 @@ int FD; }; +TEST(system_style, NotNative) { + EXPECT_NE(path::Style::native, path::system_style()); +} + TEST(is_separator, Works) { EXPECT_TRUE(path::is_separator('/')); EXPECT_FALSE(path::is_separator('\0')); @@ -78,11 +82,8 @@ EXPECT_TRUE(path::is_separator('\\', path::Style::windows)); EXPECT_FALSE(path::is_separator('\\', path::Style::posix)); -#ifdef _WIN32 - EXPECT_TRUE(path::is_separator('\\')); -#else - EXPECT_FALSE(path::is_separator('\\')); -#endif + EXPECT_EQ(path::system_style() == path::Style::windows, + path::is_separator('\\')); } TEST(is_absolute_gnu, Works) { @@ -107,6 +108,10 @@ std::get<1>(Path)); EXPECT_EQ(path::is_absolute_gnu(std::get<0>(Path), path::Style::windows), std::get<2>(Path)); + + constexpr int Native = path::system_style() == path::Style::posix ? 1 : 2; + EXPECT_EQ(path::is_absolute_gnu(std::get<0>(Path), path::Style::native), + std::get(Path)); } }