From: Jonathan Wakely Date: Tue, 15 May 2018 13:50:49 +0000 (+0100) Subject: PR libstdc++/83891 fix path::is_absolute() for non-POSIX targets X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=c3b61fdadd7ffc9ef5c613c2df0ff4edf83ad0fc;p=gcc.git 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 --- 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 + 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 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 +// . + +// 30.11.7.4.9 path decomposition [fs.path.decompose] + +#include +#include + +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 // . -// 8.4.9 path decomposition [path.decompose] +// 30.11.7.4.9 path decomposition [fs.path.decompose] #include #include 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 +// . + +// 8.4.9 path decomposition [path.decompose] + +#include +#include + +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(); +}