Remove redundant __constexpr_addressof function
The std::__addressof function is always constexpr, even in C++14, so we can just use that. * include/experimental/bits/lfts_config.h: Improve doc markup. * include/experimental/optional: Improve docs. (_Has_addressof_mem, _Has_addressof_free, _Has_addressof) (__constexpr_addressof): Remove. (optional::operator->()): Use std::__addressof(). * include/std/optional (optional::operator->()): Adjust whitespace. * testsuite/experimental/optional/constexpr/observers/2.cc: Check that operator-> is still constexpr with overloaded operator&. Change to compile-only test. * testsuite/experimental/optional/constexpr/observers/3.cc: Change to compile-only test. From-SVN: r270826
This commit is contained in:
parent
efa9d8eef0
commit
b752e2c926
6 changed files with 28 additions and 71 deletions
|
@ -1,5 +1,17 @@
|
|||
2019-05-02 Jonathan Wakely <jwakely@redhat.com>
|
||||
|
||||
* include/experimental/bits/lfts_config.h: Improve doc markup.
|
||||
* include/experimental/optional: Improve docs.
|
||||
(_Has_addressof_mem, _Has_addressof_free, _Has_addressof)
|
||||
(__constexpr_addressof): Remove.
|
||||
(optional::operator->()): Use std::__addressof().
|
||||
* include/std/optional (optional::operator->()): Adjust whitespace.
|
||||
* testsuite/experimental/optional/constexpr/observers/2.cc: Check
|
||||
that operator-> is still constexpr with overloaded operator&. Change
|
||||
to compile-only test.
|
||||
* testsuite/experimental/optional/constexpr/observers/3.cc: Change to
|
||||
compile-only test.
|
||||
|
||||
* include/bits/shared_ptr.h: Improve docs.
|
||||
* include/bits/shared_ptr_atomic.h: Likewise.
|
||||
* include/bits/unique_ptr.h: Likewise. Adjust whitespace.
|
||||
|
|
|
@ -36,9 +36,8 @@
|
|||
* Components defined by the _C++ Extensions for Library Fundamentals_
|
||||
* Technical Specification, versions 1 and 2.
|
||||
*
|
||||
* ISO/IEC TS 19568:2015 C++ Extensions for Library Fundamentals
|
||||
*
|
||||
* ISO/IEC TS 19568:2017 C++ Extensions for Library Fundamentals, Version 2
|
||||
* - ISO/IEC TS 19568:2015 C++ Extensions for Library Fundamentals
|
||||
* - ISO/IEC TS 19568:2017 C++ Extensions for Library Fundamentals, Version 2
|
||||
*/
|
||||
|
||||
#if _GLIBCXX_INLINE_VERSION
|
||||
|
|
|
@ -112,6 +112,8 @@ inline namespace fundamentals_v1
|
|||
virtual ~bad_optional_access() noexcept = default;
|
||||
};
|
||||
|
||||
/// @cond undocumented
|
||||
|
||||
void
|
||||
__throw_bad_optional_access(const char*)
|
||||
__attribute__((__noreturn__));
|
||||
|
@ -121,59 +123,6 @@ inline namespace fundamentals_v1
|
|||
__throw_bad_optional_access(const char* __s)
|
||||
{ _GLIBCXX_THROW_OR_ABORT(bad_optional_access(__s)); }
|
||||
|
||||
#ifndef __cpp_lib_addressof_constexpr
|
||||
template<typename _Tp, typename = void>
|
||||
struct _Has_addressof_mem : std::false_type { };
|
||||
|
||||
template<typename _Tp>
|
||||
struct _Has_addressof_mem<_Tp,
|
||||
__void_t<decltype( std::declval<const _Tp&>().operator&() )>
|
||||
>
|
||||
: std::true_type { };
|
||||
|
||||
template<typename _Tp, typename = void>
|
||||
struct _Has_addressof_free : std::false_type { };
|
||||
|
||||
template<typename _Tp>
|
||||
struct _Has_addressof_free<_Tp,
|
||||
__void_t<decltype( operator&(std::declval<const _Tp&>()) )>
|
||||
>
|
||||
: std::true_type { };
|
||||
|
||||
/**
|
||||
* @brief Trait that detects the presence of an overloaded unary operator&.
|
||||
*
|
||||
* Practically speaking this detects the presence of such an operator when
|
||||
* called on a const-qualified lvalue (e.g.
|
||||
* declval<const _Tp&>().operator&()).
|
||||
*/
|
||||
template<typename _Tp>
|
||||
struct _Has_addressof
|
||||
: std::__or_<_Has_addressof_mem<_Tp>, _Has_addressof_free<_Tp>>::type
|
||||
{ };
|
||||
|
||||
/**
|
||||
* @brief An overload that attempts to take the address of an lvalue as a
|
||||
* constant expression. Falls back to __addressof in the presence of an
|
||||
* overloaded addressof operator (unary operator&), in which case the call
|
||||
* will not be a constant expression.
|
||||
*/
|
||||
template<typename _Tp>
|
||||
constexpr
|
||||
enable_if_t<!_Has_addressof<_Tp>::value, _Tp*>
|
||||
__constexpr_addressof(_Tp& __t)
|
||||
{ return &__t; }
|
||||
|
||||
/**
|
||||
* @brief Fallback overload that defers to __addressof.
|
||||
*/
|
||||
template<typename _Tp>
|
||||
inline
|
||||
enable_if_t<_Has_addressof<_Tp>::value, _Tp*>
|
||||
__constexpr_addressof(_Tp& __t)
|
||||
{ return std::__addressof(__t); }
|
||||
#endif // __cpp_lib_addressof_constexpr
|
||||
|
||||
/**
|
||||
* @brief Class template that holds the necessary state for @ref optional
|
||||
* and that has the responsibility for construction and the special members.
|
||||
|
@ -452,9 +401,6 @@ inline namespace fundamentals_v1
|
|||
bool _M_engaged = false;
|
||||
};
|
||||
|
||||
template<typename _Tp>
|
||||
class optional;
|
||||
|
||||
template<typename _Tp, typename _Up>
|
||||
using __converts_from_optional =
|
||||
__or_<is_constructible<_Tp, const optional<_Up>&>,
|
||||
|
@ -473,6 +419,8 @@ inline namespace fundamentals_v1
|
|||
is_assignable<_Tp&, const optional<_Up>&&>,
|
||||
is_assignable<_Tp&, optional<_Up>&&>>;
|
||||
|
||||
/// @endcond
|
||||
|
||||
/**
|
||||
* @brief Class template for optional values.
|
||||
*/
|
||||
|
@ -698,13 +646,7 @@ inline namespace fundamentals_v1
|
|||
// [X.Y.4.5] Observers.
|
||||
constexpr const _Tp*
|
||||
operator->() const
|
||||
{
|
||||
#ifndef __cpp_lib_addressof_constexpr
|
||||
return __constexpr_addressof(this->_M_get());
|
||||
#else
|
||||
return std::__addressof(this->_M_get());
|
||||
#endif
|
||||
}
|
||||
{ return std::__addressof(this->_M_get()); }
|
||||
|
||||
_Tp*
|
||||
operator->()
|
||||
|
@ -796,6 +738,8 @@ inline namespace fundamentals_v1
|
|||
}
|
||||
};
|
||||
|
||||
/// @relates experimental::optional @{
|
||||
|
||||
// [X.Y.8] Comparisons between optional values.
|
||||
template<typename _Tp>
|
||||
constexpr bool
|
||||
|
@ -966,11 +910,14 @@ inline namespace fundamentals_v1
|
|||
make_optional(_Tp&& __t)
|
||||
{ return optional<decay_t<_Tp>> { std::forward<_Tp>(__t) }; }
|
||||
|
||||
// @} relates experimental::optional
|
||||
// @} group optional
|
||||
} // namespace fundamentals_v1
|
||||
} // namespace experimental
|
||||
|
||||
// [X.Y.12]
|
||||
/// std::hash partial specialization for experimental::optional
|
||||
/// @relates experimental::optional
|
||||
template<typename _Tp>
|
||||
struct hash<experimental::optional<_Tp>>
|
||||
{
|
||||
|
|
|
@ -888,8 +888,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
|||
operator->() const
|
||||
{ return std::__addressof(this->_M_get()); }
|
||||
|
||||
constexpr
|
||||
_Tp*
|
||||
constexpr _Tp*
|
||||
operator->()
|
||||
{ return std::__addressof(this->_M_get()); }
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
// { dg-do run { target c++14 } }
|
||||
// { dg-do compile { target c++14 } }
|
||||
|
||||
// Copyright (C) 2013-2019 Free Software Foundation, Inc.
|
||||
//
|
||||
|
@ -23,7 +23,7 @@ struct value_type
|
|||
{
|
||||
int i;
|
||||
|
||||
void* operator&() { return nullptr; } // N.B. non-const
|
||||
void* operator&() const { return nullptr; }
|
||||
};
|
||||
|
||||
int main()
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
// { dg-do run { target c++14 } }
|
||||
// { dg-do compile { target c++14 } }
|
||||
|
||||
// Copyright (C) 2013-2019 Free Software Foundation, Inc.
|
||||
//
|
||||
|
|
Loading…
Add table
Reference in a new issue