aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/system.h1
-rw-r--r--gcc/vec.h8
2 files changed, 6 insertions, 3 deletions
diff --git a/gcc/system.h b/gcc/system.h
index a241e13..3c543a0 100644
--- a/gcc/system.h
+++ b/gcc/system.h
@@ -235,6 +235,7 @@ extern int errno;
# include <cstring>
# include <new>
# include <utility>
+# include <type_traits>
#endif
/* Some of glibc's string inlines cause warnings. Plus we'd rather
diff --git a/gcc/vec.h b/gcc/vec.h
index db48e97..6ede627 100644
--- a/gcc/vec.h
+++ b/gcc/vec.h
@@ -1283,9 +1283,11 @@ vec<T, A, vl_embed>::embedded_size (unsigned alloc)
{
struct alignas (T) U { char data[sizeof (T)]; };
typedef vec<U, A, vl_embed> vec_embedded;
- static_assert (sizeof (vec_embedded) == sizeof(vec), "");
- static_assert (alignof (vec_embedded) == alignof(vec), "");
- return offsetof (vec_embedded, m_vecdata) + alloc * sizeof (T);
+ typedef typename std::conditional<std::is_standard_layout<T>::value,
+ vec, vec_embedded>::type vec_stdlayout;
+ static_assert (sizeof (vec_stdlayout) == sizeof (vec), "");
+ static_assert (alignof (vec_stdlayout) == alignof (vec), "");
+ return offsetof (vec_stdlayout, m_vecdata) + alloc * sizeof (T);
}