aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2020-01-13 10:02:39 +0000
committerJonathan Wakely <jwakely@redhat.com>2020-01-13 13:22:48 +0000
commitfe7cc34fd5186cce3771e2bce2f4aacb81b9058c (patch)
treedbae02d79d7687a0835641f25dd1c7cb15032368
parente4379a931d140a71b36eaecceace319837fda321 (diff)
downloadgcc-fe7cc34fd5186cce3771e2bce2f4aacb81b9058c.zip
gcc-fe7cc34fd5186cce3771e2bce2f4aacb81b9058c.tar.gz
gcc-fe7cc34fd5186cce3771e2bce2f4aacb81b9058c.tar.bz2
libstdc++: Ensure root-dir converted to forward slash (PR93244)
PR libstdc++/93244 * include/bits/fs_path.h (path::generic_string<C,A>) [_GLIBCXX_FILESYSTEM_IS_WINDOWS]: Convert root-dir to forward-slash. * testsuite/27_io/filesystem/path/generic/generic_string.cc: Check root-dir is converted to forward slash in generic pathname. * testsuite/27_io/filesystem/path/generic/utf.cc: New test. * testsuite/27_io/filesystem/path/generic/wchar_t.cc: New test.
-rw-r--r--libstdc++-v3/ChangeLog8
-rw-r--r--libstdc++-v3/include/bits/fs_path.h7
-rw-r--r--libstdc++-v3/testsuite/27_io/filesystem/path/generic/generic_string.cc11
-rw-r--r--libstdc++-v3/testsuite/27_io/filesystem/path/generic/utf.cc64
-rw-r--r--libstdc++-v3/testsuite/27_io/filesystem/path/generic/wchar_t.cc64
5 files changed, 154 insertions, 0 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 6d090f4..626f59c 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,5 +1,13 @@
2020-01-13 Jonathan Wakely <jwakely@redhat.com>
+ PR libstdc++/93244
+ * include/bits/fs_path.h (path::generic_string<C,A>)
+ [_GLIBCXX_FILESYSTEM_IS_WINDOWS]: Convert root-dir to forward-slash.
+ * testsuite/27_io/filesystem/path/generic/generic_string.cc: Check
+ root-dir is converted to forward slash in generic pathname.
+ * testsuite/27_io/filesystem/path/generic/utf.cc: New test.
+ * testsuite/27_io/filesystem/path/generic/wchar_t.cc: New test.
+
PR libstdc++/58605
* include/bits/atomic_base.h (__cpp_lib_atomic_value_initialization):
Define.
diff --git a/libstdc++-v3/include/bits/fs_path.h b/libstdc++-v3/include/bits/fs_path.h
index 235408b..bf1f099 100644
--- a/libstdc++-v3/include/bits/fs_path.h
+++ b/libstdc++-v3/include/bits/fs_path.h
@@ -1136,6 +1136,13 @@ namespace __detail
bool __add_slash = false;
for (auto& __elem : *this)
{
+#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS
+ if (__elem._M_type() == _Type::_Root_dir)
+ {
+ __str += __slash;
+ continue;
+ }
+#endif
if (__add_slash)
__str += __slash;
__str += __elem._M_pathname;
diff --git a/libstdc++-v3/testsuite/27_io/filesystem/path/generic/generic_string.cc b/libstdc++-v3/testsuite/27_io/filesystem/path/generic/generic_string.cc
index 676605c..677f5f5 100644
--- a/libstdc++-v3/testsuite/27_io/filesystem/path/generic/generic_string.cc
+++ b/libstdc++-v3/testsuite/27_io/filesystem/path/generic/generic_string.cc
@@ -46,8 +46,19 @@ test01()
VERIFY( path("/a//b//.").generic_string() == "/a/b/." );
}
+void
+test02()
+{
+ // PR libstdc++/93244
+ path p("C:");
+ p += path::preferred_separator;
+ p += "foo/bar";
+ VERIFY( p.generic_string() == "C:/foo/bar" );
+}
+
int
main()
{
test01();
+ test02();
}
diff --git a/libstdc++-v3/testsuite/27_io/filesystem/path/generic/utf.cc b/libstdc++-v3/testsuite/27_io/filesystem/path/generic/utf.cc
new file mode 100644
index 0000000..9a2f579
--- /dev/null
+++ b/libstdc++-v3/testsuite/27_io/filesystem/path/generic/utf.cc
@@ -0,0 +1,64 @@
+// { dg-options "-std=gnu++17" }
+// { dg-do run { target c++17 } }
+
+// Copyright (C) 2017-2020 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/>.
+
+// C++17 30.10.7.4.7 path generic format observers [fs.path.generic.obs]
+
+#include <filesystem>
+#include <testsuite_hooks.h>
+
+using std::filesystem::path;
+
+void
+test01()
+{
+ VERIFY( path().generic_u32string() == U"" );
+ VERIFY( path("/").generic_u32string() == U"/" );
+ VERIFY( path("////").generic_u32string() == U"/" );
+#ifdef __CYGWIN__
+ VERIFY( path("//a").generic_u32string() == U"//a" );
+ VERIFY( path("//a/").generic_u32string() == U"//a/" );
+ VERIFY( path("//a/b").generic_u32string() == U"//a/b" );
+#else
+ VERIFY( path("//a").generic_u32string() == U"/a" );
+ VERIFY( path("//a/").generic_u32string() == U"/a/" );
+ VERIFY( path("//a/b").generic_u32string() == U"/a/b" );
+#endif
+ VERIFY( path("/a//b").generic_u32string() == U"/a/b" );
+ VERIFY( path("/a//b/").generic_u32string() == U"/a/b/" );
+ VERIFY( path("/a//b//").generic_u32string() == U"/a/b/" );
+ VERIFY( path("/a//b//.").generic_u32string() == U"/a/b/." );
+}
+
+void
+test02()
+{
+ // PR libstdc++/93244
+ path p("C:");
+ p += path::preferred_separator;
+ p += "foo/bar";
+ VERIFY( p.generic_u32string() == U"C:/foo/bar" );
+}
+
+int
+main()
+{
+ test01();
+ test02();
+}
diff --git a/libstdc++-v3/testsuite/27_io/filesystem/path/generic/wchar_t.cc b/libstdc++-v3/testsuite/27_io/filesystem/path/generic/wchar_t.cc
new file mode 100644
index 0000000..5dacedc
--- /dev/null
+++ b/libstdc++-v3/testsuite/27_io/filesystem/path/generic/wchar_t.cc
@@ -0,0 +1,64 @@
+// { dg-options "-std=gnu++17" }
+// { dg-do run { target c++17 } }
+
+// Copyright (C) 2017-2020 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/>.
+
+// C++17 30.10.7.4.7 path generic format observers [fs.path.generic.obs]
+
+#include <filesystem>
+#include <testsuite_hooks.h>
+
+using std::filesystem::path;
+
+void
+test01()
+{
+ VERIFY( path().generic_wstring() == L"" );
+ VERIFY( path("/").generic_wstring() == L"/" );
+ VERIFY( path("////").generic_wstring() == L"/" );
+#ifdef __CYGWIN__
+ VERIFY( path("//a").generic_wstring() == L"//a" );
+ VERIFY( path("//a/").generic_wstring() == L"//a/" );
+ VERIFY( path("//a/b").generic_wstring() == L"//a/b" );
+#else
+ VERIFY( path("//a").generic_wstring() == L"/a" );
+ VERIFY( path("//a/").generic_wstring() == L"/a/" );
+ VERIFY( path("//a/b").generic_wstring() == L"/a/b" );
+#endif
+ VERIFY( path("/a//b").generic_wstring() == L"/a/b" );
+ VERIFY( path("/a//b/").generic_wstring() == L"/a/b/" );
+ VERIFY( path("/a//b//").generic_wstring() == L"/a/b/" );
+ VERIFY( path("/a//b//.").generic_wstring() == L"/a/b/." );
+}
+
+void
+test02()
+{
+ // PR libstdc++/93244
+ path p("C:");
+ p += path::preferred_separator;
+ p += "foo/bar";
+ VERIFY( p.generic_wstring() == L"C:/foo/bar" );
+}
+
+int
+main()
+{
+ test01();
+ test02();
+}