From c2c7d71eeeab7c6e2a8124b53d6eae6c59781e79 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Sat, 30 Nov 2024 21:37:02 +0000 Subject: [PATCH] libstdc++: Fix constraints on std::optional converting assignments [PR117858] It looks like I copied these constraints from operator=(U&&) and didn't correct them to account for the parameter being optional not U. libstdc++-v3/ChangeLog: PR libstdc++/117858 * include/std/optional (operator=(const optional&)): Fix copy and paste error in constraints. (operator=(optional&&)): Likewise. * testsuite/20_util/optional/assignment/117858.cc: New test. --- libstdc++-v3/include/std/optional | 4 ++-- .../20_util/optional/assignment/117858.cc | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 libstdc++-v3/testsuite/20_util/optional/assignment/117858.cc diff --git a/libstdc++-v3/include/std/optional b/libstdc++-v3/include/std/optional index b8eedeec781..55e56cfb9ed 100644 --- a/libstdc++-v3/include/std/optional +++ b/libstdc++-v3/include/std/optional @@ -1043,7 +1043,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template #ifdef _GLIBCXX_USE_CONSTRAINTS_FOR_OPTIONAL - requires (!is_same_v>) + requires (!is_same_v<_Tp, _Up>) && is_constructible_v<_Tp, const _Up&> && is_assignable_v<_Tp&, const _Up&> && (!__converts_from_optional<_Tp, _Up>::value) @@ -1077,7 +1077,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template #ifdef _GLIBCXX_USE_CONSTRAINTS_FOR_OPTIONAL - requires (!is_same_v>) + requires (!is_same_v<_Tp, _Up>) && is_constructible_v<_Tp, _Up> && is_assignable_v<_Tp&, _Up> && (!__converts_from_optional<_Tp, _Up>::value) diff --git a/libstdc++-v3/testsuite/20_util/optional/assignment/117858.cc b/libstdc++-v3/testsuite/20_util/optional/assignment/117858.cc new file mode 100644 index 00000000000..9443e160484 --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/optional/assignment/117858.cc @@ -0,0 +1,16 @@ +// { dg-do compile { target c++17 } } + +// PR 117858 std::optional with a constructor template ctor(T) + +#include + +struct Focus +{ + template + Focus(T newValue) { } +}; + +void g(std::optional f) +{ + f = f; +}