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.

Reply via email to