aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3/include/std/type_traits
diff options
context:
space:
mode:
Diffstat (limited to 'libstdc++-v3/include/std/type_traits')
-rw-r--r--libstdc++-v3/include/std/type_traits30
1 files changed, 26 insertions, 4 deletions
diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits
index df5bbbb0b20..38c92abf6e8 100644
--- a/libstdc++-v3/include/std/type_traits
+++ b/libstdc++-v3/include/std/type_traits
@@ -240,7 +240,8 @@ namespace std
{
// "An imaginary lvalue of type From...".
static const bool __value = (__is_convertible_simple<typename
- add_reference<_From>::type, _To>::__value);
+ add_lvalue_reference<_From>::type,
+ _To>::__value);
};
template<typename _From, typename _To>
@@ -257,6 +258,27 @@ namespace std
__is_convertible_helper<_From, _To>::__value>
{ };
+ template<std::size_t _Len>
+ struct __aligned_storage_msa
+ {
+ union __type
+ {
+ unsigned char __data[_Len];
+ struct __attribute__((__aligned__)) { } __align;
+ };
+ };
+
+ template<std::size_t _Len, std::size_t _Align =
+ __alignof__(typename __aligned_storage_msa<_Len>::__type)>
+ struct aligned_storage
+ {
+ union type
+ {
+ unsigned char __data[_Len];
+ struct __attribute__((__aligned__((_Align)))) { } __align;
+ };
+ };
+
// Define a nested type if some predicate holds.
template<bool, typename _Tp = void>
@@ -286,21 +308,21 @@ namespace std
bool _IsFunction = is_function<_Up>::value>
struct __decay_selector;
+ // NB: DR 705.
template<typename _Up>
struct __decay_selector<_Up, false, false>
- { typedef _Up __type; };
+ { typedef typename remove_cv<_Up>::type __type; };
template<typename _Up>
struct __decay_selector<_Up, true, false>
{ typedef typename remove_extent<_Up>::type* __type; };
-
template<typename _Up>
struct __decay_selector<_Up, false, true>
{ typedef typename add_pointer<_Up>::type __type; };
template<typename _Tp>
- struct decay
+ struct decay
{
private:
typedef typename remove_reference<_Tp>::type __remove_type;