[gcc r17-2081] libstdc++: Refactor preprocessor condition for Windows symlinks
Jonathan Wakely
redi@gcc.gnu.org
Thu Jul 2 08:40:29 GMT 2026
https://gcc.gnu.org/g:da91ebd29020534a6e2504a78981464eb0d63204
commit r17-2081-gda91ebd29020534a6e2504a78981464eb0d63204
Author: Jonathan Wakely <jwakely@redhat.com>
Date: Wed Jul 1 19:46:42 2026 +0100
libstdc++: Refactor preprocessor condition for Windows symlinks
Only define windows_create_symlink when it will actually be functional,
and adjust its callers to not use it unless it's defined. This matches
the form of windows_read_symlink_handle and its caller.
libstdc++-v3/ChangeLog:
* src/c++17/fs_ops.cc (windows_create_symlink): Adjust
preprocessor conditions to not define this at all unless
SYMBOLIC_LINK_FLAG_DIRECTORY is defined.
(fs::create_directory_symlink): Adjust preprocessor conditions
accordingly.
(fs::create_symlink): Likewise.
Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com>
Diff:
---
libstdc++-v3/src/c++17/fs_ops.cc | 17 +++++++++--------
1 file changed, 9 insertions(+), 8 deletions(-)
diff --git a/libstdc++-v3/src/c++17/fs_ops.cc b/libstdc++-v3/src/c++17/fs_ops.cc
index 387869751c58..81bffc7b1513 100644
--- a/libstdc++-v3/src/c++17/fs_ops.cc
+++ b/libstdc++-v3/src/c++17/fs_ops.cc
@@ -646,7 +646,8 @@ fs::create_directory(const path& p, const path& attributes,
#endif
}
-#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS
+#if defined(_GLIBCXX_FILESYSTEM_IS_WINDOWS) \
+ && defined(SYMBOLIC_LINK_FLAG_DIRECTORY)
namespace
{
void
@@ -654,7 +655,6 @@ namespace
const fs::file_type target_type,
std::error_code& ec) noexcept
{
-#ifdef SYMBOLIC_LINK_FLAG_DIRECTORY // Implies CreateSymbolicLinkW support.
DWORD symlink_type = target_type == fs::file_type::directory
? SYMBOLIC_LINK_FLAG_DIRECTORY : 0;
// Windows can't handle relative symlinks with non-preferred slashes.
@@ -686,9 +686,6 @@ namespace
ec.clear();
else
ec = std::__last_system_error();
-#else
- ec = std::make_error_code(std::errc::function_not_supported);
-#endif
}
}
#endif
@@ -707,10 +704,13 @@ void
fs::create_directory_symlink(const path& to, const path& new_symlink,
error_code& ec) noexcept
{
-#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS
+#ifdef _GLIBCXX_HAVE_SYMLINK
+ create_symlink(to, new_symlink, ec);
+#elif defined(_GLIBCXX_FILESYSTEM_IS_WINDOWS) \
+ && defined(SYMBOLIC_LINK_FLAG_DIRECTORY)
windows_create_symlink(to, new_symlink, file_type::directory, ec);
#else
- create_symlink(to, new_symlink, ec);
+ ec = std::make_error_code(std::errc::function_not_supported);
#endif
}
@@ -763,7 +763,8 @@ fs::create_symlink(const path& to, const path& new_symlink,
ec.assign(errno, std::generic_category());
else
ec.clear();
-#elif _GLIBCXX_FILESYSTEM_IS_WINDOWS
+#elif defined(_GLIBCXX_FILESYSTEM_IS_WINDOWS) \
+ && defined(SYMBOLIC_LINK_FLAG_DIRECTORY)
windows_create_symlink(to, new_symlink, file_type::regular, ec);
#else
ec = std::make_error_code(std::errc::function_not_supported);
More information about the Libstdc++-cvs
mailing list