From 954014a0fac4feb14e77eaa0b95d96f8095383b2 Mon Sep 17 00:00:00 2001 From: Marshall Clow Date: Thu, 27 Jun 2019 18:40:55 +0000 Subject: [PATCH] Add a missing '__uncvref_t' to the SFINAE constraints for optional's assignment operator. Fixes PR38638. Thanks to Jonathan Wakely for the report llvm-svn: 364574 --- libcxx/include/optional | 2 +- .../optional.object.assign/assign_value.pass.cpp | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/libcxx/include/optional b/libcxx/include/optional index 2fad11c..a147d69 100644 --- a/libcxx/include/optional +++ b/libcxx/include/optional @@ -773,7 +773,7 @@ public: _And< _IsNotSame<__uncvref_t<_Up>, optional>, _Or< - _IsNotSame<_Up, value_type>, + _IsNotSame<__uncvref_t<_Up>, value_type>, _Not> >, is_constructible, diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/assign_value.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/assign_value.pass.cpp index 8d2a8a0..3dd28ac 100644 --- a/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/assign_value.pass.cpp +++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/assign_value.pass.cpp @@ -241,6 +241,16 @@ enum MyEnum { Zero, One, Two, Three, FortyTwo = 42 }; using Fn = void(*)(); +// https://bugs.llvm.org/show_bug.cgi?id=38638 +template +constexpr T pr38638(T v) +{ + std::optional o; + o = v; + return *o + 2; +} + + int main(int, char**) { test_sfinae(); @@ -269,5 +279,7 @@ int main(int, char**) } test_throws(); + static_assert(pr38638(3) == 5, ""); + return 0; } -- 2.7.4