From 45aa7a447652e8541cc381d7ab128544f81ed857 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Mon, 17 May 2021 11:54:06 +0100 Subject: [PATCH] libstdc++: Fix filesystem::path constraints for volatile [PR 100630] The constraint check for filesystem::path construction uses decltype(__is_path_src(declval())) which mean it considers conversion from an rvalue. When Source is a volatile-qualified type it cannot use is_path_src(const Unknown&) because a const lvalue reference can only bind to a non-volatile rvalue. Since the relevant path members all have a const Source& parameter, the constraint should be defined in terms of declval(), not declval(). This avoids the problem of volatile-qualified rvalues, because we no longer use an rvalue at all. libstdc++-v3/ChangeLog: PR libstdc++/100630 * include/experimental/bits/fs_path.h (__is_constructible_from): Test construction from a const lvalue, not an rvalue. * testsuite/27_io/filesystem/path/construct/100630.cc: New test. * testsuite/experimental/filesystem/path/construct/100630.cc: New test. --- libstdc++-v3/include/experimental/bits/fs_path.h | 2 +- .../testsuite/27_io/filesystem/path/construct/100630.cc | 14 ++++++++++++++ .../experimental/filesystem/path/construct/100630.cc | 14 ++++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 libstdc++-v3/testsuite/27_io/filesystem/path/construct/100630.cc create mode 100644 libstdc++-v3/testsuite/experimental/filesystem/path/construct/100630.cc diff --git a/libstdc++-v3/include/experimental/bits/fs_path.h b/libstdc++-v3/include/experimental/bits/fs_path.h index 2df2bba..1ecf2f3 100644 --- a/libstdc++-v3/include/experimental/bits/fs_path.h +++ b/libstdc++-v3/include/experimental/bits/fs_path.h @@ -124,7 +124,7 @@ namespace __detail template struct __constructible_from<_Source, void> - : decltype(__is_path_src(std::declval<_Source>(), 0)) + : decltype(__is_path_src(std::declval(), 0)) { }; template + +void f(bool) { } +void f(const std::filesystem::path&) { } + +void +test_100630() +{ + volatile bool b = true; + f(b); +} diff --git a/libstdc++-v3/testsuite/experimental/filesystem/path/construct/100630.cc b/libstdc++-v3/testsuite/experimental/filesystem/path/construct/100630.cc new file mode 100644 index 0000000..b2428ff --- /dev/null +++ b/libstdc++-v3/testsuite/experimental/filesystem/path/construct/100630.cc @@ -0,0 +1,14 @@ +// { dg-do compile { target c++11 } } +// { dg-require-filesystem-ts "" } + +#include + +void f(bool) { } +void f(const std::experimental::filesystem::path&) { } + +void +test_100630() +{ + volatile bool b = true; + f(b); +} -- 2.7.4