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);
+}

Reply via email to