Commit a181f672 by Ville Voutilainen Committed by Ville Voutilainen

Make optional::reset noexcept, make optional::value work in constant expressions.

    Make optional::reset noexcept, make optional::value
    work in constant expressions.
    * include/std/optional (_M_get): Make constexpr.
    (reset): Make noexcept.
    * testsuite/20_util/optional/assignment/7.cc: New.
    * testsuite/20_util/optional/observers/6.cc: New.

From-SVN: r240623
parent 69ba69c9
2016-09-29 Ville Voutilainen <ville.voutilainen@gmail.com>
Make optional::reset noexcept, make optional::value
work in constant expressions.
* include/std/optional (_M_get): Make constexpr.
(reset): Make noexcept.
* testsuite/20_util/optional/assignment/7.cc: New.
* testsuite/20_util/optional/observers/6.cc: New.
2016-09-29 Jonathan Wakely <jwakely@redhat.com>
* include/c_global/cmath (hypot, __hypot3): Move C++17 overloads
......
......@@ -378,7 +378,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
constexpr bool _M_is_engaged() const noexcept
{ return this->_M_engaged; }
_Tp&
constexpr _Tp&
_M_get() noexcept
{ return _M_payload; }
......@@ -777,7 +777,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
? std::move(this->_M_get())
: static_cast<_Tp>(std::forward<_Up>(__u));
}
void reset() { this->_M_reset(); }
void reset() noexcept { this->_M_reset(); }
};
template<typename _Tp>
......
// { 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>
int main()
{
std::optional<int> o{666};
VERIFY(o && *o == 666);
o.reset();
VERIFY(!o);
static_assert(noexcept(std::declval<std::optional<int>>().reset()));
}
// { dg-options "-std=gnu++17" }
// { dg-do compile }
// 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 Y
{
constexpr int test() & {return 7;}
};
constexpr int
test()
{
std::optional<Y> opt{Y{}};
return opt.value().test();
}
int main()
{
static_assert(test());
}
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