aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2019-05-02 22:23:35 +0100
committerJonathan Wakely <redi@gcc.gnu.org>2019-05-02 22:23:35 +0100
commitb752e2c926065820a0086c7a482edf199d79dfc2 (patch)
tree5c0d92802499dae6a89fc290cda5a62dca14b241
parentefa9d8eef07e0abc9d073e004c95d2812d35f88a (diff)
downloadgcc-b752e2c926065820a0086c7a482edf199d79dfc2.zip
gcc-b752e2c926065820a0086c7a482edf199d79dfc2.tar.gz
gcc-b752e2c926065820a0086c7a482edf199d79dfc2.tar.bz2
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
-rw-r--r--libstdc++-v3/ChangeLog12
-rw-r--r--libstdc++-v3/include/experimental/bits/lfts_config.h5
-rw-r--r--libstdc++-v3/include/experimental/optional73
-rw-r--r--libstdc++-v3/include/std/optional3
-rw-r--r--libstdc++-v3/testsuite/experimental/optional/constexpr/observers/2.cc4
-rw-r--r--libstdc++-v3/testsuite/experimental/optional/constexpr/observers/3.cc2
6 files changed, 28 insertions, 71 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 3fe6114..cd1508e 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -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.
diff --git a/libstdc++-v3/include/experimental/bits/lfts_config.h b/libstdc++-v3/include/experimental/bits/lfts_config.h
index 8fc6705..851b8b4 100644
--- a/libstdc++-v3/include/experimental/bits/lfts_config.h
+++ b/libstdc++-v3/include/experimental/bits/lfts_config.h
@@ -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
diff --git a/libstdc++-v3/include/experimental/optional b/libstdc++-v3/include/experimental/optional
index 9a0112d..ee06b63 100644
--- a/libstdc++-v3/include/experimental/optional
+++ b/libstdc++-v3/include/experimental/optional
@@ -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>>
{
diff --git a/libstdc++-v3/include/std/optional b/libstdc++-v3/include/std/optional
index 503d859..ae825d3 100644
--- a/libstdc++-v3/include/std/optional
+++ b/libstdc++-v3/include/std/optional
@@ -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()); }
diff --git a/libstdc++-v3/testsuite/experimental/optional/constexpr/observers/2.cc b/libstdc++-v3/testsuite/experimental/optional/constexpr/observers/2.cc
index 5653df6..01fa9e8 100644
--- a/libstdc++-v3/testsuite/experimental/optional/constexpr/observers/2.cc
+++ b/libstdc++-v3/testsuite/experimental/optional/constexpr/observers/2.cc
@@ -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()
diff --git a/libstdc++-v3/testsuite/experimental/optional/constexpr/observers/3.cc b/libstdc++-v3/testsuite/experimental/optional/constexpr/observers/3.cc
index 7cdbf7a..242eb8c 100644
--- a/libstdc++-v3/testsuite/experimental/optional/constexpr/observers/3.cc
+++ b/libstdc++-v3/testsuite/experimental/optional/constexpr/observers/3.cc
@@ -1,4 +1,4 @@
-// { dg-do run { target c++14 } }
+// { dg-do compile { target c++14 } }
// Copyright (C) 2013-2019 Free Software Foundation, Inc.
//