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
This commit is contained in:
Ville Voutilainen 2016-09-29 18:20:28 +03:00 committed by Ville Voutilainen
parent 69ba69c9ec
commit a181f67231
4 changed files with 81 additions and 2 deletions

View File

@ -1,3 +1,12 @@
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

View File

@ -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>

View File

@ -0,0 +1,31 @@
// { 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()));
}

View File

@ -0,0 +1,39 @@
// { 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());
}