https://gcc.gnu.org/g:29bea6921d0e2e3dd20bc78926ef0e98b1b1e4ad
commit r15-5889-g29bea6921d0e2e3dd20bc78926ef0e98b1b1e4ad Author: Jonathan Wakely <jwak...@redhat.com> Date: Sat Nov 30 21:37:02 2024 +0000 libstdc++: Fix constraints on std::optional converting constructors [PR117889] The converting constructors had the same bug as the converting assignments, so need the same fix as r15-5833-gc2c7d71eeeab7c. libstdc++-v3/ChangeLog: PR libstdc++/117889 PR libstdc++/117858 * include/std/optional (optional(const optional<U>&)): Fix copy and paste error in constraints. (optional(optional<U>&&)): Likewise. * testsuite/20_util/optional/assignment/117858.cc: Move to ... * testsuite/20_util/optional/cons/117858.cc: New test. Diff: --- libstdc++-v3/include/std/optional | 4 ++-- .../20_util/optional/assignment/117858.cc | 17 ---------------- .../testsuite/20_util/optional/cons/117858.cc | 23 ++++++++++++++++++++++ 3 files changed, 25 insertions(+), 19 deletions(-) diff --git a/libstdc++-v3/include/std/optional b/libstdc++-v3/include/std/optional index 55e56cfb9ed1..617e4418ad7e 100644 --- a/libstdc++-v3/include/std/optional +++ b/libstdc++-v3/include/std/optional @@ -876,7 +876,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION : _Base(std::in_place, std::forward<_Up>(__t)) { } template<typename _Up> - requires (!is_same_v<optional, remove_cvref_t<_Up>>) + requires (!is_same_v<_Tp, _Up>) && is_constructible_v<_Tp, const _Up&> && __construct_from_contained_value<_Up> constexpr explicit(!is_convertible_v<const _Up&, _Tp>) @@ -888,7 +888,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } template<typename _Up> - requires (!is_same_v<optional, remove_cvref_t<_Up>>) + requires (!is_same_v<_Tp, _Up>) && is_constructible_v<_Tp, _Up> && __construct_from_contained_value<_Up> constexpr explicit(!is_convertible_v<_Up, _Tp>) diff --git a/libstdc++-v3/testsuite/20_util/optional/assignment/117858.cc b/libstdc++-v3/testsuite/20_util/optional/assignment/117858.cc deleted file mode 100644 index e7045b37dd9c..000000000000 --- a/libstdc++-v3/testsuite/20_util/optional/assignment/117858.cc +++ /dev/null @@ -1,17 +0,0 @@ -// { dg-do compile { target c++17 } } - -// PR 117858 std::optional with a constructor template<typename T> ctor(T) - -#include <optional> - -struct Focus -{ - template<class T> - Focus(T newValue) { } -}; - -void g(std::optional<Focus> f) -{ - f = f; - f = std::move(f); -} diff --git a/libstdc++-v3/testsuite/20_util/optional/cons/117858.cc b/libstdc++-v3/testsuite/20_util/optional/cons/117858.cc new file mode 100644 index 000000000000..adb1bc7791cd --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/optional/cons/117858.cc @@ -0,0 +1,23 @@ +// { dg-do compile { target c++17 } } + +// PR 117858 std::optional with a constructor template<typename T> ctor(T) +// PR 117889 Failure to build qtwebengine-6.8.1 + +#include <optional> + +struct Focus +{ + template<class T> Focus(T) { } +}; + +void test_pr117858(std::optional<Focus>& f) +{ + f = f; + f = std::move(f); +} + +void test_pr117889(std::optional<Focus>& f) +{ + std::optional<Focus> f2 = f; + std::optional<Focus> f3 = std::move(f); +}