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.