diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2018-05-15 14:50:49 +0100 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2018-05-15 14:50:49 +0100 |
commit | c3b61fdadd7ffc9ef5c613c2df0ff4edf83ad0fc (patch) | |
tree | 064113a38ea4d5f02cc4158ded5fd248667a7056 | |
parent | b0e01682467a22a00530704669d8c253e6dac522 (diff) | |
download | gcc-c3b61fdadd7ffc9ef5c613c2df0ff4edf83ad0fc.tar.gz |
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.
From-SVN: r260259
6 files changed, 135 insertions, 23 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index a68e719fbc8..03d4e51e85c 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,13 @@ 2018-05-15 Jonathan Wakely <jwakely@redhat.com> + 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. + * testsuite/27_io/filesystem/path/decompose/extension.cc: Remove unused <vector> header. * testsuite/27_io/filesystem/path/query/empty.cc: Likewise. 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(); +} |