summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libstdc++-v3/ChangeLog80
-rw-r--r--libstdc++-v3/acinclude.m434
-rw-r--r--libstdc++-v3/config.h.in6
-rw-r--r--libstdc++-v3/config/abi/pre/gnu.ver52
-rwxr-xr-xlibstdc++-v3/configure128
-rw-r--r--libstdc++-v3/src/c++17/Makefile.am7
-rw-r--r--libstdc++-v3/src/c++17/Makefile.in15
-rw-r--r--libstdc++-v3/src/c++17/cow-fs_dir.cc (renamed from libstdc++-v3/src/filesystem/cow-std-dir.cc)2
-rw-r--r--libstdc++-v3/src/c++17/cow-fs_ops.cc (renamed from libstdc++-v3/src/filesystem/cow-std-ops.cc)2
-rw-r--r--libstdc++-v3/src/c++17/fs_dir.cc (renamed from libstdc++-v3/src/filesystem/std-dir.cc)3
-rw-r--r--libstdc++-v3/src/c++17/fs_ops.cc (renamed from libstdc++-v3/src/filesystem/std-ops.cc)282
-rw-r--r--libstdc++-v3/src/filesystem/Makefile.am6
-rw-r--r--libstdc++-v3/src/filesystem/Makefile.in12
-rw-r--r--libstdc++-v3/src/filesystem/dir-common.h12
-rw-r--r--libstdc++-v3/src/filesystem/dir.cc5
-rw-r--r--libstdc++-v3/src/filesystem/ops-common.h306
-rw-r--r--libstdc++-v3/src/filesystem/ops.cc5
-rw-r--r--libstdc++-v3/testsuite/27_io/filesystem/directory_entry/86597.cc2
-rw-r--r--libstdc++-v3/testsuite/27_io/filesystem/directory_entry/lwg3171.cc2
-rw-r--r--libstdc++-v3/testsuite/27_io/filesystem/file_status/1.cc2
-rw-r--r--libstdc++-v3/testsuite/27_io/filesystem/filesystem_error/cons.cc2
-rw-r--r--libstdc++-v3/testsuite/27_io/filesystem/filesystem_error/copy.cc2
-rw-r--r--libstdc++-v3/testsuite/27_io/filesystem/iterators/directory_iterator.cc2
-rw-r--r--libstdc++-v3/testsuite/27_io/filesystem/iterators/pop.cc2
-rw-r--r--libstdc++-v3/testsuite/27_io/filesystem/iterators/recursive_directory_iterator.cc2
-rw-r--r--libstdc++-v3/testsuite/27_io/filesystem/operations/absolute.cc2
-rw-r--r--libstdc++-v3/testsuite/27_io/filesystem/operations/canonical.cc2
-rw-r--r--libstdc++-v3/testsuite/27_io/filesystem/operations/copy.cc2
-rw-r--r--libstdc++-v3/testsuite/27_io/filesystem/operations/copy_file.cc2
-rw-r--r--libstdc++-v3/testsuite/27_io/filesystem/operations/create_directories.cc2
-rw-r--r--libstdc++-v3/testsuite/27_io/filesystem/operations/create_directory.cc2
-rw-r--r--libstdc++-v3/testsuite/27_io/filesystem/operations/create_symlink.cc2
-rw-r--r--libstdc++-v3/testsuite/27_io/filesystem/operations/current_path.cc2
-rw-r--r--libstdc++-v3/testsuite/27_io/filesystem/operations/equivalent.cc2
-rw-r--r--libstdc++-v3/testsuite/27_io/filesystem/operations/exists.cc2
-rw-r--r--libstdc++-v3/testsuite/27_io/filesystem/operations/file_size.cc2
-rw-r--r--libstdc++-v3/testsuite/27_io/filesystem/operations/is_empty.cc2
-rw-r--r--libstdc++-v3/testsuite/27_io/filesystem/operations/last_write_time.cc2
-rw-r--r--libstdc++-v3/testsuite/27_io/filesystem/operations/permissions.cc2
-rw-r--r--libstdc++-v3/testsuite/27_io/filesystem/operations/proximate.cc2
-rw-r--r--libstdc++-v3/testsuite/27_io/filesystem/operations/read_symlink.cc2
-rw-r--r--libstdc++-v3/testsuite/27_io/filesystem/operations/relative.cc2
-rw-r--r--libstdc++-v3/testsuite/27_io/filesystem/operations/remove.cc2
-rw-r--r--libstdc++-v3/testsuite/27_io/filesystem/operations/remove_all.cc2
-rw-r--r--libstdc++-v3/testsuite/27_io/filesystem/operations/space.cc2
-rw-r--r--libstdc++-v3/testsuite/27_io/filesystem/operations/status.cc2
-rw-r--r--libstdc++-v3/testsuite/27_io/filesystem/operations/symlink_status.cc2
-rw-r--r--libstdc++-v3/testsuite/27_io/filesystem/operations/temp_directory_path.cc2
-rw-r--r--libstdc++-v3/testsuite/27_io/filesystem/operations/weakly_canonical.cc2
49 files changed, 692 insertions, 329 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index dd893977340..7d21d89ba95 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,6 +1,86 @@
2019-01-06 Jonathan Wakely <jwakely@redhat.com>
PR libstdc++/86756
+ * acinclude.m4 (GLIBCXX_CHECK_FILESYSTEM_DEPS): Check for utime and
+ lstat and define _GLIBCXX_USE_UTIME and _GLIBCXX_USE_LSTAT.
+ * config.h.in: Regenerate.
+ * config/abi/pre/gnu.ver (GLIBCXX_3.4.26): Export symbols for
+ remaining std::filesystem types and functions.
+ * configure: Regenerate.
+ * src/c++17/Makefile.am: Add C++17 filesystem sources.
+ * src/c++17/Makefile.in: Regenerate.
+ * src/c++17/cow-fs_dir.cc: Move src/filesystem/cow-std-dir.cc to
+ here, and change name of included file.
+ * src/c++17/cow-fs_ops.cc: Move src/filesystem/cow-std-ops.cc to
+ here, and change name of included file.
+ * src/c++17/fs_dir.cc: Move src/filesystem/std-dir.cc to here. Change
+ path to dir-common.h.
+ * src/c++17/fs_ops.cc: Move src/filesystem/std-ops.cc to here. Change
+ path to ops-common.h. Disable -Wunused-parameter warnings.
+ (internal_file_clock): Define unconditionally.
+ [!_GLIBCXX_HAVE_SYS_STAT_H] (internal_file_clock::from_stat): Do not
+ define.
+ (do_copy_file, do_space): Move definitions to ops.common.h.
+ (copy, file_size, hard_link_count, last_write_time, space): Only
+ perform operation when _GLIBCXX_HAVE_SYS_STAT_H is defined, otherwise
+ report an error.
+ (last_write_time, read_symlink): Remove unused attributes from
+ parameters.
+ * src/filesystem/Makefile.am: Remove C++17 filesystem sources.
+ * src/filesystem/Makefile.in: Regenerate.
+ * src/filesystem/cow-std-dir.cc: Move to src/c++17/cow-fs_dir.cc.
+ * src/filesystem/cow-std-ops.cc: Move to src/c++17/cow-fs_ops.cc.
+ * src/filesystem/std-dir.cc: Move to src/c++17/fs_dir.cc.
+ * src/filesystem/std-ops.cc: Move to src/c++17/fs_ops.cc.
+ * src/filesystem/dir-common.h [!_GLIBCXX_HAVE_DIRENT_H]: Define
+ dummy types and functions instead of using #error.
+ * src/filesystem/dir.cc [!_GLIBCXX_HAVE_DIRENT_H]: Use #error.
+ * src/filesystem/ops-common.h [!_GLIBCXX_USE_LSTAT] (lstat): Define
+ in terms of stat.
+ [!_GLIBCXX_HAVE_UNISTD_H]: Define dummy types and functions.
+ (do_copy_file, do_space): Move definitions here from std-ops.cc.
+ * src/filesystem/ops.cc: Adjust calls to do_copy_file and do_space
+ to account for new namespace.
+ * testsuite/27_io/filesystem/directory_entry/86597.cc: Remove
+ -lstdc++fs from dg-options.
+ * testsuite/27_io/filesystem/directory_entry/lwg3171.cc: Likewise.
+ * testsuite/27_io/filesystem/file_status/1.cc: Likewise.
+ * testsuite/27_io/filesystem/filesystem_error/cons.cc: Likewise.
+ * testsuite/27_io/filesystem/filesystem_error/copy.cc: Likewise.
+ * testsuite/27_io/filesystem/iterators/directory_iterator.cc:
+ Likewise.
+ * testsuite/27_io/filesystem/iterators/pop.cc: Likewise.
+ * testsuite/27_io/filesystem/iterators/recursive_directory_iterator.cc:
+ Likewise.
+ * testsuite/27_io/filesystem/operations/absolute.cc: Likewise.
+ * testsuite/27_io/filesystem/operations/canonical.cc: Likewise.
+ * testsuite/27_io/filesystem/operations/copy.cc: Likewise.
+ * testsuite/27_io/filesystem/operations/copy_file.cc: Likewise.
+ * testsuite/27_io/filesystem/operations/create_directories.cc:
+ Likewise.
+ * testsuite/27_io/filesystem/operations/create_directory.cc: Likewise.
+ * testsuite/27_io/filesystem/operations/create_symlink.cc: Likewise.
+ * testsuite/27_io/filesystem/operations/current_path.cc: Likewise.
+ * testsuite/27_io/filesystem/operations/equivalent.cc: Likewise.
+ * testsuite/27_io/filesystem/operations/exists.cc: Likewise.
+ * testsuite/27_io/filesystem/operations/file_size.cc: Likewise.
+ * testsuite/27_io/filesystem/operations/is_empty.cc: Likewise.
+ * testsuite/27_io/filesystem/operations/last_write_time.cc: Likewise.
+ * testsuite/27_io/filesystem/operations/permissions.cc: Likewise.
+ * testsuite/27_io/filesystem/operations/proximate.cc: Likewise.
+ * testsuite/27_io/filesystem/operations/read_symlink.cc: Likewise.
+ * testsuite/27_io/filesystem/operations/relative.cc: Likewise.
+ * testsuite/27_io/filesystem/operations/remove.cc: Likewise.
+ * testsuite/27_io/filesystem/operations/remove_all.cc: Likewise.
+ * testsuite/27_io/filesystem/operations/space.cc: Likewise.
+ * testsuite/27_io/filesystem/operations/status.cc: Likewise.
+ * testsuite/27_io/filesystem/operations/symlink_status.cc: Likewise.
+ * testsuite/27_io/filesystem/operations/temp_directory_path.cc:
+ Likewise.
+ * testsuite/27_io/filesystem/operations/weakly_canonical.cc: Likewise.
+
+
+ PR libstdc++/86756
* config/abi/pre/gnu.ver (GLIBCXX_3.4): Make various patterns for
typeinfo and vtables less greedy.
(GLIBCXX_3.4.26): Export symbols for std::filesystem::path.
diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4
index 6bcd29dc8c3..ce91e495fab 100644
--- a/libstdc++-v3/acinclude.m4
+++ b/libstdc++-v3/acinclude.m4
@@ -4452,6 +4452,40 @@ dnl
fi
AC_MSG_RESULT($glibcxx_cv_utimensat)
dnl
+ AC_MSG_CHECKING([for utime])
+ AC_CACHE_VAL(glibcxx_cv_utime, [dnl
+ GCC_TRY_COMPILE_OR_LINK(
+ [
+ #include <utime.h>
+ ],
+ [
+ struct utimbuf t = { 1, 1 };
+ int i = utime("path", &t);
+ ],
+ [glibcxx_cv_utime=yes],
+ [glibcxx_cv_utime=no])
+ ])
+ if test $glibcxx_cv_utime = yes; then
+ AC_DEFINE(_GLIBCXX_USE_UTIME, 1, [Define if utime is available in <utime.h>.])
+ fi
+ AC_MSG_RESULT($glibcxx_cv_utime)
+dnl
+ AC_MSG_CHECKING([for lstat])
+ AC_CACHE_VAL(glibcxx_cv_lstat, [dnl
+ GCC_TRY_COMPILE_OR_LINK(
+ [ #include <sys/stat.h> ],
+ [
+ struct stat st;
+ int i = lstat("path", &st);
+ ],
+ [glibcxx_cv_lstat=yes],
+ [glibcxx_cv_lstat=no])
+ ])
+ if test $glibcxx_cv_lstat = yes; then
+ AC_DEFINE(_GLIBCXX_USE_LSTAT, 1, [Define if lstat is available in <sys/stat.h>.])
+ fi
+ AC_MSG_RESULT($glibcxx_cv_lstat)
+dnl
AC_MSG_CHECKING([for struct stat.st_mtim.tv_nsec])
AC_CACHE_VAL(glibcxx_cv_st_mtim, [dnl
GCC_TRY_COMPILE_OR_LINK(
diff --git a/libstdc++-v3/config.h.in b/libstdc++-v3/config.h.in
index 9c45c8c6628..97b5eed0a9a 100644
--- a/libstdc++-v3/config.h.in
+++ b/libstdc++-v3/config.h.in
@@ -970,6 +970,9 @@
/* Define if code specialized for long long should be used. */
#undef _GLIBCXX_USE_LONG_LONG
+/* Define if lstat is available in <sys/stat.h>. */
+#undef _GLIBCXX_USE_LSTAT
+
/* Defined if nanosleep is available. */
#undef _GLIBCXX_USE_NANOSLEEP
@@ -1010,6 +1013,9 @@
/* Define if obsolescent tmpnam is available in <stdio.h>. */
#undef _GLIBCXX_USE_TMPNAM
+/* Define if utime is available in <utime.h>. */
+#undef _GLIBCXX_USE_UTIME
+
/* Define if utimensat and UTIME_OMIT are available in <sys/stat.h> and
AT_FDCWD in <fcntl.h>. */
#undef _GLIBCXX_USE_UTIMENSAT
diff --git a/libstdc++-v3/config/abi/pre/gnu.ver b/libstdc++-v3/config/abi/pre/gnu.ver
index f83d2b1cca9..20325bf7a33 100644
--- a/libstdc++-v3/config/abi/pre/gnu.ver
+++ b/libstdc++-v3/config/abi/pre/gnu.ver
@@ -2167,6 +2167,58 @@ GLIBCXX_3.4.26 {
_ZNSt10filesystem7__cxx114pathpLERKS1_;
_ZT[IV]NSt10filesystem7__cxx1116filesystem_errorE;
+ _ZNSt10filesystem10equivalent*;
+ _ZNSt10filesystem10remove_all*;
+ _ZNSt10filesystem11permissions*;
+ _ZNSt10filesystem12current_path*;
+ _ZNSt10filesystem12read_symlink*;
+ _ZNSt10filesystem14create_symlink*;
+ _ZNSt10filesystem14symlink_status*;
+ _ZNSt10filesystem15last_write_time*;
+ _ZNSt10filesystem16create_directory*;
+ _ZNSt10filesystem16create_hard_link*;
+ _ZNSt10filesystem16weakly_canonical*;
+ _ZNSt10filesystem18create_directories*;
+ _ZNSt10filesystem19temp_directory_path*;
+ _ZNSt10filesystem24create_directory_symlink*;
+ _ZNSt10filesystem4copy*;
+ _ZNSt10filesystem5space*;
+ _ZNSt10filesystem6remove*;
+ _ZNSt10filesystem6status*;
+ _ZNSt10filesystem8absolute*;
+ _ZNSt10filesystem8is_empty*;
+ _ZNSt10filesystem8relative*;
+ _ZNSt10filesystem9canonical*;
+ _ZNSt10filesystem9copy_file*;
+ _ZNSt10filesystem9file_size*;
+ _ZNSt10filesystem9proximate*;
+
+ _ZNKSt10filesystem18directory_iteratordeEv;
+ _ZNKSt10filesystem28recursive_directory_iterator5depthEv;
+ _ZNKSt10filesystem28recursive_directory_iteratordeEv;
+ _ZNSt10filesystem18directory_iteratorC[12]ERKNS_4pathENS_17directory_optionsEPSt10error_code;
+ _ZNSt10filesystem18directory_iteratorppEv;
+ _ZNSt10filesystem28recursive_directory_iterator3popERSt10error_code;
+ _ZNSt10filesystem28recursive_directory_iterator3popEv;
+ _ZNSt10filesystem28recursive_directory_iterator9incrementERSt10error_code;
+ _ZNSt10filesystem28recursive_directory_iteratorC[12]ERKNS_4pathENS_17directory_optionsEPSt10error_code;
+ _ZNSt10filesystem28recursive_directory_iteratorD[12]Ev;
+ _ZNSt10filesystem28recursive_directory_iteratoraSEOS0_;
+ _ZNSt10filesystem28recursive_directory_iteratorppEv;
+
+ _ZNKSt10filesystem7__cxx1118directory_iteratordeEv;
+ _ZNKSt10filesystem7__cxx1128recursive_directory_iterator5depthEv;
+ _ZNKSt10filesystem7__cxx1128recursive_directory_iteratordeEv;
+ _ZNSt10filesystem7__cxx1118directory_iteratorC[12]ERKNS0_4pathENS_17directory_optionsEPSt10error_code;
+ _ZNSt10filesystem7__cxx1118directory_iteratorppEv;
+ _ZNSt10filesystem7__cxx1128recursive_directory_iterator3popERSt10error_code;
+ _ZNSt10filesystem7__cxx1128recursive_directory_iterator3popEv;
+ _ZNSt10filesystem7__cxx1128recursive_directory_iterator9incrementERSt10error_code;
+ _ZNSt10filesystem7__cxx1128recursive_directory_iteratorC[12]ERKNS0_4pathENS_17directory_optionsEPSt10error_code;
+ _ZNSt10filesystem7__cxx1128recursive_directory_iteratorD[12]Ev;
+ _ZNSt10filesystem7__cxx1128recursive_directory_iteratoraSEOS1_;
+ _ZNSt10filesystem7__cxx1128recursive_directory_iteratorppEv;
+
} GLIBCXX_3.4.25;
# Symbols in the support library (libsupc++) have their own tag.
diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure
index 77805e8680f..e01d900ad0b 100755
--- a/libstdc++-v3/configure
+++ b/libstdc++-v3/configure
@@ -80499,6 +80499,134 @@ $as_echo "#define _GLIBCXX_USE_UTIMENSAT 1" >>confdefs.h
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_utimensat" >&5
$as_echo "$glibcxx_cv_utimensat" >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for utime" >&5
+$as_echo_n "checking for utime... " >&6; }
+ if ${glibcxx_cv_utime+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test x$gcc_no_link = xyes; then
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #include <utime.h>
+
+int
+main ()
+{
+
+ struct utimbuf t = { 1, 1 };
+ int i = utime("path", &t);
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ glibcxx_cv_utime=yes
+else
+ glibcxx_cv_utime=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+else
+ if test x$gcc_no_link = xyes; then
+ as_fn_error $? "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
+fi
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #include <utime.h>
+
+int
+main ()
+{
+
+ struct utimbuf t = { 1, 1 };
+ int i = utime("path", &t);
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+ glibcxx_cv_utime=yes
+else
+ glibcxx_cv_utime=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+
+fi
+
+ if test $glibcxx_cv_utime = yes; then
+
+$as_echo "#define _GLIBCXX_USE_UTIME 1" >>confdefs.h
+
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_utime" >&5
+$as_echo "$glibcxx_cv_utime" >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lstat" >&5
+$as_echo_n "checking for lstat... " >&6; }
+ if ${glibcxx_cv_lstat+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test x$gcc_no_link = xyes; then
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+ #include <sys/stat.h>
+int
+main ()
+{
+
+ struct stat st;
+ int i = lstat("path", &st);
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ glibcxx_cv_lstat=yes
+else
+ glibcxx_cv_lstat=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+else
+ if test x$gcc_no_link = xyes; then
+ as_fn_error $? "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
+fi
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+ #include <sys/stat.h>
+int
+main ()
+{
+
+ struct stat st;
+ int i = lstat("path", &st);
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+ glibcxx_cv_lstat=yes
+else
+ glibcxx_cv_lstat=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+
+fi
+
+ if test $glibcxx_cv_lstat = yes; then
+
+$as_echo "#define _GLIBCXX_USE_LSTAT 1" >>confdefs.h
+
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_lstat" >&5
+$as_echo "$glibcxx_cv_lstat" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct stat.st_mtim.tv_nsec" >&5
$as_echo_n "checking for struct stat.st_mtim.tv_nsec... " >&6; }
if ${glibcxx_cv_st_mtim+:} false; then :
diff --git a/libstdc++-v3/src/c++17/Makefile.am b/libstdc++-v3/src/c++17/Makefile.am
index 85883c33f2d..4200f7f8259 100644
--- a/libstdc++-v3/src/c++17/Makefile.am
+++ b/libstdc++-v3/src/c++17/Makefile.am
@@ -29,7 +29,10 @@ headers =
if ENABLE_DUAL_ABI
extra_string_inst_sources = cow-string-inst.cc
-extra_fs_sources = cow-fs_path.cc
+extra_fs_sources = \
+ cow-fs_dir.cc \
+ cow-fs_ops.cc \
+ cow-fs_path.cc
else
extra_string_inst_sources =
extra_fs_sources =
@@ -45,6 +48,8 @@ inst_sources =
endif
sources = \
+ fs_dir.cc \
+ fs_ops.cc \
fs_path.cc \
memory_resource.cc \
string-inst.cc \
diff --git a/libstdc++-v3/src/c++17/Makefile.in b/libstdc++-v3/src/c++17/Makefile.in
index d76580f08aa..a402d13d516 100644
--- a/libstdc++-v3/src/c++17/Makefile.in
+++ b/libstdc++-v3/src/c++17/Makefile.in
@@ -121,9 +121,10 @@ CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
LTLIBRARIES = $(noinst_LTLIBRARIES)
libc__17convenience_la_LIBADD =
-@ENABLE_DUAL_ABI_TRUE@am__objects_1 = cow-fs_path.lo
-am__objects_2 = fs_path.lo memory_resource.lo string-inst.lo \
- $(am__objects_1)
+@ENABLE_DUAL_ABI_TRUE@am__objects_1 = cow-fs_dir.lo cow-fs_ops.lo \
+@ENABLE_DUAL_ABI_TRUE@ cow-fs_path.lo
+am__objects_2 = fs_dir.lo fs_ops.lo fs_path.lo memory_resource.lo \
+ string-inst.lo $(am__objects_1)
@ENABLE_DUAL_ABI_TRUE@am__objects_3 = cow-string-inst.lo
@ENABLE_EXTERN_TEMPLATE_TRUE@am__objects_4 = $(am__objects_3)
am_libc__17convenience_la_OBJECTS = $(am__objects_2) $(am__objects_4)
@@ -415,7 +416,11 @@ headers =
@ENABLE_DUAL_ABI_FALSE@extra_string_inst_sources =
@ENABLE_DUAL_ABI_TRUE@extra_string_inst_sources = cow-string-inst.cc
@ENABLE_DUAL_ABI_FALSE@extra_fs_sources =
-@ENABLE_DUAL_ABI_TRUE@extra_fs_sources = cow-fs_path.cc
+@ENABLE_DUAL_ABI_TRUE@extra_fs_sources = \
+@ENABLE_DUAL_ABI_TRUE@ cow-fs_dir.cc \
+@ENABLE_DUAL_ABI_TRUE@ cow-fs_ops.cc \
+@ENABLE_DUAL_ABI_TRUE@ cow-fs_path.cc
+
# XTEMPLATE_FLAGS =
@ENABLE_EXTERN_TEMPLATE_FALSE@inst_sources =
@@ -424,6 +429,8 @@ headers =
@ENABLE_EXTERN_TEMPLATE_TRUE@ $(extra_string_inst_sources)
sources = \
+ fs_dir.cc \
+ fs_ops.cc \
fs_path.cc \
memory_resource.cc \
string-inst.cc \
diff --git a/libstdc++-v3/src/filesystem/cow-std-dir.cc b/libstdc++-v3/src/c++17/cow-fs_dir.cc
index a48e99fe6d0..126edab45a2 100644
--- a/libstdc++-v3/src/filesystem/cow-std-dir.cc
+++ b/libstdc++-v3/src/c++17/cow-fs_dir.cc
@@ -23,4 +23,4 @@
// <http://www.gnu.org/licenses/>.
#define _GLIBCXX_USE_CXX11_ABI 0
-#include "std-dir.cc"
+#include "fs_dir.cc"
diff --git a/libstdc++-v3/src/filesystem/cow-std-ops.cc b/libstdc++-v3/src/c++17/cow-fs_ops.cc
index 7e76208b613..e519091da7c 100644
--- a/libstdc++-v3/src/filesystem/cow-std-ops.cc
+++ b/libstdc++-v3/src/c++17/cow-fs_ops.cc
@@ -23,4 +23,4 @@
// <http://www.gnu.org/licenses/>.
#define _GLIBCXX_USE_CXX11_ABI 0
-#include "std-ops.cc"
+#include "fs_ops.cc"
diff --git a/libstdc++-v3/src/filesystem/std-dir.cc b/libstdc++-v3/src/c++17/fs_dir.cc
index a2936fcb8bd..8e6755ead85 100644
--- a/libstdc++-v3/src/filesystem/std-dir.cc
+++ b/libstdc++-v3/src/c++17/fs_dir.cc
@@ -27,14 +27,13 @@
#endif
#include <filesystem>
-#include <experimental/filesystem>
#include <utility>
#include <stack>
#include <string.h>
#include <errno.h>
#define _GLIBCXX_BEGIN_NAMESPACE_FILESYSTEM namespace filesystem {
#define _GLIBCXX_END_NAMESPACE_FILESYSTEM }
-#include "dir-common.h"
+#include "../filesystem/dir-common.h"
namespace fs = std::filesystem;
namespace posix = std::filesystem::__gnu_posix;
diff --git a/libstdc++-v3/src/filesystem/std-ops.cc b/libstdc++-v3/src/c++17/fs_ops.cc
index 8c3ec1d9a9a..fd8cf353ba2 100644
--- a/libstdc++-v3/src/filesystem/std-ops.cc
+++ b/libstdc++-v3/src/c++17/fs_ops.cc
@@ -29,11 +29,9 @@
#endif
#include <filesystem>
-#include <experimental/filesystem>
#include <functional>
#include <ostream>
#include <stack>
-#include <ext/stdio_filebuf.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
@@ -47,9 +45,6 @@
#ifdef _GLIBCXX_HAVE_SYS_STATVFS_H
# include <sys/statvfs.h> // statvfs
#endif
-#ifdef _GLIBCXX_USE_SENDFILE
-# include <sys/sendfile.h> // sendfile
-#endif
#if !_GLIBCXX_USE_UTIMENSAT && _GLIBCXX_HAVE_UTIME_H
# include <utime.h> // utime
#endif
@@ -59,7 +54,9 @@
#define _GLIBCXX_BEGIN_NAMESPACE_FILESYSTEM namespace filesystem {
#define _GLIBCXX_END_NAMESPACE_FILESYSTEM }
-#include "ops-common.h"
+#include "../filesystem/ops-common.h"
+
+#pragma GCC diagnostic ignored "-Wunused-parameter"
namespace fs = std::filesystem;
namespace posix = std::filesystem::__gnu_posix;
@@ -274,8 +271,6 @@ namespace std::filesystem
}
}
-#ifdef _GLIBCXX_HAVE_SYS_STAT_H
-
namespace
{
struct internal_file_clock : fs::__file_clock
@@ -283,6 +278,7 @@ namespace
using __file_clock::_S_to_sys;
using __file_clock::_S_from_sys;
+#ifdef _GLIBCXX_HAVE_SYS_STAT_H
static fs::file_time_type
from_stat(const fs::stat_type& st, std::error_code& ec) noexcept
{
@@ -291,209 +287,15 @@ namespace
return fs::file_time_type::min();
return _S_from_sys(sys_time);
}
- };
-}
-
-#ifdef NEED_DO_COPY_FILE
-bool
-fs::do_copy_file(const path::value_type* from, const path::value_type* to,
- copy_options_existing_file options,
- stat_type* from_st, stat_type* to_st,
- std::error_code& ec) noexcept
-{
- stat_type st1, st2;
- fs::file_status t, f;
-
- if (to_st == nullptr)
- {
- if (posix::stat(to, &st1))
- {
- const int err = errno;
- if (!is_not_found_errno(err))
- {
- ec.assign(err, std::generic_category());
- return false;
- }
- }
- else
- to_st = &st1;
- }
- else if (to_st == from_st)
- to_st = nullptr;
-
- if (to_st == nullptr)
- t = fs::file_status{fs::file_type::not_found};
- else
- t = make_file_status(*to_st);
-
- if (from_st == nullptr)
- {
- if (posix::stat(from, &st2))
- {
- ec.assign(errno, std::generic_category());
- return false;
- }
- else
- from_st = &st2;
- }
- f = make_file_status(*from_st);
- // _GLIBCXX_RESOLVE_LIB_DEFECTS
- // 2712. copy_file() has a number of unspecified error conditions
- if (!is_regular_file(f))
- {
- ec = std::make_error_code(std::errc::not_supported);
- return false;
- }
-
- if (exists(t))
- {
- if (!is_regular_file(t))
- {
- ec = std::make_error_code(std::errc::not_supported);
- return false;
- }
-
- if (to_st->st_dev == from_st->st_dev
- && to_st->st_ino == from_st->st_ino)
- {
- ec = std::make_error_code(std::errc::file_exists);
- return false;
- }
-
- if (options.skip)
- {
- ec.clear();
- return false;
- }
- else if (options.update)
- {
- const auto from_mtime = internal_file_clock::from_stat(*from_st, ec);
- if (ec)
- return false;
- if ((from_mtime <= internal_file_clock::from_stat(*to_st, ec)) || ec)
- return false;
- }
- else if (!options.overwrite)
- {
- ec = std::make_error_code(std::errc::file_exists);
- return false;
- }
- else if (!is_regular_file(t))
- {
- ec = std::make_error_code(std::errc::not_supported);
- return false;
- }
- }
-
- struct CloseFD {
- ~CloseFD() { if (fd != -1) posix::close(fd); }
- bool close() { return posix::close(std::exchange(fd, -1)) == 0; }
- int fd;
- };
-
- CloseFD in = { posix::open(from, O_RDONLY) };
- if (in.fd == -1)
- {
- ec.assign(errno, std::generic_category());
- return false;
- }
- int oflag = O_WRONLY|O_CREAT;
- if (options.overwrite || options.update)
- oflag |= O_TRUNC;
- else
- oflag |= O_EXCL;
- CloseFD out = { posix::open(to, oflag, S_IWUSR) };
- if (out.fd == -1)
- {
- if (errno == EEXIST && options.skip)
- ec.clear();
- else
- ec.assign(errno, std::generic_category());
- return false;
- }
-
-#if defined _GLIBCXX_USE_FCHMOD && ! defined _GLIBCXX_FILESYSTEM_IS_WINDOWS
- if (::fchmod(out.fd, from_st->st_mode))
-#elif defined _GLIBCXX_USE_FCHMODAT && ! defined _GLIBCXX_FILESYSTEM_IS_WINDOWS
- if (::fchmodat(AT_FDCWD, to, from_st->st_mode, 0))
-#else
- if (posix::chmod(to, from_st->st_mode))
#endif
- {
- ec.assign(errno, std::generic_category());
- return false;
- }
-
- size_t count = from_st->st_size;
-#if defined _GLIBCXX_USE_SENDFILE && ! defined _GLIBCXX_FILESYSTEM_IS_WINDOWS
- off_t offset = 0;
- ssize_t n = ::sendfile(out.fd, in.fd, &offset, count);
- if (n < 0 && errno != ENOSYS && errno != EINVAL)
- {
- ec.assign(errno, std::generic_category());
- return false;
- }
- if ((size_t)n == count)
- {
- if (!out.close() || !in.close())
- {
- ec.assign(errno, std::generic_category());
- return false;
- }
- ec.clear();
- return true;
- }
- else if (n > 0)
- count -= n;
-#endif // _GLIBCXX_USE_SENDFILE
-
- using std::ios;
- __gnu_cxx::stdio_filebuf<char> sbin(in.fd, ios::in|ios::binary);
- __gnu_cxx::stdio_filebuf<char> sbout(out.fd, ios::out|ios::binary);
-
- if (sbin.is_open())
- in.fd = -1;
- if (sbout.is_open())
- out.fd = -1;
-
-#ifdef _GLIBCXX_USE_SENDFILE
- if (n != 0)
- {
- if (n < 0)
- n = 0;
-
- const auto p1 = sbin.pubseekoff(n, ios::beg, ios::in);
- const auto p2 = sbout.pubseekoff(n, ios::beg, ios::out);
-
- const std::streampos errpos(std::streamoff(-1));
- if (p1 == errpos || p2 == errpos)
- {
- ec = std::make_error_code(std::errc::io_error);
- return false;
- }
- }
-#endif
-
- if (count && !(std::ostream(&sbout) << &sbin))
- {
- ec = std::make_error_code(std::errc::io_error);
- return false;
- }
- if (!sbout.close() || !sbin.close())
- {
- ec.assign(errno, std::generic_category());
- return false;
- }
- ec.clear();
- return true;
+ };
}
-#endif // NEED_DO_COPY_FILE
-#endif // _GLIBCXX_HAVE_SYS_STAT_H
void
fs::copy(const path& from, const path& to, copy_options options,
error_code& ec)
{
+#ifdef _GLIBCXX_HAVE_SYS_STAT_H
const bool skip_symlinks = is_set(options, copy_options::skip_symlinks);
const bool create_symlinks = is_set(options, copy_options::create_symlinks);
const bool copy_symlinks = is_set(options, copy_options::copy_symlinks);
@@ -591,6 +393,9 @@ fs::copy(const path& from, const path& to, copy_options options,
// 2683. filesystem::copy() says "no effects"
else
ec.clear();
+#else
+ ec = std::make_error_code(std::errc::not_supported);
+#endif
}
bool
@@ -1068,6 +873,7 @@ namespace
std::uintmax_t
fs::file_size(const path& p, error_code& ec) noexcept
{
+#ifdef _GLIBCXX_HAVE_SYS_STAT_H
struct S
{
S(const stat_type& st) : type(make_file_type(st)), size(st.st_size) { }
@@ -1085,6 +891,9 @@ fs::file_size(const path& p, error_code& ec) noexcept
else
ec = std::make_error_code(std::errc::not_supported);
}
+#else
+ ec = std::make_error_code(std::errc::not_supported);
+#endif
return -1;
}
@@ -1101,8 +910,13 @@ fs::hard_link_count(const path& p)
std::uintmax_t
fs::hard_link_count(const path& p, error_code& ec) noexcept
{
+#ifdef _GLIBCXX_HAVE_SYS_STAT_H
return do_stat(p, ec, std::mem_fn(&stat_type::st_nlink),
static_cast<uintmax_t>(-1));
+#else
+ ec = std::make_error_code(std::errc::not_supported);
+ return static_cast<uintmax_t>(-1);
+#endif
}
bool
@@ -1141,11 +955,16 @@ fs::last_write_time(const path& p)
fs::file_time_type
fs::last_write_time(const path& p, error_code& ec) noexcept
{
+#ifdef _GLIBCXX_HAVE_SYS_STAT_H
return do_stat(p, ec,
[&ec](const auto& st) {
return internal_file_clock::from_stat(st, ec);
},
file_time_type::min());
+#else
+ ec = std::make_error_code(std::errc::not_supported);
+ return file_time_type::min();
+#endif
}
void
@@ -1158,7 +977,7 @@ fs::last_write_time(const path& p, file_time_type new_time)
}
void
-fs::last_write_time(const path& p __attribute__((__unused__)),
+fs::last_write_time(const path& p,
file_time_type new_time, error_code& ec) noexcept
{
auto d = internal_file_clock::_S_to_sys(new_time).time_since_epoch();
@@ -1179,7 +998,7 @@ fs::last_write_time(const path& p __attribute__((__unused__)),
ec.assign(errno, std::generic_category());
else
ec.clear();
-#elif _GLIBCXX_HAVE_UTIME_H
+#elif _GLIBCXX_USE_UTIME && _GLIBCXX_HAVE_SYS_STAT_H
posix::utimbuf times;
times.modtime = s.count();
times.actime = do_stat(p, ec, [](const auto& st) { return st.st_atime; },
@@ -1279,7 +1098,7 @@ fs::read_symlink(const path& p)
return tgt;
}
-fs::path fs::read_symlink(const path& p [[gnu::unused]], error_code& ec)
+fs::path fs::read_symlink(const path& p, error_code& ec)
{
path result;
#if defined(_GLIBCXX_HAVE_READLINK) && defined(_GLIBCXX_HAVE_SYS_STAT_H)
@@ -1472,51 +1291,6 @@ fs::space(const path& p)
return s;
}
-#ifdef NEED_DO_SPACE
-void
-fs::do_space(const __gnu_posix::char_type* pathname,
- uintmax_t& capacity, uintmax_t& free, uintmax_t& available,
- std::error_code& ec)
-{
-#ifdef _GLIBCXX_HAVE_SYS_STATVFS_H
- struct ::statvfs f;
- if (::statvfs(pathname, &f))
- ec.assign(errno, std::generic_category());
- else
- {
- if (f.f_frsize != (unsigned long)-1)
- {
- const uintmax_t fragment_size = f.f_frsize;
- const fsblkcnt_t unknown = -1;
- if (f.f_blocks != unknown)
- capacity = f.f_blocks * fragment_size;
- if (f.f_bfree != unknown)
- free = f.f_bfree * fragment_size;
- if (f.f_bavail != unknown)
- available = f.f_bavail * fragment_size;
- }
- ec.clear();
- }
-#elif _GLIBCXX_FILESYSTEM_IS_WINDOWS
- ULARGE_INTEGER bytes_avail = {}, bytes_total = {}, bytes_free = {};
- if (GetDiskFreeSpaceExW(pathname, &bytes_avail, &bytes_total, &bytes_free))
- {
- if (bytes_total.QuadPart != 0)
- capacity = bytes_total.QuadPart;
- if (bytes_free.QuadPart != 0)
- free = bytes_free.QuadPart;
- if (bytes_avail.QuadPart != 0)
- available = bytes_avail.QuadPart;
- ec.clear();
- }
- else
- ec.assign((int)GetLastError(), std::system_category());
-#else
- ec = std::make_error_code(std::errc::not_supported);
-#endif
-}
-#endif // NEED_DO_SPACE
-
fs::space_info
fs::space(const path& p, error_code& ec) noexcept
{
@@ -1525,6 +1299,7 @@ fs::space(const path& p, error_code& ec) noexcept
static_cast<uintmax_t>(-1),
static_cast<uintmax_t>(-1)
};
+#ifdef _GLIBCXX_HAVE_SYS_STAT_H
#if _GLIBCXX_FILESYSTEM_IS_WINDOWS
path dir = absolute(p);
dir.remove_filename();
@@ -1532,7 +1307,10 @@ fs::space(const path& p, error_code& ec) noexcept
#else
auto str = p.c_str();
#endif
+
do_space(str, info.capacity, info.free, info.available, ec);
+#endif // _GLIBCXX_HAVE_SYS_STAT_H
+
return info;
}
diff --git a/libstdc++-v3/src/filesystem/Makefile.am b/libstdc++-v3/src/filesystem/Makefile.am
index 6f2a9f63b8a..af9dcd25f8e 100644
--- a/libstdc++-v3/src/filesystem/Makefile.am
+++ b/libstdc++-v3/src/filesystem/Makefile.am
@@ -30,9 +30,7 @@ if ENABLE_DUAL_ABI
cxx11_abi_sources = \
cow-dir.cc \
cow-ops.cc \
- cow-path.cc \
- cow-std-dir.cc \
- cow-std-ops.cc
+ cow-path.cc
else
cxx11_abi_sources =
endif
@@ -41,8 +39,6 @@ sources = \
dir.cc \
ops.cc \
path.cc \
- std-dir.cc \
- std-ops.cc \
${cxx11_abi_sources}
# vpath % $(top_srcdir)/src/filesystem
diff --git a/libstdc++-v3/src/filesystem/Makefile.in b/libstdc++-v3/src/filesystem/Makefile.in
index 12524ff1cc6..d3cb3683245 100644
--- a/libstdc++-v3/src/filesystem/Makefile.in
+++ b/libstdc++-v3/src/filesystem/Makefile.in
@@ -150,10 +150,8 @@ am__installdirs = "$(DESTDIR)$(toolexeclibdir)"
LTLIBRARIES = $(toolexeclib_LTLIBRARIES)
libstdc__fs_la_LIBADD =
@ENABLE_DUAL_ABI_TRUE@am__objects_1 = cow-dir.lo cow-ops.lo \
-@ENABLE_DUAL_ABI_TRUE@ cow-path.lo cow-std-dir.lo \
-@ENABLE_DUAL_ABI_TRUE@ cow-std-ops.lo
-am__objects_2 = dir.lo ops.lo path.lo std-dir.lo std-ops.lo \
- $(am__objects_1)
+@ENABLE_DUAL_ABI_TRUE@ cow-path.lo
+am__objects_2 = dir.lo ops.lo path.lo $(am__objects_1)
am_libstdc__fs_la_OBJECTS = $(am__objects_2)
libstdc__fs_la_OBJECTS = $(am_libstdc__fs_la_OBJECTS)
AM_V_lt = $(am__v_lt_@AM_V@)
@@ -442,16 +440,12 @@ headers =
@ENABLE_DUAL_ABI_TRUE@cxx11_abi_sources = \
@ENABLE_DUAL_ABI_TRUE@ cow-dir.cc \
@ENABLE_DUAL_ABI_TRUE@ cow-ops.cc \
-@ENABLE_DUAL_ABI_TRUE@ cow-path.cc \
-@ENABLE_DUAL_ABI_TRUE@ cow-std-dir.cc \
-@ENABLE_DUAL_ABI_TRUE@ cow-std-ops.cc
+@ENABLE_DUAL_ABI_TRUE@ cow-path.cc
sources = \
dir.cc \
ops.cc \
path.cc \
- std-dir.cc \
- std-ops.cc \
${cxx11_abi_sources}
diff --git a/libstdc++-v3/src/filesystem/dir-common.h b/libstdc++-v3/src/filesystem/dir-common.h
index bcfbfcd0bea..6ec798c9aa0 100644
--- a/libstdc++-v3/src/filesystem/dir-common.h
+++ b/libstdc++-v3/src/filesystem/dir-common.h
@@ -26,6 +26,7 @@
#define _GLIBCXX_DIR_COMMON_H 1
#include <string.h> // strcmp
+#include <errno.h>
#if _GLIBCXX_FILESYSTEM_IS_WINDOWS
#include <wchar.h> // wcscmp
#endif
@@ -34,8 +35,6 @@
# include <sys/types.h>
# endif
# include <dirent.h>
-#else
-# error "the <dirent.h> header is needed to build the Filesystem TS"
#endif
namespace std _GLIBCXX_VISIBILITY(default)
@@ -53,13 +52,20 @@ using dirent = _wdirent;
inline DIR* opendir(const wchar_t* path) { return ::_wopendir(path); }
inline dirent* readdir(DIR* dir) { return ::_wreaddir(dir); }
inline int closedir(DIR* dir) { return ::_wclosedir(dir); }
-#else
+#elif defined _GLIBCXX_HAVE_DIRENT_H
using char_type = char;
using DIR = ::DIR;
typedef struct ::dirent dirent;
using ::opendir;
using ::readdir;
using ::closedir;
+#else
+using char_type = char;
+struct dirent { const char* d_name; };
+struct DIR { };
+inline DIR* opendir(const char*) { return nullptr; }
+inline dirent* readdir(DIR*) { return nullptr; }
+inline int closedir(DIR*) { return -1; }
#endif
} // namespace __gnu_posix
diff --git a/libstdc++-v3/src/filesystem/dir.cc b/libstdc++-v3/src/filesystem/dir.cc
index 0738ea784f7..3e6e598fa64 100644
--- a/libstdc++-v3/src/filesystem/dir.cc
+++ b/libstdc++-v3/src/filesystem/dir.cc
@@ -27,6 +27,11 @@
#endif
#include <experimental/filesystem>
+
+#ifndef _GLIBCXX_HAVE_DIRENT_H
+# error "the <dirent.h> header is needed to build the Filesystem TS"
+#endif
+
#include <utility>
#include <stack>
#include <string.h>
diff --git a/libstdc++-v3/src/filesystem/ops-common.h b/libstdc++-v3/src/filesystem/ops-common.h
index 1c0d650f444..f20867c217e 100644
--- a/libstdc++-v3/src/filesystem/ops-common.h
+++ b/libstdc++-v3/src/filesystem/ops-common.h
@@ -42,6 +42,14 @@
# include <wchar.h>
#endif
+#ifdef NEED_DO_COPY_FILE
+# include <filesystem>
+# include <ext/stdio_filebuf.h>
+# ifdef _GLIBCXX_USE_SENDFILE
+# include <sys/sendfile.h> // sendfile
+# endif
+#endif
+
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
@@ -108,26 +116,42 @@ namespace __gnu_posix
return ret;
}
using char_type = wchar_t;
-#else // _GLIBCXX_FILESYSTEM_IS_WINDOWS
+#elif defined _GLIBCXX_HAVE_UNISTD_H
using ::open;
using ::close;
-#ifdef _GLIBCXX_HAVE_SYS_STAT_H
+# ifdef _GLIBCXX_HAVE_SYS_STAT_H
typedef struct ::stat stat_type;
using ::stat;
+# ifdef _GLIBCXX_USE_LSTAT
using ::lstat;
-#endif
+# else
+ inline int lstat(const char* path, stat_type* buffer)
+ { return stat(path, buffer); }
+# endif
+# endif
using ::mode_t;
using ::chmod;
using ::mkdir;
using ::getcwd;
using ::chdir;
-#if !_GLIBCXX_USE_UTIMENSAT && _GLIBCXX_HAVE_UTIME_H
+# if !_GLIBCXX_USE_UTIMENSAT && _GLIBCXX_USE_UTIME
using ::utimbuf;
using ::utime;
-#endif
+# endif
using ::rename;
using ::truncate;
using char_type = char;
+#else // ! _GLIBCXX_FILESYSTEM_IS_WINDOWS && ! _GLIBCXX_HAVE_UNISTD_H
+ inline int open(const char*, int, ...) { errno = ENOTSUP; return -1; }
+ inline int close(int) { errno = ENOTSUP; return -1; }
+ using mode_t = int;
+ inline int chmod(const char*, mode_t) { errno = ENOTSUP; return -1; }
+ inline int mkdir(const char*, mode_t) { errno = ENOTSUP; return -1; }
+ inline char* getcwd(char*, size_t) { errno = ENOTSUP; return nullptr; }
+ inline int chdir(const char*) { errno = ENOTSUP; return -1; }
+ inline int rename(const char*, const char*) { errno = ENOTSUP; return -1; }
+ inline int truncate(const char*, long) { errno = ENOTSUP; return -1; }
+ using char_type = char;
#endif // _GLIBCXX_FILESYSTEM_IS_WINDOWS
} // namespace __gnu_posix
@@ -190,18 +214,6 @@ namespace __gnu_posix
bool skip, update, overwrite;
};
- bool
- do_copy_file(const __gnu_posix::char_type* from,
- const __gnu_posix::char_type* to,
- copy_options_existing_file options,
- stat_type* from_st, stat_type* to_st,
- std::error_code& ec) noexcept;
-
- void
- do_space(const __gnu_posix::char_type* pathname,
- uintmax_t& capacity, uintmax_t& free, uintmax_t& available,
- std::error_code&);
-
#endif // _GLIBCXX_HAVE_SYS_STAT_H
} // namespace filesystem
@@ -211,6 +223,19 @@ _GLIBCXX_BEGIN_NAMESPACE_FILESYSTEM
#ifdef _GLIBCXX_HAVE_SYS_STAT_H
using std::filesystem::__gnu_posix::stat_type;
+ using std::filesystem::__gnu_posix::char_type;
+
+ bool
+ do_copy_file(const char_type* from, const char_type* to,
+ std::filesystem::copy_options_existing_file options,
+ stat_type* from_st, stat_type* to_st,
+ std::error_code& ec) noexcept;
+
+ void
+ do_space(const char_type* pathname,
+ uintmax_t& capacity, uintmax_t& free, uintmax_t& available,
+ std::error_code&);
+
inline file_type
make_file_type(const stat_type& st) noexcept
@@ -257,6 +282,253 @@ _GLIBCXX_BEGIN_NAMESPACE_FILESYSTEM
is_set(opt, copy_options::overwrite_existing)
};
}
+
+#ifdef NEED_DO_COPY_FILE
+ bool
+ do_copy_file(const char_type* from, const char_type* to,
+ std::filesystem::copy_options_existing_file options,
+ stat_type* from_st, stat_type* to_st,
+ std::error_code& ec) noexcept
+ {
+ namespace fs = std::filesystem;
+ namespace posix = fs::__gnu_posix;
+
+ stat_type st1, st2;
+ file_status t, f;
+
+ if (to_st == nullptr)
+ {
+ if (posix::stat(to, &st1))
+ {
+ const int err = errno;
+ if (!fs::is_not_found_errno(err))
+ {
+ ec.assign(err, std::generic_category());
+ return false;
+ }
+ }
+ else
+ to_st = &st1;
+ }
+ else if (to_st == from_st)
+ to_st = nullptr;
+
+ if (to_st == nullptr)
+ t = file_status{file_type::not_found};
+ else
+ t = make_file_status(*to_st);
+
+ if (from_st == nullptr)
+ {
+ if (posix::stat(from, &st2))
+ {
+ ec.assign(errno, std::generic_category());
+ return false;
+ }
+ else
+ from_st = &st2;
+ }
+ f = make_file_status(*from_st);
+ // _GLIBCXX_RESOLVE_LIB_DEFECTS
+ // 2712. copy_file() has a number of unspecified error conditions
+ if (!is_regular_file(f))
+ {
+ ec = std::make_error_code(std::errc::not_supported);
+ return false;
+ }
+
+ if (exists(t))
+ {
+ if (!is_regular_file(t))
+ {
+ ec = std::make_error_code(std::errc::not_supported);
+ return false;
+ }
+
+ if (to_st->st_dev == from_st->st_dev
+ && to_st->st_ino == from_st->st_ino)
+ {
+ ec = std::make_error_code(std::errc::file_exists);
+ return false;
+ }
+
+ if (options.skip)
+ {
+ ec.clear();
+ return false;
+ }
+ else if (options.update)
+ {
+ const auto from_mtime = fs::file_time(*from_st, ec);
+ if (ec)
+ return false;
+ if ((from_mtime <= fs::file_time(*to_st, ec)) || ec)
+ return false;
+ }
+ else if (!options.overwrite)
+ {
+ ec = std::make_error_code(std::errc::file_exists);
+ return false;
+ }
+ else if (!is_regular_file(t))
+ {
+ ec = std::make_error_code(std::errc::not_supported);
+ return false;
+ }
+ }
+
+ struct CloseFD {
+ ~CloseFD() { if (fd != -1) posix::close(fd); }
+ bool close() { return posix::close(std::exchange(fd, -1)) == 0; }
+ int fd;
+ };
+
+ CloseFD in = { posix::open(from, O_RDONLY) };
+ if (in.fd == -1)
+ {
+ ec.assign(errno, std::generic_category());
+ return false;
+ }
+ int oflag = O_WRONLY|O_CREAT;
+ if (options.overwrite || options.update)
+ oflag |= O_TRUNC;
+ else
+ oflag |= O_EXCL;
+ CloseFD out = { posix::open(to, oflag, S_IWUSR) };
+ if (out.fd == -1)
+ {
+ if (errno == EEXIST && options.skip)
+ ec.clear();
+ else
+ ec.assign(errno, std::generic_category());
+ return false;
+ }
+
+#if defined _GLIBCXX_USE_FCHMOD && ! defined _GLIBCXX_FILESYSTEM_IS_WINDOWS
+ if (::fchmod(out.fd, from_st->st_mode))
+#elif defined _GLIBCXX_USE_FCHMODAT && ! defined _GLIBCXX_FILESYSTEM_IS_WINDOWS
+ if (::fchmodat(AT_FDCWD, to, from_st->st_mode, 0))
+#else
+ if (posix::chmod(to, from_st->st_mode))
+#endif
+ {
+ ec.assign(errno, std::generic_category());
+ return false;
+ }
+
+ size_t count = from_st->st_size;
+#if defined _GLIBCXX_USE_SENDFILE && ! defined _GLIBCXX_FILESYSTEM_IS_WINDOWS
+ off_t offset = 0;
+ ssize_t n = ::sendfile(out.fd, in.fd, &offset, count);
+ if (n < 0 && errno != ENOSYS && errno != EINVAL)
+ {
+ ec.assign(errno, std::generic_category());
+ return false;
+ }
+ if ((size_t)n == count)
+ {
+ if (!out.close() || !in.close())
+ {
+ ec.assign(errno, std::generic_category());
+ return false;
+ }
+ ec.clear();
+ return true;
+ }
+ else if (n > 0)
+ count -= n;
+#endif // _GLIBCXX_USE_SENDFILE
+
+ using std::ios;
+ __gnu_cxx::stdio_filebuf<char> sbin(in.fd, ios::in|ios::binary);
+ __gnu_cxx::stdio_filebuf<char> sbout(out.fd, ios::out|ios::binary);
+
+ if (sbin.is_open())
+ in.fd = -1;
+ if (sbout.is_open())
+ out.fd = -1;
+
+#ifdef _GLIBCXX_USE_SENDFILE
+ if (n != 0)
+ {
+ if (n < 0)
+ n = 0;
+
+ const auto p1 = sbin.pubseekoff(n, ios::beg, ios::in);
+ const auto p2 = sbout.pubseekoff(n, ios::beg, ios::out);
+
+ const std::streampos errpos(std::streamoff(-1));
+ if (p1 == errpos || p2 == errpos)
+ {
+ ec = std::make_error_code(std::errc::io_error);
+ return false;
+ }
+ }
+#endif
+
+ if (count && !(std::ostream(&sbout) << &sbin))
+ {
+ ec = std::make_error_code(std::errc::io_error);
+ return false;
+ }
+ if (!sbout.close() || !sbin.close())
+ {
+ ec.assign(errno, std::generic_category());
+ return false;
+ }
+ ec.clear();
+ return true;
+ }
+#endif // NEED_DO_COPY_FILE
+
+#ifdef NEED_DO_SPACE
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wunused-parameter"
+ void
+ do_space(const char_type* pathname,
+ uintmax_t& capacity, uintmax_t& free, uintmax_t& available,
+ std::error_code& ec)
+ {
+#ifdef _GLIBCXX_HAVE_SYS_STATVFS_H
+ struct ::statvfs f;
+ if (::statvfs(pathname, &f))
+ ec.assign(errno, std::generic_category());
+ else
+ {
+ if (f.f_frsize != (unsigned long)-1)
+ {
+ const uintmax_t fragment_size = f.f_frsize;
+ const fsblkcnt_t unknown = -1;
+ if (f.f_blocks != unknown)
+ capacity = f.f_blocks * fragment_size;
+ if (f.f_bfree != unknown)
+ free = f.f_bfree * fragment_size;
+ if (f.f_bavail != unknown)
+ available = f.f_bavail * fragment_size;
+ }
+ ec.clear();
+ }
+#elif _GLIBCXX_FILESYSTEM_IS_WINDOWS
+ ULARGE_INTEGER bytes_avail = {}, bytes_total = {}, bytes_free = {};
+ if (GetDiskFreeSpaceExW(pathname, &bytes_avail, &bytes_total, &bytes_free))
+ {
+ if (bytes_total.QuadPart != 0)
+ capacity = bytes_total.QuadPart;
+ if (bytes_free.QuadPart != 0)
+ free = bytes_free.QuadPart;
+ if (bytes_avail.QuadPart != 0)
+ available = bytes_avail.QuadPart;
+ ec.clear();
+ }
+ else
+ ec.assign((int)GetLastError(), std::system_category());
+#else
+ ec = std::make_error_code(std::errc::not_supported);
+#endif
+ }
+#pragma GCC diagnostic pop
+#endif // NEED_DO_SPACE
+
#endif // _GLIBCXX_HAVE_SYS_STAT_H
_GLIBCXX_END_NAMESPACE_FILESYSTEM
diff --git a/libstdc++-v3/src/filesystem/ops.cc b/libstdc++-v3/src/filesystem/ops.cc
index 95bf23b5b52..369604da80f 100644
--- a/libstdc++-v3/src/filesystem/ops.cc
+++ b/libstdc++-v3/src/filesystem/ops.cc
@@ -24,6 +24,8 @@
#ifndef _GLIBCXX_USE_CXX11_ABI
# define _GLIBCXX_USE_CXX11_ABI 1
+# define NEED_DO_COPY_FILE
+# define NEED_DO_SPACE
#endif
#include <experimental/filesystem>
@@ -243,7 +245,6 @@ namespace
using std::filesystem::is_not_found_errno;
using std::filesystem::file_time;
- using std::filesystem::do_copy_file;
#endif // _GLIBCXX_HAVE_SYS_STAT_H
} // namespace
@@ -1175,7 +1176,7 @@ fs::space(const path& p, error_code& ec) noexcept
#else
auto str = p.c_str();
#endif
- std::filesystem::do_space(str, info.capacity, info.free, info.available, ec);
+ fs::do_space(str, info.capacity, info.free, info.available, ec);
return info;
}
diff --git a/libstdc++-v3/testsuite/27_io/filesystem/directory_entry/86597.cc b/libstdc++-v3/testsuite/27_io/filesystem/directory_entry/86597.cc
index 10202f5be3e..67c70abf4a1 100644
--- a/libstdc++-v3/testsuite/27_io/filesystem/directory_entry/86597.cc
+++ b/libstdc++-v3/testsuite/27_io/filesystem/directory_entry/86597.cc
@@ -15,7 +15,7 @@
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
-// { dg-options "-std=gnu++17 -lstdc++fs" }
+// { dg-options "-std=gnu++17" }
// { dg-do run { target c++17 } }
// { dg-require-filesystem-ts "" }
diff --git a/libstdc++-v3/testsuite/27_io/filesystem/directory_entry/lwg3171.cc b/libstdc++-v3/testsuite/27_io/filesystem/directory_entry/lwg3171.cc
index 95158c63ca8..b688d69085e 100644
--- a/libstdc++-v3/testsuite/27_io/filesystem/directory_entry/lwg3171.cc
+++ b/libstdc++-v3/testsuite/27_io/filesystem/directory_entry/lwg3171.cc
@@ -15,7 +15,7 @@
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
-// { dg-options "-std=gnu++17 -lstdc++fs" }
+// { dg-options "-std=gnu++17" }
// { dg-do run { target c++17 } }
// { dg-require-filesystem-ts "" }
diff --git a/libstdc++-v3/testsuite/27_io/filesystem/file_status/1.cc b/libstdc++-v3/testsuite/27_io/filesystem/file_status/1.cc
index 030a1d273f3..0bda10d28e2 100644
--- a/libstdc++-v3/testsuite/27_io/filesystem/file_status/1.cc
+++ b/libstdc++-v3/testsuite/27_io/filesystem/file_status/1.cc
@@ -15,7 +15,7 @@
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
-// { dg-options "-std=gnu++17 -lstdc++fs" }
+// { dg-options "-std=gnu++17" }
// { dg-do run { target c++17 } }
// { dg-require-filesystem-ts "" }
diff --git a/libstdc++-v3/testsuite/27_io/filesystem/filesystem_error/cons.cc b/libstdc++-v3/testsuite/27_io/filesystem/filesystem_error/cons.cc
index cd40397c346..8b24541cbc6 100644
--- a/libstdc++-v3/testsuite/27_io/filesystem/filesystem_error/cons.cc
+++ b/libstdc++-v3/testsuite/27_io/filesystem/filesystem_error/cons.cc
@@ -15,7 +15,7 @@
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
-// { dg-options "-std=gnu++17 -lstdc++fs" }
+// { dg-options "-std=gnu++17" }
// { dg-do run { target c++17 } }
// { dg-require-filesystem-ts "" }
diff --git a/libstdc++-v3/testsuite/27_io/filesystem/filesystem_error/copy.cc b/libstdc++-v3/testsuite/27_io/filesystem/filesystem_error/copy.cc
index 71eac38e0d3..926f164f5fa 100644
--- a/libstdc++-v3/testsuite/27_io/filesystem/filesystem_error/copy.cc
+++ b/libstdc++-v3/testsuite/27_io/filesystem/filesystem_error/copy.cc
@@ -15,7 +15,7 @@
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
-// { dg-options "-std=gnu++17 -lstdc++fs" }
+// { dg-options "-std=gnu++17" }
// { dg-do run { target c++17 } }
// { dg-require-filesystem-ts "" }
diff --git a/libstdc++-v3/testsuite/27_io/filesystem/iterators/directory_iterator.cc b/libstdc++-v3/testsuite/27_io/filesystem/iterators/directory_iterator.cc
index 71ecd21ab40..ddb424b4be0 100644
--- a/libstdc++-v3/testsuite/27_io/filesystem/iterators/directory_iterator.cc
+++ b/libstdc++-v3/testsuite/27_io/filesystem/iterators/directory_iterator.cc
@@ -15,7 +15,7 @@
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
-// { dg-options "-std=gnu++17 -lstdc++fs" }
+// { dg-options "-std=gnu++17" }
// { dg-do run { target c++17 } }
// { dg-require-filesystem-ts "" }
diff --git a/libstdc++-v3/testsuite/27_io/filesystem/iterators/pop.cc b/libstdc++-v3/testsuite/27_io/filesystem/iterators/pop.cc
index fab7ac0f896..b092dee91e0 100644
--- a/libstdc++-v3/testsuite/27_io/filesystem/iterators/pop.cc
+++ b/libstdc++-v3/testsuite/27_io/filesystem/iterators/pop.cc
@@ -15,7 +15,7 @@
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
-// { dg-options "-std=gnu++17 -lstdc++fs" }
+// { dg-options "-std=gnu++17" }
// { dg-do run { target c++17 } }
// { dg-require-filesystem-ts "" }
diff --git a/libstdc++-v3/testsuite/27_io/filesystem/iterators/recursive_directory_iterator.cc b/libstdc++-v3/testsuite/27_io/filesystem/iterators/recursive_directory_iterator.cc
index ca4899d058c..bf67bfd215b 100644
--- a/libstdc++-v3/testsuite/27_io/filesystem/iterators/recursive_directory_iterator.cc
+++ b/libstdc++-v3/testsuite/27_io/filesystem/iterators/recursive_directory_iterator.cc
@@ -15,7 +15,7 @@
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
-// { dg-options "-std=gnu++17 -lstdc++fs" }
+// { dg-options "-std=gnu++17" }
// { dg-do run { target c++17 } }
// { dg-require-filesystem-ts "" }
diff --git a/libstdc++-v3/testsuite/27_io/filesystem/operations/absolute.cc b/libstdc++-v3/testsuite/27_io/filesystem/operations/absolute.cc
index 496f3f8d4fb..45f66ac96c5 100644
--- a/libstdc++-v3/testsuite/27_io/filesystem/operations/absolute.cc
+++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/absolute.cc
@@ -1,4 +1,4 @@
-// { dg-options "-std=gnu++17 -lstdc++fs" }
+// { dg-options "-std=gnu++17" }
// { dg-do run { target c++17 } }
// { dg-require-filesystem-ts "" }
diff --git a/libstdc++-v3/testsuite/27_io/filesystem/operations/canonical.cc b/libstdc++-v3/testsuite/27_io/filesystem/operations/canonical.cc
index 9f511c51a9d..8051a4bfb7a 100644
--- a/libstdc++-v3/testsuite/27_io/filesystem/operations/canonical.cc
+++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/canonical.cc
@@ -15,7 +15,7 @@
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
-// { dg-options "-std=gnu++17 -lstdc++fs" }
+// { dg-options "-std=gnu++17" }
// { dg-do run { target c++17 } }
// { dg-require-filesystem-ts "" }
diff --git a/libstdc++-v3/testsuite/27_io/filesystem/operations/copy.cc b/libstdc++-v3/testsuite/27_io/filesystem/operations/copy.cc
index 2fba1fba2d1..7234e34831f 100644
--- a/libstdc++-v3/testsuite/27_io/filesystem/operations/copy.cc
+++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/copy.cc
@@ -1,4 +1,4 @@
-// { dg-options "-std=gnu++17 -lstdc++fs" }
+// { dg-options "-std=gnu++17" }
// { dg-do run { target c++17 } }
// { dg-require-filesystem-ts "" }
diff --git a/libstdc++-v3/testsuite/27_io/filesystem/operations/copy_file.cc b/libstdc++-v3/testsuite/27_io/filesystem/operations/copy_file.cc
index 85e97c634d3..dfad8541bfe 100644
--- a/libstdc++-v3/testsuite/27_io/filesystem/operations/copy_file.cc
+++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/copy_file.cc
@@ -15,7 +15,7 @@
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
-// { dg-options "-std=gnu++17 -lstdc++fs" }
+// { dg-options "-std=gnu++17" }
// { dg-do run { target c++17 } }
// { dg-require-filesystem-ts "" }
diff --git a/libstdc++-v3/testsuite/27_io/filesystem/operations/create_directories.cc b/libstdc++-v3/testsuite/27_io/filesystem/operations/create_directories.cc
index 007c5cd55fc..d248676b82d 100644
--- a/libstdc++-v3/testsuite/27_io/filesystem/operations/create_directories.cc
+++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/create_directories.cc
@@ -15,7 +15,7 @@
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
-// { dg-options "-std=gnu++17 -lstdc++fs" }
+// { dg-options "-std=gnu++17" }
// { dg-do run { target c++17 } }
// { dg-require-filesystem-ts "" }
diff --git a/libstdc++-v3/testsuite/27_io/filesystem/operations/create_directory.cc b/libstdc++-v3/testsuite/27_io/filesystem/operations/create_directory.cc
index e196c57e799..da78fb2de87 100644
--- a/libstdc++-v3/testsuite/27_io/filesystem/operations/create_directory.cc
+++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/create_directory.cc
@@ -15,7 +15,7 @@
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
-// { dg-options "-std=gnu++17 -lstdc++fs" }
+// { dg-options "-std=gnu++17" }
// { dg-do run { target c++17 } }
// { dg-require-filesystem-ts "" }
diff --git a/libstdc++-v3/testsuite/27_io/filesystem/operations/create_symlink.cc b/libstdc++-v3/testsuite/27_io/filesystem/operations/create_symlink.cc
index 55a103f8936..4236f20f62d 100644
--- a/libstdc++-v3/testsuite/27_io/filesystem/operations/create_symlink.cc
+++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/create_symlink.cc
@@ -15,7 +15,7 @@
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
-// { dg-options "-std=gnu++17 -lstdc++fs" }
+// { dg-options "-std=gnu++17" }
// { dg-do run { target c++17 } }
// { dg-require-filesystem-ts "" }
diff --git a/libstdc++-v3/testsuite/27_io/filesystem/operations/current_path.cc b/libstdc++-v3/testsuite/27_io/filesystem/operations/current_path.cc
index b5a6c638476..c62ada9f111 100644
--- a/libstdc++-v3/testsuite/27_io/filesystem/operations/current_path.cc
+++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/current_path.cc
@@ -1,4 +1,4 @@
-// { dg-options "-std=gnu++17 -lstdc++fs" }
+// { dg-options "-std=gnu++17" }
// { dg-do run { target c++17 } }
// { dg-require-filesystem-ts "" }
diff --git a/libstdc++-v3/testsuite/27_io/filesystem/operations/equivalent.cc b/libstdc++-v3/testsuite/27_io/filesystem/operations/equivalent.cc
index f371cdb0afe..ca1d691bc7c 100644
--- a/libstdc++-v3/testsuite/27_io/filesystem/operations/equivalent.cc
+++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/equivalent.cc
@@ -15,7 +15,7 @@
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
-// { dg-options "-std=gnu++17 -lstdc++fs" }
+// { dg-options "-std=gnu++17" }
// { dg-do run { target c++17 } }
// { dg-require-filesystem-ts "" }
diff --git a/libstdc++-v3/testsuite/27_io/filesystem/operations/exists.cc b/libstdc++-v3/testsuite/27_io/filesystem/operations/exists.cc
index 330ec542ce8..df8251e55c2 100644
--- a/libstdc++-v3/testsuite/27_io/filesystem/operations/exists.cc
+++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/exists.cc
@@ -15,7 +15,7 @@
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
-// { dg-options "-std=gnu++17 -lstdc++fs" }
+// { dg-options "-std=gnu++17" }
// { dg-do run { target c++17 } }
// { dg-require-filesystem-ts "" }
diff --git a/libstdc++-v3/testsuite/27_io/filesystem/operations/file_size.cc b/libstdc++-v3/testsuite/27_io/filesystem/operations/file_size.cc
index bb11653cae2..57c9e96e4dc 100644
--- a/libstdc++-v3/testsuite/27_io/filesystem/operations/file_size.cc
+++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/file_size.cc
@@ -15,7 +15,7 @@
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
-// { dg-options "-std=gnu++17 -lstdc++fs" }
+// { dg-options "-std=gnu++17" }
// { dg-do run { target c++17 } }
// { dg-require-filesystem-ts "" }
diff --git a/libstdc++-v3/testsuite/27_io/filesystem/operations/is_empty.cc b/libstdc++-v3/testsuite/27_io/filesystem/operations/is_empty.cc
index e4e4c3e3bc7..c572a834576 100644
--- a/libstdc++-v3/testsuite/27_io/filesystem/operations/is_empty.cc
+++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/is_empty.cc
@@ -15,7 +15,7 @@
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
-// { dg-options "-std=gnu++17 -lstdc++fs" }
+// { dg-options "-std=gnu++17" }
// { dg-do run { target c++17 } }
// { dg-require-filesystem-ts "" }
diff --git a/libstdc++-v3/testsuite/27_io/filesystem/operations/last_write_time.cc b/libstdc++-v3/testsuite/27_io/filesystem/operations/last_write_time.cc
index 49822e166b1..7a693a1ddcb 100644
--- a/libstdc++-v3/testsuite/27_io/filesystem/operations/last_write_time.cc
+++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/last_write_time.cc
@@ -15,7 +15,7 @@
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
-// { dg-options "-std=gnu++17 -lstdc++fs" }
+// { dg-options "-std=gnu++17" }
// { dg-do run { target c++17 } }
// { dg-require-filesystem-ts "" }
diff --git a/libstdc++-v3/testsuite/27_io/filesystem/operations/permissions.cc b/libstdc++-v3/testsuite/27_io/filesystem/operations/permissions.cc
index 669b04903f1..23d5817acad 100644
--- a/libstdc++-v3/testsuite/27_io/filesystem/operations/permissions.cc
+++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/permissions.cc
@@ -15,7 +15,7 @@
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
-// { dg-options "-std=gnu++17 -lstdc++fs" }
+// { dg-options "-std=gnu++17" }
// { dg-do run { target c++17 } }
// { dg-require-filesystem-ts "" }
diff --git a/libstdc++-v3/testsuite/27_io/filesystem/operations/proximate.cc b/libstdc++-v3/testsuite/27_io/filesystem/operations/proximate.cc
index 09358250628..8a7e258628a 100644
--- a/libstdc++-v3/testsuite/27_io/filesystem/operations/proximate.cc
+++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/proximate.cc
@@ -15,7 +15,7 @@
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
-// { dg-options "-std=gnu++17 -lstdc++fs" }
+// { dg-options "-std=gnu++17" }
// { dg-do run { target c++17 } }
// { dg-require-filesystem-ts "" }
diff --git a/libstdc++-v3/testsuite/27_io/filesystem/operations/read_symlink.cc b/libstdc++-v3/testsuite/27_io/filesystem/operations/read_symlink.cc
index f04932fcc0f..038c0447a04 100644
--- a/libstdc++-v3/testsuite/27_io/filesystem/operations/read_symlink.cc
+++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/read_symlink.cc
@@ -15,7 +15,7 @@
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
-// { dg-options "-std=gnu++17 -lstdc++fs" }
+// { dg-options "-std=gnu++17" }
// { dg-do run { target c++17 } }
// { dg-require-filesystem-ts "" }
// { dg-xfail-if "symlinks not supported" { *-*-mingw* } }
diff --git a/libstdc++-v3/testsuite/27_io/filesystem/operations/relative.cc b/libstdc++-v3/testsuite/27_io/filesystem/operations/relative.cc
index c7521d13262..e013faaaf68 100644
--- a/libstdc++-v3/testsuite/27_io/filesystem/operations/relative.cc
+++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/relative.cc
@@ -15,7 +15,7 @@
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
-// { dg-options "-std=gnu++17 -lstdc++fs" }
+// { dg-options "-std=gnu++17" }
// { dg-do run { target c++17 } }
// { dg-require-filesystem-ts "" }
diff --git a/libstdc++-v3/testsuite/27_io/filesystem/operations/remove.cc b/libstdc++-v3/testsuite/27_io/filesystem/operations/remove.cc
index 066bd2bad0e..afe9580fa33 100644
--- a/libstdc++-v3/testsuite/27_io/filesystem/operations/remove.cc
+++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/remove.cc
@@ -15,7 +15,7 @@
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
-// { dg-options "-std=gnu++17 -lstdc++fs" }
+// { dg-options "-std=gnu++17" }
// { dg-do run { target c++17 } }
// { dg-require-filesystem-ts "" }
diff --git a/libstdc++-v3/testsuite/27_io/filesystem/operations/remove_all.cc b/libstdc++-v3/testsuite/27_io/filesystem/operations/remove_all.cc
index 255a6b1b9ff..2f2802ff859 100644
--- a/libstdc++-v3/testsuite/27_io/filesystem/operations/remove_all.cc
+++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/remove_all.cc
@@ -15,7 +15,7 @@
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
-// { dg-options "-std=gnu++17 -lstdc++fs" }
+// { dg-options "-std=gnu++17" }
// { dg-do run { target c++17 } }
// { dg-require-filesystem-ts "" }
diff --git a/libstdc++-v3/testsuite/27_io/filesystem/operations/space.cc b/libstdc++-v3/testsuite/27_io/filesystem/operations/space.cc
index 4070e7bdb92..e545e5e8f70 100644
--- a/libstdc++-v3/testsuite/27_io/filesystem/operations/space.cc
+++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/space.cc
@@ -15,7 +15,7 @@
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
-// { dg-options "-std=gnu++17 -lstdc++fs" }
+// { dg-options "-std=gnu++17" }
// { dg-do run { target c++17 } }
// { dg-require-filesystem-ts "" }
diff --git a/libstdc++-v3/testsuite/27_io/filesystem/operations/status.cc b/libstdc++-v3/testsuite/27_io/filesystem/operations/status.cc
index 8a526db7cab..b5ab1b5fd5e 100644
--- a/libstdc++-v3/testsuite/27_io/filesystem/operations/status.cc
+++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/status.cc
@@ -15,7 +15,7 @@
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
-// { dg-options "-std=gnu++17 -lstdc++fs" }
+// { dg-options "-std=gnu++17" }
// { dg-do run { target c++17 } }
// { dg-require-filesystem-ts "" }
diff --git a/libstdc++-v3/testsuite/27_io/filesystem/operations/symlink_status.cc b/libstdc++-v3/testsuite/27_io/filesystem/operations/symlink_status.cc
index 66125743001..6f01419da3e 100644
--- a/libstdc++-v3/testsuite/27_io/filesystem/operations/symlink_status.cc
+++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/symlink_status.cc
@@ -15,7 +15,7 @@
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
-// { dg-options "-std=gnu++17 -lstdc++fs" }
+// { dg-options "-std=gnu++17" }
// { dg-do run { target c++17 } }
// { dg-require-filesystem-ts "" }
// { dg-xfail-if "symlinks not supported" { *-*-mingw* } }
diff --git a/libstdc++-v3/testsuite/27_io/filesystem/operations/temp_directory_path.cc b/libstdc++-v3/testsuite/27_io/filesystem/operations/temp_directory_path.cc
index 8f03b9dc324..b3ae66d7d64 100644
--- a/libstdc++-v3/testsuite/27_io/filesystem/operations/temp_directory_path.cc
+++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/temp_directory_path.cc
@@ -15,7 +15,7 @@
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
-// { dg-options "-std=gnu++17 -lstdc++fs" }
+// { dg-options "-std=gnu++17" }
// { dg-do run { target c++17 } }
// { dg-require-filesystem-ts "" }
diff --git a/libstdc++-v3/testsuite/27_io/filesystem/operations/weakly_canonical.cc b/libstdc++-v3/testsuite/27_io/filesystem/operations/weakly_canonical.cc
index ef6a8b563ea..e7f1a4ca782 100644
--- a/libstdc++-v3/testsuite/27_io/filesystem/operations/weakly_canonical.cc
+++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/weakly_canonical.cc
@@ -15,7 +15,7 @@
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
-// { dg-options "-std=gnu++17 -lstdc++fs" }
+// { dg-options "-std=gnu++17" }
// { dg-do run { target c++17 } }
// { dg-require-filesystem-ts "" }