mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-11 03:50:27 +08:00
re PR libstdc++/77727 (Unwrapping std::optional constructor is not working for non-transferable object)
PR libstdc++/77727 * include/std/optional (optional(const optional<_Up>&)): Default-initialize the base and use emplace. (optional(optional<_Up>&&)): Likewise. * testsuite/20_util/optional/cons/77727.cc: New. From-SVN: r240511
This commit is contained in:
parent
f2fe9e0a69
commit
71ade764ad
@ -1,3 +1,11 @@
|
||||
2016-09-26 Ville Voutilainen <ville.voutilainen@gmail.com>
|
||||
|
||||
PR libstdc++/77727
|
||||
* include/std/optional (optional(const optional<_Up>&)):
|
||||
Default-initialize the base and use emplace.
|
||||
(optional(optional<_Up>&&)): Likewise.
|
||||
* testsuite/20_util/optional/cons/77727.cc: New.
|
||||
|
||||
2016-09-26 François Dumont <fdumont@gcc.gnu.org>
|
||||
|
||||
* include/debug/safe_base.h
|
||||
|
@ -502,7 +502,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
__not_<__converts_from_optional<_Tp, _Up>>
|
||||
>::value, bool> = true>
|
||||
constexpr optional(const optional<_Up>& __t)
|
||||
: _Base(__t ? _Base(std::in_place, *__t) : _Base()) { }
|
||||
{
|
||||
if (__t)
|
||||
emplace(*__t);
|
||||
}
|
||||
|
||||
template <typename _Up,
|
||||
enable_if_t<__and_<
|
||||
@ -512,7 +515,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
__not_<__converts_from_optional<_Tp, _Up>>
|
||||
>::value, bool> = false>
|
||||
explicit constexpr optional(const optional<_Up>& __t)
|
||||
: _Base(__t ? _Base(std::in_place, *__t) : _Base()) { }
|
||||
{
|
||||
if (__t)
|
||||
emplace(*__t);
|
||||
}
|
||||
|
||||
template <typename _Up,
|
||||
enable_if_t<__and_<
|
||||
@ -522,7 +528,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
__not_<__converts_from_optional<_Tp, _Up>>
|
||||
>::value, bool> = true>
|
||||
constexpr optional(optional<_Up>&& __t)
|
||||
: _Base(__t ? _Base(std::in_place, std::move(*__t)) : _Base()) { }
|
||||
{
|
||||
if (__t)
|
||||
emplace(std::move(*__t));
|
||||
}
|
||||
|
||||
template <typename _Up,
|
||||
enable_if_t<__and_<
|
||||
@ -532,7 +541,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
__not_<__converts_from_optional<_Tp, _Up>>
|
||||
>::value, bool> = false>
|
||||
explicit constexpr optional(optional<_Up>&& __t)
|
||||
: _Base(__t ? _Base(std::in_place, std::move(*__t)) : _Base()) { }
|
||||
{
|
||||
if (__t)
|
||||
emplace(std::move(*__t));
|
||||
}
|
||||
|
||||
template<typename... _Args>
|
||||
explicit constexpr optional(in_place_t, _Args&&... __args)
|
||||
|
51
libstdc++-v3/testsuite/20_util/optional/cons/77727.cc
Normal file
51
libstdc++-v3/testsuite/20_util/optional/cons/77727.cc
Normal file
@ -0,0 +1,51 @@
|
||||
// { dg-options "-std=gnu++17" }
|
||||
// { dg-do run }
|
||||
|
||||
// Copyright (C) 2016 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 3, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a moved_to of the GNU General Public License along
|
||||
// with this library; see the file COPYING3. If not see
|
||||
// <http://www.gnu.org/licenses/>.
|
||||
|
||||
#include <optional>
|
||||
#include <testsuite_hooks.h>
|
||||
|
||||
|
||||
struct NonTransferable
|
||||
{
|
||||
int x;
|
||||
NonTransferable(int x) : x(x) {}
|
||||
NonTransferable(NonTransferable&&) = delete;
|
||||
NonTransferable& operator=(NonTransferable&&) = delete;
|
||||
operator int() {return x;}
|
||||
};
|
||||
|
||||
int main()
|
||||
{
|
||||
std::optional<int> oi;
|
||||
std::optional<NonTransferable> ot(std::move(oi));
|
||||
VERIFY(!ot);
|
||||
|
||||
std::optional<int> oi2;
|
||||
std::optional<NonTransferable> ot2(oi2);
|
||||
VERIFY(!ot);
|
||||
|
||||
std::optional<int> oi3{42};
|
||||
std::optional<NonTransferable> ot3(std::move(oi3));
|
||||
VERIFY(ot3 && *ot3 == 42);
|
||||
|
||||
std::optional<int> oi4{666};
|
||||
std::optional<NonTransferable> ot4(oi4);
|
||||
VERIFY(ot4 && *ot4 == 666);
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user