https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94063
Bug ID: 94063 Summary: filesystem::path concatenation doesn't work for Windows root-paths Product: gcc Version: 10.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: libstdc++ Assignee: redi at gcc dot gnu.org Reporter: redi at gcc dot gnu.org Target Milestone: --- Target: *-*-mingw* This should pass on mingw* targets, but doesn't. #include <filesystem> #include <assert.h> int main() { path p = L"C"; p += path(L":"); assert( p.has_root_name() ); assert( p.root_name() == p ); p += path(L"\\"); assert( p.has_root_name() ); assert( p.has_root_directory() ); assert( p.root_name() == L"C:" ); assert( p.root_directory() == L"\\" ); p = "C"; p += L':'; assert( p.has_root_name() ); assert( p.root_name() == p ); p += L'\\'; assert( p.has_root_name() ); assert( p.has_root_directory() ); assert( p.root_name() == L"C:" ); assert( p.root_directory() == L"\\" ); p = L"C:"; p += path(L"/foo"); assert( p.has_root_name() ); assert( p.has_root_directory() ); assert( p.root_name() == L"C:" ); assert( p.root_directory() == L"/" ); assert( p.filename() == L"foo" ); p = L"C:"; p += L"/foo"; assert( p.has_root_name() ); assert( p.has_root_directory() ); assert( p.root_name() == L"C:" ); assert( p.root_directory() == L"/" ); assert( p.filename() == L"foo" ); p = L"C"; p += path(L":/foo"); assert( p.has_root_name() ); assert( p.has_root_directory() ); assert( p.root_name() == L"C:" ); assert( p.root_directory() == L"/" ); assert( p.filename() == L"foo" ); p = L"C"; p += L":/foo"; assert( p.has_root_name() ); assert( p.has_root_directory() ); assert( p.root_name() == L"C:" ); assert( p.root_directory() == L"/" ); assert( p.filename() == L"foo" ); } The path concatenation functions fail to account for the cases like "C"+":" which conatenates two filenames to create a root-name, or "C:"+"/" which should add a root-directory to the root-path, but instead does nothing.