The correct definition seems to be has_root_directory() for all systems we care about.
PR libstdc++/83891 * include/bits/fs_path.h (path::is_absolute()): Use same definition for all operating systems. * include/experimental/bits/fs_path.h (path::is_absolute()): Likewise. * testsuite/27_io/filesystem/path/query/is_absolute.cc: New. * testsuite/27_io/filesystem/path/query/is_relative.cc: Fix comment. * testsuite/experimental/filesystem/path/query/is_absolute.cc: New. Tested powerpc64le-linux and x86_64-linux, committed to trunk and gcc-8-branch.
commit 82eb5d9bd748708bd0069e2045c2665f56c0e268 Author: Jonathan Wakely <jwak...@redhat.com> Date: Tue May 15 14:32:43 2018 +0100 PR libstdc++/83891 fix path::is_absolute() for non-POSIX targets The correct definition seems to be has_root_directory() for all systems we care about. PR libstdc++/83891 * include/bits/fs_path.h (path::is_absolute()): Use same definition for all operating systems. * include/experimental/bits/fs_path.h (path::is_absolute()): Likewise. * testsuite/27_io/filesystem/path/query/is_absolute.cc: New. * testsuite/27_io/filesystem/path/query/is_relative.cc: Fix comment. * testsuite/experimental/filesystem/path/query/is_absolute.cc: New. diff --git a/libstdc++-v3/include/bits/fs_path.h b/libstdc++-v3/include/bits/fs_path.h index 53bf237b547..51af2891647 100644 --- a/libstdc++-v3/include/bits/fs_path.h +++ b/libstdc++-v3/include/bits/fs_path.h @@ -376,7 +376,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 bool has_filename() const; bool has_stem() const; bool has_extension() const; - bool is_absolute() const; + bool is_absolute() const { return has_root_directory(); } bool is_relative() const { return !is_absolute(); } // generation @@ -1071,16 +1071,6 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 return ext.first && ext.second != string_type::npos; } - inline bool - path::is_absolute() const - { -#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS - return has_root_name(); -#else - return has_root_directory(); -#endif - } - inline path::iterator path::begin() const { diff --git a/libstdc++-v3/include/experimental/bits/fs_path.h b/libstdc++-v3/include/experimental/bits/fs_path.h index 3b4011e6414..ada7c1791aa 100644 --- a/libstdc++-v3/include/experimental/bits/fs_path.h +++ b/libstdc++-v3/include/experimental/bits/fs_path.h @@ -368,7 +368,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 bool has_filename() const; bool has_stem() const; bool has_extension() const; - bool is_absolute() const; + bool is_absolute() const { return has_root_directory(); } bool is_relative() const { return !is_absolute(); } // iterators @@ -999,16 +999,6 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 return ext.first && ext.second != string_type::npos; } - inline bool - path::is_absolute() const - { -#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS - return has_root_name(); -#else - return has_root_directory(); -#endif - } - inline path::iterator path::begin() const { diff --git a/libstdc++-v3/testsuite/27_io/filesystem/path/query/is_absolute.cc b/libstdc++-v3/testsuite/27_io/filesystem/path/query/is_absolute.cc new file mode 100644 index 00000000000..6b5c098489a --- /dev/null +++ b/libstdc++-v3/testsuite/27_io/filesystem/path/query/is_absolute.cc @@ -0,0 +1,62 @@ +// { dg-options "-std=gnu++17 -lstdc++fs" } +// { dg-do run { target c++17 } } +// { dg-require-filesystem-ts "" } + +// Copyright (C) 2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// <http://www.gnu.org/licenses/>. + +// 30.11.7.4.9 path decomposition [fs.path.decompose] + +#include <filesystem> +#include <testsuite_hooks.h> + +using std::filesystem::path; + +void +test01() +{ + VERIFY( path("/").is_absolute() ); + VERIFY( path("/foo").is_absolute() ); + VERIFY( path("/foo/").is_absolute() ); + VERIFY( path("/foo/bar").is_absolute() ); + VERIFY( path("/foo/bar/").is_absolute() ); + VERIFY( ! path("foo").is_absolute() ); + VERIFY( ! path("foo/").is_absolute() ); + VERIFY( ! path("foo/bar").is_absolute() ); + VERIFY( ! path("foo/bar/").is_absolute() ); + VERIFY( ! path("c:").is_absolute() ); + VERIFY( ! path("c:foo").is_absolute() ); + VERIFY( ! path("c:foo/").is_absolute() ); + VERIFY( ! path("c:foo/bar").is_absolute() ); + VERIFY( ! path("c:foo/bar/").is_absolute() ); +#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS + const bool drive_letter_is_root_name = true; +#else + const bool drive_letter_is_root_name = false; +#endif + VERIFY( path("c:/").is_absolute() == drive_letter_is_root_name ); + VERIFY( path("c:/foo").is_absolute() == drive_letter_is_root_name ); + VERIFY( path("c:/foo/").is_absolute() == drive_letter_is_root_name ); + VERIFY( path("c:/foo/bar").is_absolute() == drive_letter_is_root_name ); + VERIFY( path("c:/foo/bar/").is_absolute() == drive_letter_is_root_name ); +} + +int +main() +{ + test01(); +} diff --git a/libstdc++-v3/testsuite/27_io/filesystem/path/query/is_relative.cc b/libstdc++-v3/testsuite/27_io/filesystem/path/query/is_relative.cc index a647e8e831f..d8c09414965 100644 --- a/libstdc++-v3/testsuite/27_io/filesystem/path/query/is_relative.cc +++ b/libstdc++-v3/testsuite/27_io/filesystem/path/query/is_relative.cc @@ -19,7 +19,7 @@ // with this library; see the file COPYING3. If not see // <http://www.gnu.org/licenses/>. -// 8.4.9 path decomposition [path.decompose] +// 30.11.7.4.9 path decomposition [fs.path.decompose] #include <filesystem> #include <testsuite_hooks.h> diff --git a/libstdc++-v3/testsuite/experimental/filesystem/path/query/is_absolute.cc b/libstdc++-v3/testsuite/experimental/filesystem/path/query/is_absolute.cc new file mode 100644 index 00000000000..1b99eaceef4 --- /dev/null +++ b/libstdc++-v3/testsuite/experimental/filesystem/path/query/is_absolute.cc @@ -0,0 +1,62 @@ +// { dg-options "-std=gnu++17 -lstdc++fs" } +// { dg-do run { target c++17 } } +// { dg-require-filesystem-ts "" } + +// Copyright (C) 2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// <http://www.gnu.org/licenses/>. + +// 8.4.9 path decomposition [path.decompose] + +#include <filesystem> +#include <testsuite_hooks.h> + +using std::filesystem::path; + +void +test01() +{ + VERIFY( path("/").is_absolute() ); + VERIFY( path("/foo").is_absolute() ); + VERIFY( path("/foo/").is_absolute() ); + VERIFY( path("/foo/bar").is_absolute() ); + VERIFY( path("/foo/bar/").is_absolute() ); + VERIFY( ! path("foo").is_absolute() ); + VERIFY( ! path("foo/").is_absolute() ); + VERIFY( ! path("foo/bar").is_absolute() ); + VERIFY( ! path("foo/bar/").is_absolute() ); + VERIFY( ! path("c:").is_absolute() ); + VERIFY( ! path("c:foo").is_absolute() ); + VERIFY( ! path("c:foo/").is_absolute() ); + VERIFY( ! path("c:foo/bar").is_absolute() ); + VERIFY( ! path("c:foo/bar/").is_absolute() ); +#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS + const bool drive_letter_is_root_name = true; +#else + const bool drive_letter_is_root_name = false; +#endif + VERIFY( path("c:/").is_absolute() == drive_letter_is_root_name ); + VERIFY( path("c:/foo").is_absolute() == drive_letter_is_root_name ); + VERIFY( path("c:/foo/").is_absolute() == drive_letter_is_root_name ); + VERIFY( path("c:/foo/bar").is_absolute() == drive_letter_is_root_name ); + VERIFY( path("c:/foo/bar/").is_absolute() == drive_letter_is_root_name ); +} + +int +main() +{ + test01(); +}