Commit b752e2c9 by Jonathan Wakely Committed by Jonathan Wakely

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
parent efa9d8ee
2019-05-02 Jonathan Wakely <jwakely@redhat.com> 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.h: Improve docs.
* include/bits/shared_ptr_atomic.h: Likewise. * include/bits/shared_ptr_atomic.h: Likewise.
* include/bits/unique_ptr.h: Likewise. Adjust whitespace. * include/bits/unique_ptr.h: Likewise. Adjust whitespace.
......
...@@ -36,9 +36,8 @@ ...@@ -36,9 +36,8 @@
* Components defined by the _C++ Extensions for Library Fundamentals_ * Components defined by the _C++ Extensions for Library Fundamentals_
* Technical Specification, versions 1 and 2. * Technical Specification, versions 1 and 2.
* *
* ISO/IEC TS 19568:2015 C++ Extensions for Library Fundamentals * - 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:2017 C++ Extensions for Library Fundamentals, Version 2
*/ */
#if _GLIBCXX_INLINE_VERSION #if _GLIBCXX_INLINE_VERSION
......
...@@ -112,6 +112,8 @@ inline namespace fundamentals_v1 ...@@ -112,6 +112,8 @@ inline namespace fundamentals_v1
virtual ~bad_optional_access() noexcept = default; virtual ~bad_optional_access() noexcept = default;
}; };
/// @cond undocumented
void void
__throw_bad_optional_access(const char*) __throw_bad_optional_access(const char*)
__attribute__((__noreturn__)); __attribute__((__noreturn__));
...@@ -121,59 +123,6 @@ inline namespace fundamentals_v1 ...@@ -121,59 +123,6 @@ inline namespace fundamentals_v1
__throw_bad_optional_access(const char* __s) __throw_bad_optional_access(const char* __s)
{ _GLIBCXX_THROW_OR_ABORT(bad_optional_access(__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 * @brief Class template that holds the necessary state for @ref optional
* and that has the responsibility for construction and the special members. * and that has the responsibility for construction and the special members.
...@@ -452,9 +401,6 @@ inline namespace fundamentals_v1 ...@@ -452,9 +401,6 @@ inline namespace fundamentals_v1
bool _M_engaged = false; bool _M_engaged = false;
}; };
template<typename _Tp>
class optional;
template<typename _Tp, typename _Up> template<typename _Tp, typename _Up>
using __converts_from_optional = using __converts_from_optional =
__or_<is_constructible<_Tp, const optional<_Up>&>, __or_<is_constructible<_Tp, const optional<_Up>&>,
...@@ -473,6 +419,8 @@ inline namespace fundamentals_v1 ...@@ -473,6 +419,8 @@ inline namespace fundamentals_v1
is_assignable<_Tp&, const optional<_Up>&&>, is_assignable<_Tp&, const optional<_Up>&&>,
is_assignable<_Tp&, optional<_Up>&&>>; is_assignable<_Tp&, optional<_Up>&&>>;
/// @endcond
/** /**
* @brief Class template for optional values. * @brief Class template for optional values.
*/ */
...@@ -698,13 +646,7 @@ inline namespace fundamentals_v1 ...@@ -698,13 +646,7 @@ inline namespace fundamentals_v1
// [X.Y.4.5] Observers. // [X.Y.4.5] Observers.
constexpr const _Tp* constexpr const _Tp*
operator->() const operator->() const
{ { return std::__addressof(this->_M_get()); }
#ifndef __cpp_lib_addressof_constexpr
return __constexpr_addressof(this->_M_get());
#else
return std::__addressof(this->_M_get());
#endif
}
_Tp* _Tp*
operator->() operator->()
...@@ -796,6 +738,8 @@ inline namespace fundamentals_v1 ...@@ -796,6 +738,8 @@ inline namespace fundamentals_v1
} }
}; };
/// @relates experimental::optional @{
// [X.Y.8] Comparisons between optional values. // [X.Y.8] Comparisons between optional values.
template<typename _Tp> template<typename _Tp>
constexpr bool constexpr bool
...@@ -966,11 +910,14 @@ inline namespace fundamentals_v1 ...@@ -966,11 +910,14 @@ inline namespace fundamentals_v1
make_optional(_Tp&& __t) make_optional(_Tp&& __t)
{ return optional<decay_t<_Tp>> { std::forward<_Tp>(__t) }; } { return optional<decay_t<_Tp>> { std::forward<_Tp>(__t) }; }
// @} relates experimental::optional
// @} group optional // @} group optional
} // namespace fundamentals_v1 } // namespace fundamentals_v1
} // namespace experimental } // namespace experimental
// [X.Y.12] // [X.Y.12]
/// std::hash partial specialization for experimental::optional
/// @relates experimental::optional
template<typename _Tp> template<typename _Tp>
struct hash<experimental::optional<_Tp>> struct hash<experimental::optional<_Tp>>
{ {
......
...@@ -888,8 +888,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -888,8 +888,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
operator->() const operator->() const
{ return std::__addressof(this->_M_get()); } { return std::__addressof(this->_M_get()); }
constexpr constexpr _Tp*
_Tp*
operator->() operator->()
{ return std::__addressof(this->_M_get()); } { return std::__addressof(this->_M_get()); }
......
// { dg-do run { target c++14 } } // { dg-do compile { target c++14 } }
// Copyright (C) 2013-2019 Free Software Foundation, Inc. // Copyright (C) 2013-2019 Free Software Foundation, Inc.
// //
...@@ -23,7 +23,7 @@ struct value_type ...@@ -23,7 +23,7 @@ struct value_type
{ {
int i; int i;
void* operator&() { return nullptr; } // N.B. non-const void* operator&() const { return nullptr; }
}; };
int main() int main()
......
// { dg-do run { target c++14 } } // { dg-do compile { target c++14 } }
// Copyright (C) 2013-2019 Free Software Foundation, Inc. // Copyright (C) 2013-2019 Free Software Foundation, Inc.
// //
......
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