diff --git a/include/tuple b/include/tuple index 683c9dd5..a485d7d1 100644 --- a/include/tuple +++ b/include/tuple @@ -227,7 +227,7 @@ class __tuple_leaf __tuple_leaf& operator=(const __tuple_leaf&); public: - _LIBCPP_INLINE_VISIBILITY __tuple_leaf() : value() + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR __tuple_leaf() : value() {static_assert(!is_reference<_Hp>::value, "Attempted to default construct a reference element in a tuple");} @@ -347,7 +347,7 @@ class __tuple_leaf<_Ip, _Hp, true> __tuple_leaf& operator=(const __tuple_leaf&); public: - _LIBCPP_INLINE_VISIBILITY __tuple_leaf() {} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR __tuple_leaf() {} template _LIBCPP_INLINE_VISIBILITY @@ -436,6 +436,9 @@ template struct __tuple_impl<__tuple_indices<_Indx...>, _Tp...> : public __tuple_leaf<_Indx, _Tp>... { + _LIBCPP_INLINE_VISIBILITY + _LIBCPP_CONSTEXPR __tuple_impl() {} + template _LIBCPP_INLINE_VISIBILITY @@ -531,6 +534,9 @@ class _LIBCPP_VISIBLE tuple typename tuple_element<_Jp, tuple<_Up...> >::type&& get(tuple<_Up...>&&) _NOEXCEPT; public: + _LIBCPP_INLINE_VISIBILITY + _LIBCPP_CONSTEXPR tuple() {} + _LIBCPP_INLINE_VISIBILITY explicit tuple(const _Tp& ... __t) : base_(typename __make_tuple_indices::type(), @@ -687,7 +693,7 @@ class _LIBCPP_VISIBLE tuple<> { public: _LIBCPP_INLINE_VISIBILITY - tuple() {} + _LIBCPP_CONSTEXPR tuple() {} template _LIBCPP_INLINE_VISIBILITY tuple(allocator_arg_t, const _Alloc&) {} diff --git a/test/utilities/tuple/tuple.tuple/tuple.cnstr/default.pass.cpp b/test/utilities/tuple/tuple.tuple/tuple.cnstr/default.pass.cpp index eb902ac6..84ecd8d2 100644 --- a/test/utilities/tuple/tuple.tuple/tuple.cnstr/default.pass.cpp +++ b/test/utilities/tuple/tuple.tuple/tuple.cnstr/default.pass.cpp @@ -46,4 +46,18 @@ int main() assert(std::get<2>(t) == ""); assert(std::get<3>(t) == DefaultOnly()); } +#ifndef _LIBCPP_HAS_NO_CONSTEXPR + { + constexpr std::tuple<> t; + } + { + constexpr std::tuple t; + assert(std::get<0>(t) == 0); + } + { + constexpr std::tuple t; + assert(std::get<0>(t) == 0); + assert(std::get<1>(t) == nullptr); + } +#endif }