mirror of git://gcc.gnu.org/git/gcc.git
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>
|
2016-09-26 François Dumont <fdumont@gcc.gnu.org>
|
||||||
|
|
||||||
* include/debug/safe_base.h
|
* include/debug/safe_base.h
|
||||||
|
|
|
||||||
|
|
@ -502,7 +502,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||||
__not_<__converts_from_optional<_Tp, _Up>>
|
__not_<__converts_from_optional<_Tp, _Up>>
|
||||||
>::value, bool> = true>
|
>::value, bool> = true>
|
||||||
constexpr optional(const optional<_Up>& __t)
|
constexpr optional(const optional<_Up>& __t)
|
||||||
: _Base(__t ? _Base(std::in_place, *__t) : _Base()) { }
|
{
|
||||||
|
if (__t)
|
||||||
|
emplace(*__t);
|
||||||
|
}
|
||||||
|
|
||||||
template <typename _Up,
|
template <typename _Up,
|
||||||
enable_if_t<__and_<
|
enable_if_t<__and_<
|
||||||
|
|
@ -512,7 +515,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||||
__not_<__converts_from_optional<_Tp, _Up>>
|
__not_<__converts_from_optional<_Tp, _Up>>
|
||||||
>::value, bool> = false>
|
>::value, bool> = false>
|
||||||
explicit constexpr optional(const optional<_Up>& __t)
|
explicit constexpr optional(const optional<_Up>& __t)
|
||||||
: _Base(__t ? _Base(std::in_place, *__t) : _Base()) { }
|
{
|
||||||
|
if (__t)
|
||||||
|
emplace(*__t);
|
||||||
|
}
|
||||||
|
|
||||||
template <typename _Up,
|
template <typename _Up,
|
||||||
enable_if_t<__and_<
|
enable_if_t<__and_<
|
||||||
|
|
@ -522,7 +528,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||||
__not_<__converts_from_optional<_Tp, _Up>>
|
__not_<__converts_from_optional<_Tp, _Up>>
|
||||||
>::value, bool> = true>
|
>::value, bool> = true>
|
||||||
constexpr optional(optional<_Up>&& __t)
|
constexpr optional(optional<_Up>&& __t)
|
||||||
: _Base(__t ? _Base(std::in_place, std::move(*__t)) : _Base()) { }
|
{
|
||||||
|
if (__t)
|
||||||
|
emplace(std::move(*__t));
|
||||||
|
}
|
||||||
|
|
||||||
template <typename _Up,
|
template <typename _Up,
|
||||||
enable_if_t<__and_<
|
enable_if_t<__and_<
|
||||||
|
|
@ -532,7 +541,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||||
__not_<__converts_from_optional<_Tp, _Up>>
|
__not_<__converts_from_optional<_Tp, _Up>>
|
||||||
>::value, bool> = false>
|
>::value, bool> = false>
|
||||||
explicit constexpr optional(optional<_Up>&& __t)
|
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>
|
template<typename... _Args>
|
||||||
explicit constexpr optional(in_place_t, _Args&&... __args)
|
explicit constexpr optional(in_place_t, _Args&&... __args)
|
||||||
|
|
|
||||||
|
|
@ -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…
Reference in New Issue