Commit 7b277e8b by Tim Shen Committed by Tim Shen

variant: Remove variant<T&>...

	* include/std/variant: Remove variant<T&>, variant<void>, variant<> support
	to rebase on the post-Issaquah design.
	* testsuite/20_util/variant/compile.cc: Likewise.

From-SVN: r242437
parent 18d2ada8
2016-11-15 Tim Shen <timshen@google.com>
* include/std/variant: Remove variant<T&>, variant<void>, variant<> support
to rebase on the post-Issaquah design.
* testsuite/20_util/variant/compile.cc: Likewise.
2016-11-15 Matthias Klose <doko@ubuntu.com> 2016-11-15 Matthias Klose <doko@ubuntu.com>
* configure: Regenerate. * configure: Regenerate.
...@@ -341,9 +347,9 @@ ...@@ -341,9 +347,9 @@
2016-11-09 Tim Shen <timshen@google.com> 2016-11-09 Tim Shen <timshen@google.com>
* libstdc++-v3/include/bits/regex.h (regex_iterator::regex_iterator()): * include/bits/regex.h (regex_iterator::regex_iterator()):
Define end() as _M_pregex == nullptr. Define end() as _M_pregex == nullptr.
* libstdc++-v3/include/bits/regex.tcc (regex_iterator::operator==(), * include/bits/regex.tcc (regex_iterator::operator==(),
regex_iterator::operator++()): Fix operator==() and operator++() to regex_iterator::operator++()): Fix operator==() and operator++() to
look at null-ness of _M_pregex on both sides. look at null-ness of _M_pregex on both sides.
* testsuite/28_regex/regression.cc: New testcase. * testsuite/28_regex/regression.cc: New testcase.
......
...@@ -137,41 +137,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -137,41 +137,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
struct __reserved_type_map_impl<const volatile _From, _To> struct __reserved_type_map_impl<const volatile _From, _To>
{ using type = add_cv_t<__reserved_type_map<_From, _To>>; }; { using type = add_cv_t<__reserved_type_map<_From, _To>>; };
// Stores a reference alternative as a... well, reference. // This abstraction might be useful for future features,
template<typename _Reference> // e.g. boost::recursive_wrapper.
struct _Reference_storage
{
static_assert(is_reference_v<_Reference>,
"BUG: _Reference should be a reference");
_Reference_storage(_Reference __ref) noexcept : _M_storage(__ref) { }
operator _Reference() noexcept
{ return static_cast<_Reference>(_M_storage); }
_Reference _M_storage;
};
// Stores a void alternative, because it is not a regular type.
template<typename _Void>
struct _Void_storage { };
// Map from the alternative type to a non-qualified storage type.
template<typename _Alternative, typename = void>
struct __storage_type
{ using type = _Alternative; };
template<typename _Alternative>
struct __storage_type<_Alternative,
enable_if_t<is_reference_v<_Alternative>>>
{ using type = _Reference_storage<_Alternative>; };
template<typename _Alternative> template<typename _Alternative>
struct __storage_type<_Alternative, enable_if_t<is_void_v<_Alternative>>> using __storage = _Alternative;
{ using type = _Void_storage<_Alternative>; };
template<typename _Type>
using __storage = typename __storage_type<_Type>::type;
template<typename _Type, bool __is_literal = std::is_literal_type_v<_Type>> template<typename _Type, bool __is_literal = std::is_literal_type_v<_Type>>
struct _Uninitialized; struct _Uninitialized;
...@@ -202,37 +171,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -202,37 +171,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
_M_storage; _M_storage;
}; };
// Reverse mapping of __storage_type.
template<typename _Storage_type>
struct __alternative_type
{
static_assert(!is_reference_v<_Storage_type>,
"BUG: _Storage_type should not be reference");
using type = _Storage_type;
};
template<typename _Reference>
struct __alternative_type<_Reference_storage<_Reference>>
{ using type = _Reference; };
template<typename _Void>
struct __alternative_type<_Void_storage<_Void>>
{ using type = _Void; };
// Given a qualified storage type, return the desired reference. // Given a qualified storage type, return the desired reference.
// The qualified storage type is supposed to carry the variant object's // For example, variant<int>&& stores the int as __storage<int>, and
// qualifications and reference information, and the designated alternative's // _Qualified_storage will be __storage<int>&&.
// storage type.
// Returns the qualification-collapsed alternative references.
//
// For example, __get_alternative<_Reference_storage<int&&>&> returns int&.
template<typename _Qualified_storage> template<typename _Qualified_storage>
decltype(auto) decltype(auto)
__get_alternative(void* __ptr) __get_alternative(void* __ptr)
{ {
using _Storage = decay_t<_Qualified_storage>; using _Storage = decay_t<_Qualified_storage>;
using _Alternative = typename __alternative_type<_Storage>::type; return __reserved_type_map<_Qualified_storage, _Storage>(
return __reserved_type_map<_Qualified_storage, _Alternative>(
*static_cast<_Storage*>(__ptr)); *static_cast<_Storage*>(__ptr));
} }
...@@ -970,6 +917,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -970,6 +917,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
variant<_Types...>> variant<_Types...>>
{ {
private: private:
static_assert(sizeof...(_Types) > 0,
"variant must have at least one alternative");
static_assert(!(std::is_reference_v<_Types> || ...),
"variant must have no reference alternative");
static_assert(!(std::is_void_v<_Types> || ...),
"variant must have no void alternative");
using _Base = __detail::__variant::_Variant_base<_Types...>; using _Base = __detail::__variant::_Variant_base<_Types...>;
using _Default_ctor_enabler = using _Default_ctor_enabler =
_Enable_default_constructor< _Enable_default_constructor<
...@@ -1265,11 +1219,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -1265,11 +1219,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__get_storage(_Vp&& __v); __get_storage(_Vp&& __v);
}; };
// To honor algebraic data type, variant<> should be a bottom type, which
// is 0 (as opposed to a void type, which is 1). Use incomplete type to model
// bottom type.
template<> class variant<>;
template<size_t _Np, typename... _Types> template<size_t _Np, typename... _Types>
variant_alternative_t<_Np, variant<_Types...>>& variant_alternative_t<_Np, variant<_Types...>>&
get(variant<_Types...>& __v) get(variant<_Types...>& __v)
......
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