From: Jonathan Wakely Date: Sat, 30 Nov 2024 21:37:02 +0000 (+0000) Subject: libstdc++: Fix constraints on std::optional converting constructors [PR117889] X-Git-Tag: basepoints/gcc-16~3664 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=29bea6921d0e2e3dd20bc78926ef0e98b1b1e4ad;p=thirdparty%2Fgcc.git 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&)): Fix copy and paste error in constraints. (optional(optional&&)): Likewise. * testsuite/20_util/optional/assignment/117858.cc: Move to ... * testsuite/20_util/optional/cons/117858.cc: New test. --- 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 - requires (!is_same_v>) + requires (!is_same_v<_Tp, _Up>) && is_constructible_v<_Tp, const _Up&> && __construct_from_contained_value<_Up> constexpr explicit(!is_convertible_v) @@ -888,7 +888,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } template - requires (!is_same_v>) + 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 ctor(T) - -#include - -struct Focus -{ - template - Focus(T newValue) { } -}; - -void g(std::optional 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 ctor(T) +// PR 117889 Failure to build qtwebengine-6.8.1 + +#include + +struct Focus +{ + template Focus(T) { } +}; + +void test_pr117858(std::optional& f) +{ + f = f; + f = std::move(f); +} + +void test_pr117889(std::optional& f) +{ + std::optional f2 = f; + std::optional f3 = std::move(f); +}