Commit 71ade764 by Ville Voutilainen Committed by Ville Voutilainen

re PR libstdc++/77727 (Unwrapping std::optional constructor is not working for…

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
parent f2fe9e0a
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)
......
// { 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);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment