Message ID | orr13h9qes.fsf@lxoliva.fsfla.org |
---|---|
State | New |
Headers | show |
Series | libstdc++: testsuite: test symlnks ifdef _GLIBCXX_HAVE_SYMLINK | expand |
On Wed, 22 Jun 2022 at 07:14, Alexandre Oliva via Libstdc++ <libstdc++@gcc.gnu.org> wrote: > > > Several filesystem tests expect to be able to create symlinks even > when !defined (_GLIBCXX_HAVE_SYMLINK), and fail predictably, reducing > the amount of testing of other filesystem features. > > They are already skipped for mingw targets. I've extended the > skipping to other targets in which _GLIBCXX_HAVE_SYMLINK is > undefined. > > Regstrapped on x86_64-linux-gnu, also tested with a cross to > aarch64-rtems6. Ok to install? OK. I'd like to clean this up so the tests don't rely on the "internal" HAVE_SYMLINK macro. We could add something like this to testsuite/util/testsuite_fs.h #if defined(__MINGW32__) || defined(__MINGW64__) \ || !defined (_GLIBCXX_HAVE_SYMLINK) # define NO_SYMLINKS #endif and then use that in the tests. That way the private macro is only checked in one place. We can do that later though. > > PS: Testing with trunk was somewhat impaired by various changes in the > filesystem implementation and tests that cause new failures on rtems6 The only significant changes are for PR104161 but the directory iterators did change fairly significantly. Which tests are failing? I might be able to point you to the cause much faster than you can debug it yourself.
On Wed, 22 Jun 2022 at 10:25, Jonathan Wakely wrote: > > On Wed, 22 Jun 2022 at 07:14, Alexandre Oliva via Libstdc++ > <libstdc++@gcc.gnu.org> wrote: > > > > > > Several filesystem tests expect to be able to create symlinks even > > when !defined (_GLIBCXX_HAVE_SYMLINK), and fail predictably, reducing > > the amount of testing of other filesystem features. > > > > They are already skipped for mingw targets. I've extended the > > skipping to other targets in which _GLIBCXX_HAVE_SYMLINK is > > undefined. > > > > Regstrapped on x86_64-linux-gnu, also tested with a cross to > > aarch64-rtems6. Ok to install? > > OK. P.S. there's a typo in the Subject: "symlnks" not "symlinks". I don't know if you intend to use that as the Git commit summary line. > > I'd like to clean this up so the tests don't rely on the "internal" > HAVE_SYMLINK macro. We could add something like this to > testsuite/util/testsuite_fs.h > > #if defined(__MINGW32__) || defined(__MINGW64__) \ > || !defined (_GLIBCXX_HAVE_SYMLINK) > # define NO_SYMLINKS > #endif > > and then use that in the tests. That way the private macro is only > checked in one place. We can do that later though. > > > > > PS: Testing with trunk was somewhat impaired by various changes in the > > filesystem implementation and tests that cause new failures on rtems6 > > The only significant changes are for PR104161 but the directory > iterators did change fairly significantly. > > Which tests are failing? I might be able to point you to the cause > much faster than you can debug it yourself.
On Jun 22, 2022, Jonathan Wakely <jwakely@redhat.com> wrote: > P.S. there's a typo in the Subject: "symlnks" not "symlinks". I don't > know if you intend to use that as the Git commit summary line. Thanks, I would have, fixed. I ended up introducing the feature abstraction macros in testsuite_fs.h, so I'll shortly post new versions of those patches for review.
On Jun 22, 2022, Jonathan Wakely <jwakely@redhat.com> wrote: > Which tests are failing? I might be able to point you to the cause > much faster than you can debug it yourself. With commit 7e2db5d102dd05ffa9c46b89616f7a700a9889f8 (current refs/users/aoliva/heads/testme) I get: FAIL: 27_io/filesystem/iterators/caching.cc execution test FAIL: 27_io/filesystem/iterators/error_reporting.cc execution test FAIL: 27_io/filesystem/iterators/pop.cc execution test FAIL: 27_io/filesystem/iterators/recursion_pending.cc execution test FAIL: 27_io/filesystem/iterators/recursive_directory_iterator.cc execution test terminate called after throwing an instance of 'std::filesystem::__cxx11::filesystem_error' what(): filesystem error: cannot increment recursive directory iterator: No such file or directory FAIL: 27_io/filesystem/operations/canonical.cc execution test FAIL: 27_io/filesystem/operations/copy.cc execution test terminate called after throwing an instance of 'std::filesystem::__cxx11::filesystem_error' what(): filesystem error: cannot remove all: No such file or directory [...] [...] FAIL: 27_io/filesystem/operations/create_directories.cc execution test FAIL: experimental/filesystem/operations/create_directories.cc execution test .../libstdc++-v3/testsuite/.../filesystem/operations/create_directories.cc:{84,78}: void test01(): Assertion 'count == 6' failed. FAIL: 27_io/filesystem/operations/create_directory.cc execution test FAIL: experimental/filesystem/operations/create_directory.cc execution test [times out] FAIL: 27_io/filesystem/operations/is_empty.cc execution test FAIL: experimental/filesystem/operations/is_empty.cc execution test Skipping tests that depend on filesystem permissions [times out] FAIL: 27_io/filesystem/operations/remove_all.cc execution test FAIL: experimental/filesystem/operations/remove_all.cc execution test .../libstdc++-v3/testsuite/.../filesystem/operations/remove_all.cc:6{7,8}: void test01(): Assertion '!ec' failed. FAIL: 27_io/filesystem/operations/rename.cc execution test FAIL: experimental/filesystem/operations/rename.cc execution test .../libstdc++-v3/testsuite/.../filesystem/operations/rename.cc:5{1,2}: void test01(): Assertion '!ec' failed. Also noteworthy, though unrelated with filesystem: UNRESOLVED: 20_util/from_chars/4.cc compilation failed to produce executable UNRESOLVED: 26_numerics/random/random_device/entropy.cc compilation failed to produce executable error: 'log2' is not a member of 'std'; did you mean 'log'?
On Jun 22, 2022, Jonathan Wakely <jwakely@redhat.com> wrote: > OK. > I'd like to clean this up so the tests don't rely on the "internal" > HAVE_SYMLINK macro. We could add something like this to > testsuite/util/testsuite_fs.h > #if defined(__MINGW32__) || defined(__MINGW64__) \ > || !defined (_GLIBCXX_HAVE_SYMLINK) > # define NO_SYMLINKS > #endif I took your suggestion, and took it a little further. Here's the result. Regstrapped on x86_64-linux-gnu, also tested with a cross to aarch64-rtems6. Ok to install? libstdc++: testsuite: conditionalize symlink tests Several filesystem tests expect to be able to create symlinks even when !defined (_GLIBCXX_HAVE_SYMLINK), and fail predictably, reducing the amount of testing of other filesystem features. They are already skipped for mingw targets. I've extended the skipping to other targets in which _GLIBCXX_HAVE_SYMLINK is undefined, through a new NO_SYMLINKS macro in testsuite_fs.h that guards skippable portions of tests, and dg-require-target-fs-symlinks for tests that would be reduced to nothing. for libstdc++-v3/ChangeLog * testsuite/util/testsuite_fs.h (NO_SYMLINKS): Define on mingw and when create_symlink is a dummy. * testsuite/27_io/filesystem/operations/symlink_status.cc: Drop mingw xfail. (test01, test02): Don't create symlinks when NO_SYMLINKS is defined. * testsuite/27_io/filesystem/operations/canonical.cc (test03): Likewise. * testsuite/27_io/filesystem/operations/copy.cc (test02): Likewise. * testsuite/27_io/filesystem/operations/create_directories.cc (test04): Likewise. * testsuite/27_io/filesystem/operations/create_directory.cc (test01): Likewise. * testsuite/27_io/filesystem/operations/permissions.cc (test03, test04): Likewise. * testsuite/27_io/filesystem/operations/remove.cc (test01): Likewise. * testsuite/27_io/filesystem/operations/remove_all.cc (test01): Likewise. * testsuite/27_io/filesystem/operations/rename.cc (test_symlinks): Likewise. * testsuite/27_io/filesystem/operations/weakly_canonical.cc (test01): Likewise. * testsuite/experimental/filesystem/iterators/recursive_directory_itreator.cc (test06): Likewise. * testsuite/experimental/filesystem/operations/copy.cc (test01): Likewise. * testsuite/experimental/filesystem/operations/create_directories.cc (test04): Likewise. * testsuite/experimental/filesystem/operations/create_directory.cc (test01): Likewise. * testsuite/experimental/filesystem/operations/permissions.cc (test03, test04): Likewise. * testsuite/experimental/filesystem/operations/remove.cc (test01): Likewise. * testsuite/experimental/filesystem/operations/remove_all.cc (test01): Likewise. * testsuite/experimental/filesystem/operations/rename.cc (test01): Likewise. * testsuite/lib/libstdc++.exp (v3_check_preprocessor_condition): Add inc parameter. Include it after bits/c++config.h. Adjust all callers. (check_v3_target_fs_symlinks): New. * testsuite/lib/dg-options.exp (dg-require-target-fs-symlinks): New. * testsuite/27_io/filesystem/operations/read_symlink.cc: Replace mingw xfail with require target-fs-symlinks. * testsuite/experimental/filesystem/operations/read_symlink.cc: Likewise. --- .../27_io/filesystem/operations/canonical.cc | 5 +- .../testsuite/27_io/filesystem/operations/copy.cc | 7 +-- .../filesystem/operations/create_directories.cc | 4 - .../filesystem/operations/create_directory.cc | 4 - .../27_io/filesystem/operations/permissions.cc | 4 + .../27_io/filesystem/operations/read_symlink.cc | 2 - .../27_io/filesystem/operations/remove.cc | 4 - .../27_io/filesystem/operations/remove_all.cc | 4 - .../27_io/filesystem/operations/rename.cc | 4 - .../27_io/filesystem/operations/symlink_status.cc | 5 +- .../filesystem/operations/weakly_canonical.cc | 4 - .../iterators/recursive_directory_iterator.cc | 2 - .../experimental/filesystem/operations/copy.cc | 7 +-- .../filesystem/operations/create_directories.cc | 4 - .../filesystem/operations/create_directory.cc | 4 - .../filesystem/operations/permissions.cc | 4 + .../filesystem/operations/read_symlink.cc | 2 - .../experimental/filesystem/operations/remove.cc | 5 -- .../filesystem/operations/remove_all.cc | 4 - .../experimental/filesystem/operations/rename.cc | 4 - libstdc++-v3/testsuite/lib/dg-options.exp | 9 +++ libstdc++-v3/testsuite/lib/libstdc++.exp | 55 ++++++++++++-------- libstdc++-v3/testsuite/util/testsuite_fs.h | 5 ++ 23 files changed, 81 insertions(+), 71 deletions(-) diff --git a/libstdc++-v3/testsuite/27_io/filesystem/operations/canonical.cc b/libstdc++-v3/testsuite/27_io/filesystem/operations/canonical.cc index bc7ef0de2b716..9c432b25acfb6 100644 --- a/libstdc++-v3/testsuite/27_io/filesystem/operations/canonical.cc +++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/canonical.cc @@ -111,9 +111,12 @@ test03() fs::path foo = dir/"foo", bar = dir/"bar"; fs::create_directory(foo); fs::create_directory(bar); +#ifdef NO_SYMLINKS #if defined(__MINGW32__) || defined(__MINGW64__) - // No symlink support const fs::path baz = dir/"foo\\\\..\\bar///"; +#else + const fs::path baz = dir/"foo//../bar///"; +#endif #else fs::create_symlink("../bar", foo/"baz"); const fs::path baz = dir/"foo//./baz///"; diff --git a/libstdc++-v3/testsuite/27_io/filesystem/operations/copy.cc b/libstdc++-v3/testsuite/27_io/filesystem/operations/copy.cc index f3081f4b64ebc..f9fb4dff77ecd 100644 --- a/libstdc++-v3/testsuite/27_io/filesystem/operations/copy.cc +++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/copy.cc @@ -66,11 +66,7 @@ test01() void test02() { -#if defined(__MINGW32__) || defined(__MINGW64__) - // No symlink support - return; -#endif - +#ifndef NO_SYMLINKS const std::error_code bad_ec = make_error_code(std::errc::invalid_argument); auto from = __gnu_test::nonexistent_path(); std::error_code ec; @@ -110,6 +106,7 @@ test02() remove(from, ec); remove(to, ec); +#endif } // Test is_regular_file(f) case. 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 4a7ba1fcb4944..2b48c152e39a9 100644 --- a/libstdc++-v3/testsuite/27_io/filesystem/operations/create_directories.cc +++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/create_directories.cc @@ -148,9 +148,7 @@ test03() void test04() { -#if defined(__MINGW32__) || defined(__MINGW64__) - // no symlinks -#else +#ifndef NO_SYMLINKS // PR libstdc++/101510 // create_directories reports an error if the path is a symlink to a dir std::error_code ec = make_error_code(std::errc::invalid_argument); 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 90f98302c00f8..aa59f7f3ee22d 100644 --- a/libstdc++-v3/testsuite/27_io/filesystem/operations/create_directory.cc +++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/create_directory.cc @@ -70,9 +70,7 @@ test01() VERIFY( e.path1() == f ); } -#if defined(__MINGW32__) || defined(__MINGW64__) - // no symlinks -#else +#ifndef NO_SYMLINKS // PR libstdc++/101510 create_directory on an existing symlink to a directory fs::create_directory(p/"dir"); auto link = p/"link"; diff --git a/libstdc++-v3/testsuite/27_io/filesystem/operations/permissions.cc b/libstdc++-v3/testsuite/27_io/filesystem/operations/permissions.cc index deed759be80e9..ee5afd529bac4 100644 --- a/libstdc++-v3/testsuite/27_io/filesystem/operations/permissions.cc +++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/permissions.cc @@ -76,6 +76,7 @@ test02() void test03() { +#ifndef NO_SYMLINKS using std::filesystem::perms; using std::filesystem::perm_options; @@ -111,11 +112,13 @@ test03() VERIFY( !caught ); remove(p); +#endif } void test04() { +#ifndef NO_SYMLINKS using perms = std::filesystem::perms; auto p = __gnu_test::nonexistent_path(); @@ -137,6 +140,7 @@ test04() VERIFY( ec == ec2 ); remove(p); +#endif } void 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 68bbab33bc9e2..030d6271de525 100644 --- a/libstdc++-v3/testsuite/27_io/filesystem/operations/read_symlink.cc +++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/read_symlink.cc @@ -17,7 +17,7 @@ // { dg-do run { target c++17 } } // { dg-require-filesystem-ts "" } -// { dg-xfail-if "symlinks not supported" { *-*-mingw* } } +// { dg-require-target-fs-symlinks "" } #include <filesystem> #include <testsuite_hooks.h> diff --git a/libstdc++-v3/testsuite/27_io/filesystem/operations/remove.cc b/libstdc++-v3/testsuite/27_io/filesystem/operations/remove.cc index 26f2d548f82d5..f769723ae30fa 100644 --- a/libstdc++-v3/testsuite/27_io/filesystem/operations/remove.cc +++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/remove.cc @@ -41,9 +41,7 @@ test01() VERIFY( !ec ); VERIFY( !n ); -#if defined(__MINGW32__) || defined(__MINGW64__) - // No symlink support -#else +#ifndef NO_SYMLINKS auto link = __gnu_test::nonexistent_path(); create_symlink(p, link); // dangling symlink ec = bad_ec; 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 943d85c0cc2e3..d5266a4644913 100644 --- a/libstdc++-v3/testsuite/27_io/filesystem/operations/remove_all.cc +++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/remove_all.cc @@ -41,9 +41,7 @@ test01() VERIFY( !ec ); VERIFY( n == 0 ); -#if defined(__MINGW32__) || defined(__MINGW64__) - // No symlink support -#else +#ifndef NO_SYMLINKS auto link = __gnu_test::nonexistent_path(); create_symlink(p, link); // dangling symlink ec = bad_ec; diff --git a/libstdc++-v3/testsuite/27_io/filesystem/operations/rename.cc b/libstdc++-v3/testsuite/27_io/filesystem/operations/rename.cc index f23a2862a0b99..b74e1133a7618 100644 --- a/libstdc++-v3/testsuite/27_io/filesystem/operations/rename.cc +++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/rename.cc @@ -75,9 +75,7 @@ test01() void test_symlinks() { -#if defined(__MINGW32__) || defined(__MINGW64__) - // No symlink support -#else +#ifndef NO_SYMLINKS std::error_code ec; const std::error_code bad_ec = make_error_code(std::errc::invalid_argument); 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 ef973b7807b8a..e00e4aaa78e77 100644 --- a/libstdc++-v3/testsuite/27_io/filesystem/operations/symlink_status.cc +++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/symlink_status.cc @@ -17,7 +17,6 @@ // { dg-do run { target c++17 } } // { dg-require-filesystem-ts "" } -// { dg-xfail-if "symlinks not supported" { *-*-mingw* } } #include <filesystem> #include <testsuite_hooks.h> @@ -39,6 +38,7 @@ test01() fs::file_status st2 = fs::symlink_status(dot); VERIFY( st2.type() == fs::file_type::directory ); +#ifndef NO_SYMLINKS fs::path link = __gnu_test::nonexistent_path(); create_directory_symlink(dot, link); __gnu_test::scoped_file l(link, __gnu_test::scoped_file::adopt_file); @@ -49,6 +49,7 @@ test01() st2 = fs::symlink_status(link, ec); VERIFY( !ec ); VERIFY( st2.type() == fs::file_type::symlink ); +#endif } void @@ -68,6 +69,7 @@ test02() void test03() { +#ifndef NO_SYMLINKS if (!__gnu_test::permissions_are_testable()) return; @@ -111,6 +113,7 @@ test03() VERIFY( st2.type() == fs::file_type::symlink ); fs::permissions(dir, fs::perms::owner_all, ec); +#endif } void 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 244b753f84d1d..ad164f52809f6 100644 --- a/libstdc++-v3/testsuite/27_io/filesystem/operations/weakly_canonical.cc +++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/weakly_canonical.cc @@ -39,9 +39,7 @@ test01() fs::create_directory(bar/"baz"); fs::path p; -#if defined(__MINGW32__) || defined(__MINGW64__) - // No symlink support -#else +#ifndef NO_SYMLINKS fs::create_symlink("../bar", foo/"bar"); p = fs::weakly_canonical(dir/"foo//./bar///../biz/."); diff --git a/libstdc++-v3/testsuite/experimental/filesystem/iterators/recursive_directory_iterator.cc b/libstdc++-v3/testsuite/experimental/filesystem/iterators/recursive_directory_iterator.cc index a201415921cfc..393fb31559369 100644 --- a/libstdc++-v3/testsuite/experimental/filesystem/iterators/recursive_directory_iterator.cc +++ b/libstdc++-v3/testsuite/experimental/filesystem/iterators/recursive_directory_iterator.cc @@ -188,7 +188,7 @@ test05() void test06() { -#if !(defined __MINGW32__ || defined __MINGW64__) +#ifndef NO_SYMLINKS auto p = __gnu_test::nonexistent_path(); create_directories(p/"d1/d2"); create_directory_symlink("d1", p/"link"); diff --git a/libstdc++-v3/testsuite/experimental/filesystem/operations/copy.cc b/libstdc++-v3/testsuite/experimental/filesystem/operations/copy.cc index ca38328c5da15..021897cfede6e 100644 --- a/libstdc++-v3/testsuite/experimental/filesystem/operations/copy.cc +++ b/libstdc++-v3/testsuite/experimental/filesystem/operations/copy.cc @@ -67,11 +67,7 @@ test01() void test02() { -#if defined(__MINGW32__) || defined(__MINGW64__) - // No symlink support - return; -#endif - +#ifndef NO_SYMLINKS auto from = __gnu_test::nonexistent_path(); std::error_code ec, bad = std::make_error_code(std::errc::invalid_argument); @@ -109,6 +105,7 @@ test02() remove(from, ec); remove(to, ec); +#endif } // Test is_regular_file(f) case. diff --git a/libstdc++-v3/testsuite/experimental/filesystem/operations/create_directories.cc b/libstdc++-v3/testsuite/experimental/filesystem/operations/create_directories.cc index 03060c6cbb33e..df27748ff99a3 100644 --- a/libstdc++-v3/testsuite/experimental/filesystem/operations/create_directories.cc +++ b/libstdc++-v3/testsuite/experimental/filesystem/operations/create_directories.cc @@ -147,9 +147,7 @@ test03() void test04() { -#if defined(__MINGW32__) || defined(__MINGW64__) - // no symlinks -#else +#ifndef NO_SYMLINKS // PR libstdc++/101510 // create_directories reports an error if the path is a symlink to a dir std::error_code ec = make_error_code(std::errc::invalid_argument); diff --git a/libstdc++-v3/testsuite/experimental/filesystem/operations/create_directory.cc b/libstdc++-v3/testsuite/experimental/filesystem/operations/create_directory.cc index 67e5fddca0094..5e9346d5c73e5 100644 --- a/libstdc++-v3/testsuite/experimental/filesystem/operations/create_directory.cc +++ b/libstdc++-v3/testsuite/experimental/filesystem/operations/create_directory.cc @@ -69,9 +69,7 @@ test01() VERIFY( e.path1() == f ); } -#if defined(__MINGW32__) || defined(__MINGW64__) - // no symlinks -#else +#ifndef NO_SYMLINKS // PR libstdc++/101510 create_directory on an existing symlink to a directory fs::create_directory(p/"dir"); auto link = p/"link"; diff --git a/libstdc++-v3/testsuite/experimental/filesystem/operations/permissions.cc b/libstdc++-v3/testsuite/experimental/filesystem/operations/permissions.cc index 833aa13dd158b..5866e334d7b46 100644 --- a/libstdc++-v3/testsuite/experimental/filesystem/operations/permissions.cc +++ b/libstdc++-v3/testsuite/experimental/filesystem/operations/permissions.cc @@ -72,6 +72,7 @@ test02() void test03() { +#ifndef NO_SYMLINKS using perms = std::experimental::filesystem::perms; __gnu_test::scoped_file f; @@ -95,11 +96,13 @@ test03() VERIFY( ec == ec2 ); remove(p); +#endif } void test04() { +#ifndef NO_SYMLINKS using perms = std::experimental::filesystem::perms; auto p = __gnu_test::nonexistent_path(); @@ -120,6 +123,7 @@ test04() VERIFY( ec == ec2 ); remove(p); +#endif } void diff --git a/libstdc++-v3/testsuite/experimental/filesystem/operations/read_symlink.cc b/libstdc++-v3/testsuite/experimental/filesystem/operations/read_symlink.cc index 75dae3eac5108..d0a90976a7115 100644 --- a/libstdc++-v3/testsuite/experimental/filesystem/operations/read_symlink.cc +++ b/libstdc++-v3/testsuite/experimental/filesystem/operations/read_symlink.cc @@ -18,7 +18,7 @@ // { dg-options "-DUSE_FILESYSTEM_TS -lstdc++fs" } // { dg-do run { target c++11 } } // { dg-require-filesystem-ts "" } -// { dg-xfail-if "symlinks not supported" { *-*-mingw* } } +// { dg-require-target-fs-symlinks "" } #include <experimental/filesystem> #include <testsuite_hooks.h> diff --git a/libstdc++-v3/testsuite/experimental/filesystem/operations/remove.cc b/libstdc++-v3/testsuite/experimental/filesystem/operations/remove.cc index c01f140ee592a..4ffc74093b8a0 100644 --- a/libstdc++-v3/testsuite/experimental/filesystem/operations/remove.cc +++ b/libstdc++-v3/testsuite/experimental/filesystem/operations/remove.cc @@ -42,10 +42,7 @@ test01() VERIFY( !ec ); VERIFY( !n ); -#if defined(__MINGW32__) || defined(__MINGW64__) - // No symlink support - return; -#else +#ifndef NO_SYMLINKS auto link = __gnu_test::nonexistent_path(); create_symlink(p, link); // dangling symlink ec = bad_ec; diff --git a/libstdc++-v3/testsuite/experimental/filesystem/operations/remove_all.cc b/libstdc++-v3/testsuite/experimental/filesystem/operations/remove_all.cc index 4b0ce85cf9754..11c07d4f781e9 100644 --- a/libstdc++-v3/testsuite/experimental/filesystem/operations/remove_all.cc +++ b/libstdc++-v3/testsuite/experimental/filesystem/operations/remove_all.cc @@ -42,9 +42,7 @@ test01() VERIFY( !ec ); VERIFY( n == 0 ); -#if defined(__MINGW32__) || defined(__MINGW64__) - // No symlink support -#else +#ifndef NO_SYMLINKS auto link = __gnu_test::nonexistent_path(); create_symlink(p, link); // dangling symlink ec = bad_ec; diff --git a/libstdc++-v3/testsuite/experimental/filesystem/operations/rename.cc b/libstdc++-v3/testsuite/experimental/filesystem/operations/rename.cc index 46776e80994e2..37e743b770fdf 100644 --- a/libstdc++-v3/testsuite/experimental/filesystem/operations/rename.cc +++ b/libstdc++-v3/testsuite/experimental/filesystem/operations/rename.cc @@ -75,9 +75,7 @@ test01() void test_symlinks() { -#if defined(__MINGW32__) || defined(__MINGW64__) - // No symlink support -#else +#ifndef NO_SYMLINKS std::error_code ec; const std::error_code bad_ec = make_error_code(std::errc::invalid_argument); diff --git a/libstdc++-v3/testsuite/lib/dg-options.exp b/libstdc++-v3/testsuite/lib/dg-options.exp index 15f37da468a5b..e624a69460ed6 100644 --- a/libstdc++-v3/testsuite/lib/dg-options.exp +++ b/libstdc++-v3/testsuite/lib/dg-options.exp @@ -241,6 +241,15 @@ proc dg-require-filesystem-ts { args } { return } +proc dg-require-target-fs-symlinks { args } { + if { ![ check_v3_target_fs_symlinks ] } { + upvar dg-do-what dg-do-what + set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"] + return + } + return +} + proc add_options_for_no_pch { flags } { # This forces any generated and possibly included PCH to be invalid. return "-D__GLIBCXX__=99999999" diff --git a/libstdc++-v3/testsuite/lib/libstdc++.exp b/libstdc++-v3/testsuite/lib/libstdc++.exp index 93fdfee687ddb..d71d88fb99837 100644 --- a/libstdc++-v3/testsuite/lib/libstdc++.exp +++ b/libstdc++-v3/testsuite/lib/libstdc++.exp @@ -974,13 +974,16 @@ proc v3_try_preprocess { name code flags } { } # Return 1 if COND evaluates to true in the preprocessor, 0 otherwise. -# The <bits/c++config.h> config header is included. -proc v3_check_preprocessor_condition { name cond } { +# The <bits/c++config.h> config header is included, and INC, if given, +# is pasted between it and the condition evaluation, so it can be used +# for additional #include's. +proc v3_check_preprocessor_condition { name cond inc } { global cxxflags global DEFAULT_CXXFLAGS set code " #include <bits/c++config.h> + $inc #if ! ($cond) #error '$cond' is false #endif @@ -1030,7 +1033,7 @@ proc check_v3_target_normal_mode { } { proc check_v3_target_normal_namespace { } { return [check_v3_target_prop_cached et_normal_namespace { set cond "!_GLIBCXX_INLINE_VERSION" - return [v3_check_preprocessor_condition normal_namespace $cond] + return [v3_check_preprocessor_condition normal_namespace $cond ""] }] } @@ -1051,7 +1054,7 @@ proc check_v3_target_parallel_mode { } { proc check_v3_target_cstdint { } { return [check_v3_target_prop_cached et_cstdint { set cond "defined _GLIBCXX_USE_C99_STDINT_TR1" - return [v3_check_preprocessor_condition cstdint $cond] + return [v3_check_preprocessor_condition cstdint $cond ""] }] } @@ -1059,7 +1062,7 @@ proc check_v3_target_cstdint { } { proc check_v3_target_cmath { } { return [check_v3_target_prop_cached et_c99_math { set cond "defined _GLIBCXX_USE_C99_MATH_TR1" - return [v3_check_preprocessor_condition cmath $cond] + return [v3_check_preprocessor_condition cmath $cond ""] }] } @@ -1101,7 +1104,7 @@ proc check_v3_target_thread_fence { } { proc check_v3_target_atomic_builtins { } { return [check_v3_target_prop_cached et_atomic_builtins { set cond "__GCC_ATOMIC_BOOL_LOCK_FREE > 1 && __GCC_ATOMIC_INT_LOCK_FREE > 1" - return [v3_check_preprocessor_condition atomic_builtins $cond] + return [v3_check_preprocessor_condition atomic_builtins $cond ""] }] } @@ -1115,7 +1118,7 @@ proc check_effective_target_atomic_builtins { } { proc check_v3_target_gthreads { } { return [check_v3_target_prop_cached et_gthreads { set cond "defined _GLIBCXX_HAS_GTHREADS" - return [v3_check_preprocessor_condition gthreads $cond] + return [v3_check_preprocessor_condition gthreads $cond ""] }] } @@ -1129,7 +1132,7 @@ proc check_v3_target_gthreads_timed { } { return [check_v3_target_prop_cached et_gthreads_timed { if [check_v3_target_gthreads] { set cond "_GTHREAD_USE_MUTEX_TIMEDLOCK" - return [v3_check_preprocessor_condition gthreads_timed $cond] + return [v3_check_preprocessor_condition gthreads_timed $cond ""] } else { return 0 } @@ -1145,7 +1148,7 @@ proc check_effective_target_gthreads_timed { } { proc check_v3_target_sleep { } { return [check_v3_target_prop_cached et_sleep { set cond "defined _GLIBCXX_USE_NANOSLEEP || defined _GLIBCXX_HAVE_SLEEP" - return [v3_check_preprocessor_condition sleep $cond] + return [v3_check_preprocessor_condition sleep $cond ""] }] } @@ -1153,7 +1156,7 @@ proc check_v3_target_sleep { } { proc check_v3_target_sched_yield { } { return [check_v3_target_prop_cached et_sched_yield { set cond "defined _GLIBCXX_USE_SCHED_YIELD" - return [v3_check_preprocessor_condition sched_yield $cond] + return [v3_check_preprocessor_condition sched_yield $cond ""] }] } @@ -1163,7 +1166,7 @@ proc check_v3_target_string_conversions { } { set cond "_GLIBCXX_USE_C99_STDIO && _GLIBCXX_USE_C99_STDLIB" set cond "$cond && _GLIBCXX_USE_C99_WCHAR" set cond "$cond && !defined _GLIBCXX_HAVE_BROKEN_VSWPRINTF" - return [v3_check_preprocessor_condition string_conversions $cond] + return [v3_check_preprocessor_condition string_conversions $cond ""] }] } @@ -1171,7 +1174,7 @@ proc check_v3_target_string_conversions { } { proc check_v3_target_swprintf { } { return [check_v3_target_prop_cached et_swprintf { set cond "! defined _GLIBCXX_HAVE_BROKEN_VSWPRINTF" - return [v3_check_preprocessor_condition swprintf $cond] + return [v3_check_preprocessor_condition swprintf $cond ""] }] } @@ -1179,7 +1182,7 @@ proc check_v3_target_swprintf { } { proc check_v3_target_binary_io { } { return [check_v3_target_prop_cached et_binary_io { set cond "! defined _GLIBCXX_HAVE_DOS_BASED_FILESYSTEM" - return [v3_check_preprocessor_condition binary_io $cond] + return [v3_check_preprocessor_condition binary_io $cond ""] }] } @@ -1192,7 +1195,7 @@ proc check_v3_target_nprocs { } { set cond "$cond || defined _GLIBCXX_USE_SYSCTL_HW_NCPU" set cond "$cond || defined _GLIBCXX_USE_SC_NPROCESSORS_ONLN" set cond "$cond || defined _GLIBCXX_USE_SC_NPROC_ONLN" - return [v3_check_preprocessor_condition nprocs $cond] + return [v3_check_preprocessor_condition nprocs $cond ""] }] } @@ -1267,19 +1270,27 @@ proc check_v3_target_filesystem_ts { } { }] } +# Return 1 if the libstdc++ filesystem create_symlinks implementation +# is not an always-failing dummy. +proc check_v3_target_fs_symlinks { } { + set inc "#include <testsuite_fs.h>" + set cond "!defined NO_SYMLINKS" + return [v3_check_preprocessor_condition fs_symlinks $cond $inc] +} + # Return 1 if the "cxx11" ABI is in use using the current flags, 0 otherwise. # Any flags provided by RUNTESTFLAGS or a target board will be used here. # Flags added in the test by dg-options or dg-add-options will not be used. proc check_effective_target_cxx11_abi { } { set cond "_GLIBCXX_USE_CXX11_ABI" - return [v3_check_preprocessor_condition cxx11_abi $cond] + return [v3_check_preprocessor_condition cxx11_abi $cond ""] } # Return 1 if std::random_device should be usable using the current flags, # 0 otherwise. proc check_effective_target_random_device { } { set cond "_GLIBCXX_USE_RANDOM_TR1" - return [v3_check_preprocessor_condition random_device $cond] + return [v3_check_preprocessor_condition random_device $cond ""] } # Return 1 if tbb parallel backend is available, 0 otherwise. @@ -1318,7 +1329,7 @@ proc check_effective_target_tbb_backend { } { proc check_effective_target_futex { } { return [check_v3_target_prop_cached et_futex { set cond "_GLIBCXX_HAVE_LINUX_FUTEX" - return [v3_check_preprocessor_condition futex $cond] + return [v3_check_preprocessor_condition futex $cond ""] }] } @@ -1326,7 +1337,7 @@ proc check_effective_target_futex { } { proc check_effective_target_ieee_floats { } { return [check_v3_target_prop_cached et_ieee_floats { set cond "_GLIBCXX_FLOAT_IS_IEEE_BINARY32 && _GLIBCXX_DOUBLE_IS_IEEE_BINARY64" - return [v3_check_preprocessor_condition ieee_floats $cond] + return [v3_check_preprocessor_condition ieee_floats $cond ""] }] } @@ -1334,7 +1345,7 @@ proc check_effective_target_ieee_floats { } { proc check_effective_target_net_ts_ip { } { return [check_v3_target_prop_cached et_net_ts_ip { set cond "__has_include(<netinet/in.h>)" - return [v3_check_preprocessor_condition net_ts_ip $cond] + return [v3_check_preprocessor_condition net_ts_ip $cond ""] }] } @@ -1342,7 +1353,7 @@ proc check_effective_target_net_ts_ip { } { proc check_effective_target_std_allocator_new { } { return [check_v3_target_prop_cached et_std_alloc_new { set cond "_GLIBCXX_USE_ALLOCATOR_NEW" - return [v3_check_preprocessor_condition std_alloc_new $cond] + return [v3_check_preprocessor_condition std_alloc_new $cond ""] }] } @@ -1350,7 +1361,7 @@ proc check_effective_target_std_allocator_new { } { proc check_effective_target_stacktrace { } { return [check_v3_target_prop_cached et_stacktrace { set cond "_GLIBCXX_HAVE_STACKTRACE" - return [v3_check_preprocessor_condition stacktrace $cond] + return [v3_check_preprocessor_condition stacktrace $cond ""] }] } @@ -1358,7 +1369,7 @@ proc check_effective_target_stacktrace { } { proc check_effective_target_rtti { } { return [check_v3_target_prop_cached et_rtti { set cond "__cpp_rtti" - return [v3_check_preprocessor_condition rtti $cond] + return [v3_check_preprocessor_condition rtti $cond ""] }] } diff --git a/libstdc++-v3/testsuite/util/testsuite_fs.h b/libstdc++-v3/testsuite/util/testsuite_fs.h index 9358a04e56c1f..048f03103e436 100644 --- a/libstdc++-v3/testsuite/util/testsuite_fs.h +++ b/libstdc++-v3/testsuite/util/testsuite_fs.h @@ -42,6 +42,11 @@ namespace test_fs = std::experimental::filesystem; #include <random> // std::random_device #endif +#if defined(__MINGW32__) || defined(__MINGW64__) \ + || !defined (_GLIBCXX_HAVE_SYMLINK) +#define NO_SYMLINKS +#endif + namespace __gnu_test { #define PATH_CHK(p1, p2, fn) \
On Thu, 23 Jun 2022 at 12:02, Alexandre Oliva <oliva@adacore.com> wrote: > > On Jun 22, 2022, Jonathan Wakely <jwakely@redhat.com> wrote: > > > OK. > > > I'd like to clean this up so the tests don't rely on the "internal" > > HAVE_SYMLINK macro. We could add something like this to > > testsuite/util/testsuite_fs.h > > > #if defined(__MINGW32__) || defined(__MINGW64__) \ > > || !defined (_GLIBCXX_HAVE_SYMLINK) > > # define NO_SYMLINKS > > #endif > > I took your suggestion, and took it a little further. Here's the > result. Nice, thanks! > > Regstrapped on x86_64-linux-gnu, also tested with a cross to > aarch64-rtems6. Ok to install? All the changes to the actual tests are fine. > diff --git a/libstdc++-v3/testsuite/lib/libstdc++.exp b/libstdc++-v3/testsuite/lib/libstdc++.exp > index 93fdfee687ddb..d71d88fb99837 100644 > --- a/libstdc++-v3/testsuite/lib/libstdc++.exp > +++ b/libstdc++-v3/testsuite/lib/libstdc++.exp > @@ -974,13 +974,16 @@ proc v3_try_preprocess { name code flags } { > } > > # Return 1 if COND evaluates to true in the preprocessor, 0 otherwise. > -# The <bits/c++config.h> config header is included. > -proc v3_check_preprocessor_condition { name cond } { > +# The <bits/c++config.h> config header is included, and INC, if given, > +# is pasted between it and the condition evaluation, so it can be used > +# for additional #include's. > +proc v3_check_preprocessor_condition { name cond inc } { Could this new arg be given a default value, so every caller doesn't have to pass "" to it? proc v3_check_preprocessor_condition { name cond {inc ""} } { > diff --git a/libstdc++-v3/testsuite/util/testsuite_fs.h b/libstdc++-v3/testsuite/util/testsuite_fs.h > index 9358a04e56c1f..048f03103e436 100644 > --- a/libstdc++-v3/testsuite/util/testsuite_fs.h > +++ b/libstdc++-v3/testsuite/util/testsuite_fs.h > @@ -42,6 +42,11 @@ namespace test_fs = std::experimental::filesystem; > #include <random> // std::random_device > #endif > > +#if defined(__MINGW32__) || defined(__MINGW64__) \ > + || !defined (_GLIBCXX_HAVE_SYMLINK) > +#define NO_SYMLINKS > +#endif I think this could be simplified to just #ifndef _GLIBCXX_HAVE_SYMLINK because that is false on mingw: $ grep HAVE_SYMLINK include/x86_64-w64-mingw32/bits/c++config.h /* #undef _GLIBCXX_HAVE_SYMLINK */ Windows uses CreateSymbolicLinkA to create its symlinks. And if NO_SYMLINKS just becomes a "public" name for _GLIBCXX_HAVE_SYMLINK that we can use in tests, then the dg check_v3_target_fs_symlinks proc could just test that macro too, without needing to include <testsuite_fs.h> to test NO_SYMLINKS. I don't feel strongly about that though. The $inc addition to v3_check_preprocessor_condition seems useful (although it will slow down evaluation of that condition, because <testsuite_fs.h> includes a lot of other headers). And if the definition of NO_SYMLINKS gets more complicated in future (e.g. we add something like && !defined __foo__) then using NO_SYMLINKS in the dg proc will keep them in sync. I'd like the default argument for v3_check_preprocessor_condition so we don't need to add "" everywhere in that file, but the rest of the patch is OK as-is or simplified as above, I don't mind. Even keeping the MINGW tests in the NO_SYMLINKS definition is OK (it certainly doesn't hurt, it's just a bit redundant).
On Thu, 23 Jun 2022 at 12:28, Jonathan Wakely <jwakely@redhat.com> wrote: > > On Thu, 23 Jun 2022 at 12:02, Alexandre Oliva <oliva@adacore.com> wrote: > > > > On Jun 22, 2022, Jonathan Wakely <jwakely@redhat.com> wrote: > > > > > OK. > > > > > I'd like to clean this up so the tests don't rely on the "internal" > > > HAVE_SYMLINK macro. We could add something like this to > > > testsuite/util/testsuite_fs.h > > > > > #if defined(__MINGW32__) || defined(__MINGW64__) \ > > > || !defined (_GLIBCXX_HAVE_SYMLINK) > > > # define NO_SYMLINKS > > > #endif > > > > I took your suggestion, and took it a little further. Here's the > > result. > > Nice, thanks! > > > > > Regstrapped on x86_64-linux-gnu, also tested with a cross to > > aarch64-rtems6. Ok to install? > > All the changes to the actual tests are fine. > > > diff --git a/libstdc++-v3/testsuite/lib/libstdc++.exp b/libstdc++-v3/testsuite/lib/libstdc++.exp > > index 93fdfee687ddb..d71d88fb99837 100644 > > --- a/libstdc++-v3/testsuite/lib/libstdc++.exp > > +++ b/libstdc++-v3/testsuite/lib/libstdc++.exp > > @@ -974,13 +974,16 @@ proc v3_try_preprocess { name code flags } { > > } > > > > # Return 1 if COND evaluates to true in the preprocessor, 0 otherwise. > > -# The <bits/c++config.h> config header is included. > > -proc v3_check_preprocessor_condition { name cond } { > > +# The <bits/c++config.h> config header is included, and INC, if given, > > +# is pasted between it and the condition evaluation, so it can be used > > +# for additional #include's. > > +proc v3_check_preprocessor_condition { name cond inc } { > > Could this new arg be given a default value, so every caller doesn't > have to pass "" to it? > > proc v3_check_preprocessor_condition { name cond {inc ""} } { > > > diff --git a/libstdc++-v3/testsuite/util/testsuite_fs.h b/libstdc++-v3/testsuite/util/testsuite_fs.h > > index 9358a04e56c1f..048f03103e436 100644 > > --- a/libstdc++-v3/testsuite/util/testsuite_fs.h > > +++ b/libstdc++-v3/testsuite/util/testsuite_fs.h > > @@ -42,6 +42,11 @@ namespace test_fs = std::experimental::filesystem; > > #include <random> // std::random_device > > #endif > > > > +#if defined(__MINGW32__) || defined(__MINGW64__) \ > > + || !defined (_GLIBCXX_HAVE_SYMLINK) > > +#define NO_SYMLINKS > > +#endif > > I think this could be simplified to just > #ifndef _GLIBCXX_HAVE_SYMLINK > because that is false on mingw: > $ grep HAVE_SYMLINK include/x86_64-w64-mingw32/bits/c++config.h > /* #undef _GLIBCXX_HAVE_SYMLINK */ > > Windows uses CreateSymbolicLinkA to create its symlinks. > > And if NO_SYMLINKS just becomes a "public" name for > _GLIBCXX_HAVE_SYMLINK that we can use in tests, then the dg > check_v3_target_fs_symlinks proc could just test that macro too, > without needing to include <testsuite_fs.h> to test NO_SYMLINKS. I > don't feel strongly about that though. The $inc addition to > v3_check_preprocessor_condition seems useful (although it will slow > down evaluation of that condition, because <testsuite_fs.h> includes a > lot of other headers). > And if the definition of NO_SYMLINKS gets more complicated in future > (e.g. we add something like && !defined __foo__) then using > NO_SYMLINKS in the dg proc will keep them in sync. Oh, and we need to be able to include <testsuite_fs.h> for the similar NO_SPACE macro in your next patch, so we might as well check NO_SYMLINKS the same way. > I'd like the default argument for v3_check_preprocessor_condition so > we don't need to add "" everywhere in that file, but the rest of the > patch is OK as-is or simplified as above, I don't mind. Even keeping > the MINGW tests in the NO_SYMLINKS definition is OK (it certainly > doesn't hurt, it's just a bit redundant).
On Thu, 23 Jun 2022 at 11:53, Alexandre Oliva <oliva@adacore.com> wrote: > > On Jun 22, 2022, Jonathan Wakely <jwakely@redhat.com> wrote: > > > Which tests are failing? I might be able to point you to the cause > > much faster than you can debug it yourself. > > With commit 7e2db5d102dd05ffa9c46b89616f7a700a9889f8 (current > refs/users/aoliva/heads/testme) I get: [...] > UNRESOLVED: 26_numerics/random/random_device/entropy.cc compilation failed to produce executable > error: 'log2' is not a member of 'std'; did you mean 'log'? That one should be fixed by r13-1214-g78fd15fd4a641c
On Jun 23, 2022, Jonathan Wakely <jwakely@redhat.com> wrote: > Could this new arg be given a default value, so every caller doesn't > have to pass "" to it? > proc v3_check_preprocessor_condition { name cond {inc ""} } { Oh, nice, I didn't know about this convenient notation for default args in tcl, and the one I knew about I found too cumbersome. Thanks for the tip, I put it in the patch below. > #ifndef _GLIBCXX_HAVE_SYMLINK And this too. > And if the definition of NO_SYMLINKS gets more complicated in future > (e.g. we add something like && !defined __foo__) then using > NO_SYMLINKS in the dg proc will keep them in sync. 'zactly my thinking. Here's what I'm testing (same way). Ok to install if it passes? libstdc++: testsuite: conditionalize symlink tests From: Alexandre Oliva <oliva@adacore.com> Several filesystem tests expect to be able to create symlinks even when !defined (_GLIBCXX_HAVE_SYMLINK), and fail predictably, reducing the amount of testing of other filesystem features. They are already skipped for mingw targets. I've extended the skipping to other targets in which _GLIBCXX_HAVE_SYMLINK is undefined, through a new NO_SYMLINKS macro in testsuite_fs.h that guards skippable portions of tests, and dg-require-target-fs-symlinks for tests that would be reduced to nothing. for libstdc++-v3/ChangeLog * testsuite/util/testsuite_fs.h (NO_SYMLINKS): Define on mingw and when create_symlink is a dummy. * testsuite/27_io/filesystem/operations/symlink_status.cc: Drop mingw xfail. (test01, test02): Don't create symlinks when NO_SYMLINKS is defined. * testsuite/27_io/filesystem/operations/canonical.cc (test03): Likewise. * testsuite/27_io/filesystem/operations/copy.cc (test02): Likewise. * testsuite/27_io/filesystem/operations/create_directories.cc (test04): Likewise. * testsuite/27_io/filesystem/operations/create_directory.cc (test01): Likewise. * testsuite/27_io/filesystem/operations/permissions.cc (test03, test04): Likewise. * testsuite/27_io/filesystem/operations/remove.cc (test01): Likewise. * testsuite/27_io/filesystem/operations/remove_all.cc (test01): Likewise. * testsuite/27_io/filesystem/operations/rename.cc (test_symlinks): Likewise. * testsuite/27_io/filesystem/operations/weakly_canonical.cc (test01): Likewise. * testsuite/experimental/filesystem/iterators/recursive_directory_itreator.cc (test06): Likewise. * testsuite/experimental/filesystem/operations/copy.cc (test01): Likewise. * testsuite/experimental/filesystem/operations/create_directories.cc (test04): Likewise. * testsuite/experimental/filesystem/operations/create_directory.cc (test01): Likewise. * testsuite/experimental/filesystem/operations/permissions.cc (test03, test04): Likewise. * testsuite/experimental/filesystem/operations/remove.cc (test01): Likewise. * testsuite/experimental/filesystem/operations/remove_all.cc (test01): Likewise. * testsuite/experimental/filesystem/operations/rename.cc (test01): Likewise. * testsuite/lib/libstdc++.exp (v3_check_preprocessor_condition): Add optional inc parameter. Add it to the test program after include bits/c++config.h. (check_v3_target_fs_symlinks): New. * testsuite/lib/dg-options.exp (dg-require-target-fs-symlinks): New. * testsuite/27_io/filesystem/operations/read_symlink.cc: Replace mingw xfail with require target-fs-symlinks. * testsuite/experimental/filesystem/operations/read_symlink.cc: Likewise. --- .../27_io/filesystem/operations/canonical.cc | 5 ++++- .../testsuite/27_io/filesystem/operations/copy.cc | 7 ++----- .../filesystem/operations/create_directories.cc | 4 +--- .../filesystem/operations/create_directory.cc | 4 +--- .../27_io/filesystem/operations/permissions.cc | 4 ++++ .../27_io/filesystem/operations/read_symlink.cc | 2 +- .../27_io/filesystem/operations/remove.cc | 4 +--- .../27_io/filesystem/operations/remove_all.cc | 4 +--- .../27_io/filesystem/operations/rename.cc | 4 +--- .../27_io/filesystem/operations/symlink_status.cc | 5 ++++- .../filesystem/operations/weakly_canonical.cc | 4 +--- .../iterators/recursive_directory_iterator.cc | 2 +- .../experimental/filesystem/operations/copy.cc | 7 ++----- .../filesystem/operations/create_directories.cc | 4 +--- .../filesystem/operations/create_directory.cc | 4 +--- .../filesystem/operations/permissions.cc | 4 ++++ .../filesystem/operations/read_symlink.cc | 2 +- .../experimental/filesystem/operations/remove.cc | 5 +---- .../filesystem/operations/remove_all.cc | 4 +--- .../experimental/filesystem/operations/rename.cc | 4 +--- libstdc++-v3/testsuite/lib/dg-options.exp | 9 +++++++++ libstdc++-v3/testsuite/lib/libstdc++.exp | 15 +++++++++++++-- libstdc++-v3/testsuite/util/testsuite_fs.h | 4 ++++ 23 files changed, 60 insertions(+), 51 deletions(-) diff --git a/libstdc++-v3/testsuite/27_io/filesystem/operations/canonical.cc b/libstdc++-v3/testsuite/27_io/filesystem/operations/canonical.cc index bc7ef0de2b716..9c432b25acfb6 100644 --- a/libstdc++-v3/testsuite/27_io/filesystem/operations/canonical.cc +++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/canonical.cc @@ -111,9 +111,12 @@ test03() fs::path foo = dir/"foo", bar = dir/"bar"; fs::create_directory(foo); fs::create_directory(bar); +#ifdef NO_SYMLINKS #if defined(__MINGW32__) || defined(__MINGW64__) - // No symlink support const fs::path baz = dir/"foo\\\\..\\bar///"; +#else + const fs::path baz = dir/"foo//../bar///"; +#endif #else fs::create_symlink("../bar", foo/"baz"); const fs::path baz = dir/"foo//./baz///"; diff --git a/libstdc++-v3/testsuite/27_io/filesystem/operations/copy.cc b/libstdc++-v3/testsuite/27_io/filesystem/operations/copy.cc index f3081f4b64ebc..f9fb4dff77ecd 100644 --- a/libstdc++-v3/testsuite/27_io/filesystem/operations/copy.cc +++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/copy.cc @@ -66,11 +66,7 @@ test01() void test02() { -#if defined(__MINGW32__) || defined(__MINGW64__) - // No symlink support - return; -#endif - +#ifndef NO_SYMLINKS const std::error_code bad_ec = make_error_code(std::errc::invalid_argument); auto from = __gnu_test::nonexistent_path(); std::error_code ec; @@ -110,6 +106,7 @@ test02() remove(from, ec); remove(to, ec); +#endif } // Test is_regular_file(f) case. 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 4a7ba1fcb4944..2b48c152e39a9 100644 --- a/libstdc++-v3/testsuite/27_io/filesystem/operations/create_directories.cc +++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/create_directories.cc @@ -148,9 +148,7 @@ test03() void test04() { -#if defined(__MINGW32__) || defined(__MINGW64__) - // no symlinks -#else +#ifndef NO_SYMLINKS // PR libstdc++/101510 // create_directories reports an error if the path is a symlink to a dir std::error_code ec = make_error_code(std::errc::invalid_argument); 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 90f98302c00f8..aa59f7f3ee22d 100644 --- a/libstdc++-v3/testsuite/27_io/filesystem/operations/create_directory.cc +++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/create_directory.cc @@ -70,9 +70,7 @@ test01() VERIFY( e.path1() == f ); } -#if defined(__MINGW32__) || defined(__MINGW64__) - // no symlinks -#else +#ifndef NO_SYMLINKS // PR libstdc++/101510 create_directory on an existing symlink to a directory fs::create_directory(p/"dir"); auto link = p/"link"; diff --git a/libstdc++-v3/testsuite/27_io/filesystem/operations/permissions.cc b/libstdc++-v3/testsuite/27_io/filesystem/operations/permissions.cc index deed759be80e9..ee5afd529bac4 100644 --- a/libstdc++-v3/testsuite/27_io/filesystem/operations/permissions.cc +++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/permissions.cc @@ -76,6 +76,7 @@ test02() void test03() { +#ifndef NO_SYMLINKS using std::filesystem::perms; using std::filesystem::perm_options; @@ -111,11 +112,13 @@ test03() VERIFY( !caught ); remove(p); +#endif } void test04() { +#ifndef NO_SYMLINKS using perms = std::filesystem::perms; auto p = __gnu_test::nonexistent_path(); @@ -137,6 +140,7 @@ test04() VERIFY( ec == ec2 ); remove(p); +#endif } void 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 68bbab33bc9e2..030d6271de525 100644 --- a/libstdc++-v3/testsuite/27_io/filesystem/operations/read_symlink.cc +++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/read_symlink.cc @@ -17,7 +17,7 @@ // { dg-do run { target c++17 } } // { dg-require-filesystem-ts "" } -// { dg-xfail-if "symlinks not supported" { *-*-mingw* } } +// { dg-require-target-fs-symlinks "" } #include <filesystem> #include <testsuite_hooks.h> diff --git a/libstdc++-v3/testsuite/27_io/filesystem/operations/remove.cc b/libstdc++-v3/testsuite/27_io/filesystem/operations/remove.cc index 26f2d548f82d5..f769723ae30fa 100644 --- a/libstdc++-v3/testsuite/27_io/filesystem/operations/remove.cc +++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/remove.cc @@ -41,9 +41,7 @@ test01() VERIFY( !ec ); VERIFY( !n ); -#if defined(__MINGW32__) || defined(__MINGW64__) - // No symlink support -#else +#ifndef NO_SYMLINKS auto link = __gnu_test::nonexistent_path(); create_symlink(p, link); // dangling symlink ec = bad_ec; 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 943d85c0cc2e3..d5266a4644913 100644 --- a/libstdc++-v3/testsuite/27_io/filesystem/operations/remove_all.cc +++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/remove_all.cc @@ -41,9 +41,7 @@ test01() VERIFY( !ec ); VERIFY( n == 0 ); -#if defined(__MINGW32__) || defined(__MINGW64__) - // No symlink support -#else +#ifndef NO_SYMLINKS auto link = __gnu_test::nonexistent_path(); create_symlink(p, link); // dangling symlink ec = bad_ec; diff --git a/libstdc++-v3/testsuite/27_io/filesystem/operations/rename.cc b/libstdc++-v3/testsuite/27_io/filesystem/operations/rename.cc index f23a2862a0b99..b74e1133a7618 100644 --- a/libstdc++-v3/testsuite/27_io/filesystem/operations/rename.cc +++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/rename.cc @@ -75,9 +75,7 @@ test01() void test_symlinks() { -#if defined(__MINGW32__) || defined(__MINGW64__) - // No symlink support -#else +#ifndef NO_SYMLINKS std::error_code ec; const std::error_code bad_ec = make_error_code(std::errc::invalid_argument); 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 ef973b7807b8a..e00e4aaa78e77 100644 --- a/libstdc++-v3/testsuite/27_io/filesystem/operations/symlink_status.cc +++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/symlink_status.cc @@ -17,7 +17,6 @@ // { dg-do run { target c++17 } } // { dg-require-filesystem-ts "" } -// { dg-xfail-if "symlinks not supported" { *-*-mingw* } } #include <filesystem> #include <testsuite_hooks.h> @@ -39,6 +38,7 @@ test01() fs::file_status st2 = fs::symlink_status(dot); VERIFY( st2.type() == fs::file_type::directory ); +#ifndef NO_SYMLINKS fs::path link = __gnu_test::nonexistent_path(); create_directory_symlink(dot, link); __gnu_test::scoped_file l(link, __gnu_test::scoped_file::adopt_file); @@ -49,6 +49,7 @@ test01() st2 = fs::symlink_status(link, ec); VERIFY( !ec ); VERIFY( st2.type() == fs::file_type::symlink ); +#endif } void @@ -68,6 +69,7 @@ test02() void test03() { +#ifndef NO_SYMLINKS if (!__gnu_test::permissions_are_testable()) return; @@ -111,6 +113,7 @@ test03() VERIFY( st2.type() == fs::file_type::symlink ); fs::permissions(dir, fs::perms::owner_all, ec); +#endif } void 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 244b753f84d1d..ad164f52809f6 100644 --- a/libstdc++-v3/testsuite/27_io/filesystem/operations/weakly_canonical.cc +++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/weakly_canonical.cc @@ -39,9 +39,7 @@ test01() fs::create_directory(bar/"baz"); fs::path p; -#if defined(__MINGW32__) || defined(__MINGW64__) - // No symlink support -#else +#ifndef NO_SYMLINKS fs::create_symlink("../bar", foo/"bar"); p = fs::weakly_canonical(dir/"foo//./bar///../biz/."); diff --git a/libstdc++-v3/testsuite/experimental/filesystem/iterators/recursive_directory_iterator.cc b/libstdc++-v3/testsuite/experimental/filesystem/iterators/recursive_directory_iterator.cc index a201415921cfc..393fb31559369 100644 --- a/libstdc++-v3/testsuite/experimental/filesystem/iterators/recursive_directory_iterator.cc +++ b/libstdc++-v3/testsuite/experimental/filesystem/iterators/recursive_directory_iterator.cc @@ -188,7 +188,7 @@ test05() void test06() { -#if !(defined __MINGW32__ || defined __MINGW64__) +#ifndef NO_SYMLINKS auto p = __gnu_test::nonexistent_path(); create_directories(p/"d1/d2"); create_directory_symlink("d1", p/"link"); diff --git a/libstdc++-v3/testsuite/experimental/filesystem/operations/copy.cc b/libstdc++-v3/testsuite/experimental/filesystem/operations/copy.cc index ca38328c5da15..021897cfede6e 100644 --- a/libstdc++-v3/testsuite/experimental/filesystem/operations/copy.cc +++ b/libstdc++-v3/testsuite/experimental/filesystem/operations/copy.cc @@ -67,11 +67,7 @@ test01() void test02() { -#if defined(__MINGW32__) || defined(__MINGW64__) - // No symlink support - return; -#endif - +#ifndef NO_SYMLINKS auto from = __gnu_test::nonexistent_path(); std::error_code ec, bad = std::make_error_code(std::errc::invalid_argument); @@ -109,6 +105,7 @@ test02() remove(from, ec); remove(to, ec); +#endif } // Test is_regular_file(f) case. diff --git a/libstdc++-v3/testsuite/experimental/filesystem/operations/create_directories.cc b/libstdc++-v3/testsuite/experimental/filesystem/operations/create_directories.cc index 03060c6cbb33e..df27748ff99a3 100644 --- a/libstdc++-v3/testsuite/experimental/filesystem/operations/create_directories.cc +++ b/libstdc++-v3/testsuite/experimental/filesystem/operations/create_directories.cc @@ -147,9 +147,7 @@ test03() void test04() { -#if defined(__MINGW32__) || defined(__MINGW64__) - // no symlinks -#else +#ifndef NO_SYMLINKS // PR libstdc++/101510 // create_directories reports an error if the path is a symlink to a dir std::error_code ec = make_error_code(std::errc::invalid_argument); diff --git a/libstdc++-v3/testsuite/experimental/filesystem/operations/create_directory.cc b/libstdc++-v3/testsuite/experimental/filesystem/operations/create_directory.cc index 67e5fddca0094..5e9346d5c73e5 100644 --- a/libstdc++-v3/testsuite/experimental/filesystem/operations/create_directory.cc +++ b/libstdc++-v3/testsuite/experimental/filesystem/operations/create_directory.cc @@ -69,9 +69,7 @@ test01() VERIFY( e.path1() == f ); } -#if defined(__MINGW32__) || defined(__MINGW64__) - // no symlinks -#else +#ifndef NO_SYMLINKS // PR libstdc++/101510 create_directory on an existing symlink to a directory fs::create_directory(p/"dir"); auto link = p/"link"; diff --git a/libstdc++-v3/testsuite/experimental/filesystem/operations/permissions.cc b/libstdc++-v3/testsuite/experimental/filesystem/operations/permissions.cc index 833aa13dd158b..5866e334d7b46 100644 --- a/libstdc++-v3/testsuite/experimental/filesystem/operations/permissions.cc +++ b/libstdc++-v3/testsuite/experimental/filesystem/operations/permissions.cc @@ -72,6 +72,7 @@ test02() void test03() { +#ifndef NO_SYMLINKS using perms = std::experimental::filesystem::perms; __gnu_test::scoped_file f; @@ -95,11 +96,13 @@ test03() VERIFY( ec == ec2 ); remove(p); +#endif } void test04() { +#ifndef NO_SYMLINKS using perms = std::experimental::filesystem::perms; auto p = __gnu_test::nonexistent_path(); @@ -120,6 +123,7 @@ test04() VERIFY( ec == ec2 ); remove(p); +#endif } void diff --git a/libstdc++-v3/testsuite/experimental/filesystem/operations/read_symlink.cc b/libstdc++-v3/testsuite/experimental/filesystem/operations/read_symlink.cc index 75dae3eac5108..d0a90976a7115 100644 --- a/libstdc++-v3/testsuite/experimental/filesystem/operations/read_symlink.cc +++ b/libstdc++-v3/testsuite/experimental/filesystem/operations/read_symlink.cc @@ -18,7 +18,7 @@ // { dg-options "-DUSE_FILESYSTEM_TS -lstdc++fs" } // { dg-do run { target c++11 } } // { dg-require-filesystem-ts "" } -// { dg-xfail-if "symlinks not supported" { *-*-mingw* } } +// { dg-require-target-fs-symlinks "" } #include <experimental/filesystem> #include <testsuite_hooks.h> diff --git a/libstdc++-v3/testsuite/experimental/filesystem/operations/remove.cc b/libstdc++-v3/testsuite/experimental/filesystem/operations/remove.cc index c01f140ee592a..4ffc74093b8a0 100644 --- a/libstdc++-v3/testsuite/experimental/filesystem/operations/remove.cc +++ b/libstdc++-v3/testsuite/experimental/filesystem/operations/remove.cc @@ -42,10 +42,7 @@ test01() VERIFY( !ec ); VERIFY( !n ); -#if defined(__MINGW32__) || defined(__MINGW64__) - // No symlink support - return; -#else +#ifndef NO_SYMLINKS auto link = __gnu_test::nonexistent_path(); create_symlink(p, link); // dangling symlink ec = bad_ec; diff --git a/libstdc++-v3/testsuite/experimental/filesystem/operations/remove_all.cc b/libstdc++-v3/testsuite/experimental/filesystem/operations/remove_all.cc index 4b0ce85cf9754..11c07d4f781e9 100644 --- a/libstdc++-v3/testsuite/experimental/filesystem/operations/remove_all.cc +++ b/libstdc++-v3/testsuite/experimental/filesystem/operations/remove_all.cc @@ -42,9 +42,7 @@ test01() VERIFY( !ec ); VERIFY( n == 0 ); -#if defined(__MINGW32__) || defined(__MINGW64__) - // No symlink support -#else +#ifndef NO_SYMLINKS auto link = __gnu_test::nonexistent_path(); create_symlink(p, link); // dangling symlink ec = bad_ec; diff --git a/libstdc++-v3/testsuite/experimental/filesystem/operations/rename.cc b/libstdc++-v3/testsuite/experimental/filesystem/operations/rename.cc index 46776e80994e2..37e743b770fdf 100644 --- a/libstdc++-v3/testsuite/experimental/filesystem/operations/rename.cc +++ b/libstdc++-v3/testsuite/experimental/filesystem/operations/rename.cc @@ -75,9 +75,7 @@ test01() void test_symlinks() { -#if defined(__MINGW32__) || defined(__MINGW64__) - // No symlink support -#else +#ifndef NO_SYMLINKS std::error_code ec; const std::error_code bad_ec = make_error_code(std::errc::invalid_argument); diff --git a/libstdc++-v3/testsuite/lib/dg-options.exp b/libstdc++-v3/testsuite/lib/dg-options.exp index 15f37da468a5b..e624a69460ed6 100644 --- a/libstdc++-v3/testsuite/lib/dg-options.exp +++ b/libstdc++-v3/testsuite/lib/dg-options.exp @@ -241,6 +241,15 @@ proc dg-require-filesystem-ts { args } { return } +proc dg-require-target-fs-symlinks { args } { + if { ![ check_v3_target_fs_symlinks ] } { + upvar dg-do-what dg-do-what + set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"] + return + } + return +} + proc add_options_for_no_pch { flags } { # This forces any generated and possibly included PCH to be invalid. return "-D__GLIBCXX__=99999999" diff --git a/libstdc++-v3/testsuite/lib/libstdc++.exp b/libstdc++-v3/testsuite/lib/libstdc++.exp index 93fdfee687ddb..03f47e8d77242 100644 --- a/libstdc++-v3/testsuite/lib/libstdc++.exp +++ b/libstdc++-v3/testsuite/lib/libstdc++.exp @@ -974,13 +974,16 @@ proc v3_try_preprocess { name code flags } { } # Return 1 if COND evaluates to true in the preprocessor, 0 otherwise. -# The <bits/c++config.h> config header is included. -proc v3_check_preprocessor_condition { name cond } { +# The <bits/c++config.h> config header is included, and INC, if given, +# is pasted between it and the condition evaluation, so it can be used +# for additional #include's. +proc v3_check_preprocessor_condition { name cond { inc "" } } { global cxxflags global DEFAULT_CXXFLAGS set code " #include <bits/c++config.h> + $inc #if ! ($cond) #error '$cond' is false #endif @@ -1267,6 +1270,14 @@ proc check_v3_target_filesystem_ts { } { }] } +# Return 1 if the libstdc++ filesystem create_symlinks implementation +# is not an always-failing dummy. +proc check_v3_target_fs_symlinks { } { + set inc "#include <testsuite_fs.h>" + set cond "!defined NO_SYMLINKS" + return [v3_check_preprocessor_condition fs_symlinks $cond $inc] +} + # Return 1 if the "cxx11" ABI is in use using the current flags, 0 otherwise. # Any flags provided by RUNTESTFLAGS or a target board will be used here. # Flags added in the test by dg-options or dg-add-options will not be used. diff --git a/libstdc++-v3/testsuite/util/testsuite_fs.h b/libstdc++-v3/testsuite/util/testsuite_fs.h index 9358a04e56c1f..03af7ae96e31a 100644 --- a/libstdc++-v3/testsuite/util/testsuite_fs.h +++ b/libstdc++-v3/testsuite/util/testsuite_fs.h @@ -42,6 +42,10 @@ namespace test_fs = std::experimental::filesystem; #include <random> // std::random_device #endif +#ifndef _GLIBCXX_HAVE_SYMLINK +#define NO_SYMLINKS +#endif + namespace __gnu_test { #define PATH_CHK(p1, p2, fn) \
On Thu, 23 Jun 2022 at 13:36, Alexandre Oliva <oliva@adacore.com> wrote: > > On Jun 23, 2022, Jonathan Wakely <jwakely@redhat.com> wrote: > > > Could this new arg be given a default value, so every caller doesn't > > have to pass "" to it? > > > proc v3_check_preprocessor_condition { name cond {inc ""} } { > > Oh, nice, I didn't know about this convenient notation for default args > in tcl, and the one I knew about I found too cumbersome. Thanks for the > tip, I put it in the patch below. > > > #ifndef _GLIBCXX_HAVE_SYMLINK > > And this too. > > > And if the definition of NO_SYMLINKS gets more complicated in future > > (e.g. we add something like && !defined __foo__) then using > > NO_SYMLINKS in the dg proc will keep them in sync. > > 'zactly my thinking. > > > Here's what I'm testing (same way). Ok to install if it passes? Yes please, thanks for iterating to get this here.
On Jun 23, 2022, Alexandre Oliva <oliva@adacore.com> wrote:
> * testsuite/experimental/filesystem/iterators/recursive_directory_itreator.cc
s/itreator/iterator/ for the checkin, thanks to the ChangeLog checker :-)
On Jun 23, 2022, Alexandre Oliva <oliva@adacore.com> wrote:
> libstdc++: testsuite: conditionalize symlink tests
libstdc++: testsuite: conditionalize another symlink test
In the recent patch that introduced NO_SYMLINKS, I missed one of the
testcases that created symlinks.
Regstrapped on x86_64-linux-gnu, also tested with a cross to
aarch64-rtems6. Ok to install?
for libstdc++-v3/ChangeLog
* testsuite/27_io/filesystem/iterators/recursive_directory_iterator.cc
(test06): Don't create symlinks when NO_SYMLINKS is defined.
---
.../iterators/recursive_directory_iterator.cc | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
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 e67e2cf38f754..e2f3613a3d07e 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
@@ -187,7 +187,7 @@ test05()
void
test06()
{
-#if !(defined __MINGW32__ || defined __MINGW64__)
+#ifndef NO_SYMLINKS
auto p = __gnu_test::nonexistent_path();
create_directories(p/"d1/d2");
create_directory_symlink("d1", p/"link");
On Mon, 27 Jun 2022 at 14:29, Alexandre Oliva <oliva@adacore.com> wrote: > > On Jun 23, 2022, Alexandre Oliva <oliva@adacore.com> wrote: > > > libstdc++: testsuite: conditionalize symlink tests > > > libstdc++: testsuite: conditionalize another symlink test > > In the recent patch that introduced NO_SYMLINKS, I missed one of the > testcases that created symlinks. > > Regstrapped on x86_64-linux-gnu, also tested with a cross to > aarch64-rtems6. Ok to install? OK. > > > > for libstdc++-v3/ChangeLog > > * testsuite/27_io/filesystem/iterators/recursive_directory_iterator.cc > (test06): Don't create symlinks when NO_SYMLINKS is defined. > --- > .../iterators/recursive_directory_iterator.cc | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > 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 e67e2cf38f754..e2f3613a3d07e 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 > @@ -187,7 +187,7 @@ test05() > void > test06() > { > -#if !(defined __MINGW32__ || defined __MINGW64__) > +#ifndef NO_SYMLINKS > auto p = __gnu_test::nonexistent_path(); > create_directories(p/"d1/d2"); > create_directory_symlink("d1", p/"link"); > > > -- > Alexandre Oliva, happy hacker https://FSFLA.org/blogs/lxo/ > Free Software Activist GNU Toolchain Engineer > Disinformation flourishes because many people care deeply about injustice > but very few check the facts. Ask me about <https://stallmansupport.org> >
diff --git a/libstdc++-v3/testsuite/27_io/filesystem/operations/canonical.cc b/libstdc++-v3/testsuite/27_io/filesystem/operations/canonical.cc index bc7ef0de2b716..1ae23dadac517 100644 --- a/libstdc++-v3/testsuite/27_io/filesystem/operations/canonical.cc +++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/canonical.cc @@ -114,6 +114,8 @@ test03() #if defined(__MINGW32__) || defined(__MINGW64__) // No symlink support const fs::path baz = dir/"foo\\\\..\\bar///"; +#elif !defined (_GLIBCXX_HAVE_SYMLINK) + const fs::path baz = dir/"foo//../bar///"; #else fs::create_symlink("../bar", foo/"baz"); const fs::path baz = dir/"foo//./baz///"; diff --git a/libstdc++-v3/testsuite/27_io/filesystem/operations/copy.cc b/libstdc++-v3/testsuite/27_io/filesystem/operations/copy.cc index f3081f4b64ebc..575d32d34fc3d 100644 --- a/libstdc++-v3/testsuite/27_io/filesystem/operations/copy.cc +++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/copy.cc @@ -66,7 +66,8 @@ test01() void test02() { -#if defined(__MINGW32__) || defined(__MINGW64__) +#if defined(__MINGW32__) || defined(__MINGW64__) \ + || !defined (_GLIBCXX_HAVE_SYMLINK) // No symlink support return; #endif 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 4a7ba1fcb4944..3b9b893ad8e2d 100644 --- a/libstdc++-v3/testsuite/27_io/filesystem/operations/create_directories.cc +++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/create_directories.cc @@ -148,7 +148,8 @@ test03() void test04() { -#if defined(__MINGW32__) || defined(__MINGW64__) +#if defined(__MINGW32__) || defined(__MINGW64__) \ + || !defined (_GLIBCXX_HAVE_SYMLINK) // no symlinks #else // PR libstdc++/101510 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 90f98302c00f8..e10a4c854f032 100644 --- a/libstdc++-v3/testsuite/27_io/filesystem/operations/create_directory.cc +++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/create_directory.cc @@ -70,7 +70,8 @@ test01() VERIFY( e.path1() == f ); } -#if defined(__MINGW32__) || defined(__MINGW64__) +#if defined(__MINGW32__) || defined(__MINGW64__) \ + || !defined (_GLIBCXX_HAVE_SYMLINK) // no symlinks #else // PR libstdc++/101510 create_directory on an existing symlink to a directory diff --git a/libstdc++-v3/testsuite/27_io/filesystem/operations/permissions.cc b/libstdc++-v3/testsuite/27_io/filesystem/operations/permissions.cc index deed759be80e9..9e7c5fc7e485c 100644 --- a/libstdc++-v3/testsuite/27_io/filesystem/operations/permissions.cc +++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/permissions.cc @@ -76,6 +76,7 @@ test02() void test03() { +#ifdef _GLIBCXX_HAVE_SYMLINK using std::filesystem::perms; using std::filesystem::perm_options; @@ -111,11 +112,13 @@ test03() VERIFY( !caught ); remove(p); +#endif } void test04() { +#ifdef _GLIBCXX_HAVE_SYMLINK using perms = std::filesystem::perms; auto p = __gnu_test::nonexistent_path(); @@ -137,6 +140,7 @@ test04() VERIFY( ec == ec2 ); remove(p); +#endif } void 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 68bbab33bc9e2..feb9e4f3fe0b6 100644 --- a/libstdc++-v3/testsuite/27_io/filesystem/operations/read_symlink.cc +++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/read_symlink.cc @@ -28,6 +28,7 @@ namespace fs = std::filesystem; void test01() { +#ifdef _GLIBCXX_HAVE_SYMLINK auto p = __gnu_test::nonexistent_path(); std::error_code ec; @@ -42,6 +43,7 @@ test01() VERIFY( result == tgt ); remove(p); +#endif } int diff --git a/libstdc++-v3/testsuite/27_io/filesystem/operations/remove.cc b/libstdc++-v3/testsuite/27_io/filesystem/operations/remove.cc index 26f2d548f82d5..2b094868e4c03 100644 --- a/libstdc++-v3/testsuite/27_io/filesystem/operations/remove.cc +++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/remove.cc @@ -41,7 +41,8 @@ test01() VERIFY( !ec ); VERIFY( !n ); -#if defined(__MINGW32__) || defined(__MINGW64__) +#if defined(__MINGW32__) || defined(__MINGW64__) \ + || !defined (_GLIBCXX_HAVE_SYMLINK) // No symlink support #else auto link = __gnu_test::nonexistent_path(); 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 943d85c0cc2e3..45b29d6bb7aa2 100644 --- a/libstdc++-v3/testsuite/27_io/filesystem/operations/remove_all.cc +++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/remove_all.cc @@ -41,7 +41,8 @@ test01() VERIFY( !ec ); VERIFY( n == 0 ); -#if defined(__MINGW32__) || defined(__MINGW64__) +#if defined(__MINGW32__) || defined(__MINGW64__) \ + || !defined (_GLIBCXX_HAVE_SYMLINK) // No symlink support #else auto link = __gnu_test::nonexistent_path(); diff --git a/libstdc++-v3/testsuite/27_io/filesystem/operations/rename.cc b/libstdc++-v3/testsuite/27_io/filesystem/operations/rename.cc index f23a2862a0b99..936e306041290 100644 --- a/libstdc++-v3/testsuite/27_io/filesystem/operations/rename.cc +++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/rename.cc @@ -75,7 +75,8 @@ test01() void test_symlinks() { -#if defined(__MINGW32__) || defined(__MINGW64__) +#if defined(__MINGW32__) || defined(__MINGW64__) \ + || !defined (_GLIBCXX_HAVE_SYMLINK) // No symlink support #else std::error_code ec; 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 ef973b7807b8a..7ed91fa986c11 100644 --- a/libstdc++-v3/testsuite/27_io/filesystem/operations/symlink_status.cc +++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/symlink_status.cc @@ -39,6 +39,7 @@ test01() fs::file_status st2 = fs::symlink_status(dot); VERIFY( st2.type() == fs::file_type::directory ); +#ifdef _GLIBCXX_HAVE_SYMLINK fs::path link = __gnu_test::nonexistent_path(); create_directory_symlink(dot, link); __gnu_test::scoped_file l(link, __gnu_test::scoped_file::adopt_file); @@ -49,6 +50,7 @@ test01() st2 = fs::symlink_status(link, ec); VERIFY( !ec ); VERIFY( st2.type() == fs::file_type::symlink ); +#endif } void @@ -68,6 +70,7 @@ test02() void test03() { +#ifdef _GLIBCXX_HAVE_SYMLINK if (!__gnu_test::permissions_are_testable()) return; @@ -111,6 +114,7 @@ test03() VERIFY( st2.type() == fs::file_type::symlink ); fs::permissions(dir, fs::perms::owner_all, ec); +#endif } void 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 244b753f84d1d..38c5e76497da0 100644 --- a/libstdc++-v3/testsuite/27_io/filesystem/operations/weakly_canonical.cc +++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/weakly_canonical.cc @@ -39,7 +39,8 @@ test01() fs::create_directory(bar/"baz"); fs::path p; -#if defined(__MINGW32__) || defined(__MINGW64__) +#if defined(__MINGW32__) || defined(__MINGW64__) \ + || !defined (_GLIBCXX_HAVE_SYMLINK) // No symlink support #else fs::create_symlink("../bar", foo/"bar"); diff --git a/libstdc++-v3/testsuite/experimental/filesystem/iterators/recursive_directory_iterator.cc b/libstdc++-v3/testsuite/experimental/filesystem/iterators/recursive_directory_iterator.cc index a201415921cfc..be27237b42c69 100644 --- a/libstdc++-v3/testsuite/experimental/filesystem/iterators/recursive_directory_iterator.cc +++ b/libstdc++-v3/testsuite/experimental/filesystem/iterators/recursive_directory_iterator.cc @@ -188,7 +188,8 @@ test05() void test06() { -#if !(defined __MINGW32__ || defined __MINGW64__) +#if !(defined __MINGW32__ || defined __MINGW64__) \ + && defined _GLIBCXX_HAVE_SYMLINK auto p = __gnu_test::nonexistent_path(); create_directories(p/"d1/d2"); create_directory_symlink("d1", p/"link"); diff --git a/libstdc++-v3/testsuite/experimental/filesystem/operations/copy.cc b/libstdc++-v3/testsuite/experimental/filesystem/operations/copy.cc index ca38328c5da15..6d95801e34f7c 100644 --- a/libstdc++-v3/testsuite/experimental/filesystem/operations/copy.cc +++ b/libstdc++-v3/testsuite/experimental/filesystem/operations/copy.cc @@ -67,7 +67,8 @@ test01() void test02() { -#if defined(__MINGW32__) || defined(__MINGW64__) +#if defined(__MINGW32__) || defined(__MINGW64__) \ + || !defined (_GLIBCXX_HAVE_SYMLINK) // No symlink support return; #endif diff --git a/libstdc++-v3/testsuite/experimental/filesystem/operations/create_directories.cc b/libstdc++-v3/testsuite/experimental/filesystem/operations/create_directories.cc index 03060c6cbb33e..9e29bd978fb6a 100644 --- a/libstdc++-v3/testsuite/experimental/filesystem/operations/create_directories.cc +++ b/libstdc++-v3/testsuite/experimental/filesystem/operations/create_directories.cc @@ -147,7 +147,8 @@ test03() void test04() { -#if defined(__MINGW32__) || defined(__MINGW64__) +#if defined(__MINGW32__) || defined(__MINGW64__) \ + || !defined (_GLIBCXX_HAVE_SYMLINK) // no symlinks #else // PR libstdc++/101510 diff --git a/libstdc++-v3/testsuite/experimental/filesystem/operations/create_directory.cc b/libstdc++-v3/testsuite/experimental/filesystem/operations/create_directory.cc index 67e5fddca0094..dc1e518fe08aa 100644 --- a/libstdc++-v3/testsuite/experimental/filesystem/operations/create_directory.cc +++ b/libstdc++-v3/testsuite/experimental/filesystem/operations/create_directory.cc @@ -69,7 +69,8 @@ test01() VERIFY( e.path1() == f ); } -#if defined(__MINGW32__) || defined(__MINGW64__) +#if defined(__MINGW32__) || defined(__MINGW64__) \ + || !defined (_GLIBCXX_HAVE_SYMLINK) // no symlinks #else // PR libstdc++/101510 create_directory on an existing symlink to a directory diff --git a/libstdc++-v3/testsuite/experimental/filesystem/operations/permissions.cc b/libstdc++-v3/testsuite/experimental/filesystem/operations/permissions.cc index 833aa13dd158b..1cb318a7c3730 100644 --- a/libstdc++-v3/testsuite/experimental/filesystem/operations/permissions.cc +++ b/libstdc++-v3/testsuite/experimental/filesystem/operations/permissions.cc @@ -72,6 +72,7 @@ test02() void test03() { +#ifdef _GLIBCXX_HAVE_SYMLINK using perms = std::experimental::filesystem::perms; __gnu_test::scoped_file f; @@ -95,11 +96,13 @@ test03() VERIFY( ec == ec2 ); remove(p); +#endif } void test04() { +#ifdef _GLIBCXX_HAVE_SYMLINK using perms = std::experimental::filesystem::perms; auto p = __gnu_test::nonexistent_path(); @@ -120,6 +123,7 @@ test04() VERIFY( ec == ec2 ); remove(p); +#endif } void diff --git a/libstdc++-v3/testsuite/experimental/filesystem/operations/read_symlink.cc b/libstdc++-v3/testsuite/experimental/filesystem/operations/read_symlink.cc index 75dae3eac5108..90e92f1201cdb 100644 --- a/libstdc++-v3/testsuite/experimental/filesystem/operations/read_symlink.cc +++ b/libstdc++-v3/testsuite/experimental/filesystem/operations/read_symlink.cc @@ -29,6 +29,7 @@ namespace fs = std::experimental::filesystem; void test01() { +#ifdef _GLIBCXX_HAVE_SYMLINK auto p = __gnu_test::nonexistent_path(); std::error_code ec; @@ -43,6 +44,7 @@ test01() VERIFY( result == tgt ); remove(p); +#endif } int diff --git a/libstdc++-v3/testsuite/experimental/filesystem/operations/remove.cc b/libstdc++-v3/testsuite/experimental/filesystem/operations/remove.cc index c01f140ee592a..29a24f1bd581e 100644 --- a/libstdc++-v3/testsuite/experimental/filesystem/operations/remove.cc +++ b/libstdc++-v3/testsuite/experimental/filesystem/operations/remove.cc @@ -42,7 +42,8 @@ test01() VERIFY( !ec ); VERIFY( !n ); -#if defined(__MINGW32__) || defined(__MINGW64__) +#if defined(__MINGW32__) || defined(__MINGW64__) \ + || !defined (_GLIBCXX_HAVE_SYMLINK) // No symlink support return; #else diff --git a/libstdc++-v3/testsuite/experimental/filesystem/operations/remove_all.cc b/libstdc++-v3/testsuite/experimental/filesystem/operations/remove_all.cc index 4b0ce85cf9754..7165ddfb85cce 100644 --- a/libstdc++-v3/testsuite/experimental/filesystem/operations/remove_all.cc +++ b/libstdc++-v3/testsuite/experimental/filesystem/operations/remove_all.cc @@ -42,7 +42,8 @@ test01() VERIFY( !ec ); VERIFY( n == 0 ); -#if defined(__MINGW32__) || defined(__MINGW64__) +#if defined(__MINGW32__) || defined(__MINGW64__) \ + || !defined (_GLIBCXX_HAVE_SYMLINK) // No symlink support #else auto link = __gnu_test::nonexistent_path(); diff --git a/libstdc++-v3/testsuite/experimental/filesystem/operations/rename.cc b/libstdc++-v3/testsuite/experimental/filesystem/operations/rename.cc index 46776e80994e2..520d48ef8d844 100644 --- a/libstdc++-v3/testsuite/experimental/filesystem/operations/rename.cc +++ b/libstdc++-v3/testsuite/experimental/filesystem/operations/rename.cc @@ -75,7 +75,8 @@ test01() void test_symlinks() { -#if defined(__MINGW32__) || defined(__MINGW64__) +#if defined(__MINGW32__) || defined(__MINGW64__) \ + || !defined (_GLIBCXX_HAVE_SYMLINK) // No symlink support #else std::error_code ec;