summaryrefslogtreecommitdiffstats
path: root/libcxx
diff options
context:
space:
mode:
authorEric Fiselier <eric@efcs.ca>2017-01-16 21:15:08 +0000
committerEric Fiselier <eric@efcs.ca>2017-01-16 21:15:08 +0000
commitb43f17c835df5d4ffa94f1902fe7af88206d7521 (patch)
tree969c0de4f3d49fe5f67f37ba0417eaed0b854db8 /libcxx
parentfc26379a843ab23db0a637636423e9cb49747b2b (diff)
downloadbcm5719-llvm-b43f17c835df5d4ffa94f1902fe7af88206d7521.tar.gz
bcm5719-llvm-b43f17c835df5d4ffa94f1902fe7af88206d7521.zip
Fix std::tuples EBO when targeting the MSVC ABI.
MSVC/clang-cl doesn't do a full EBO unless __declspec(empty_bases) is applied to the derived type. This causes certain tuple tests to fail. This patch adds the empty_bases attribute to __tuple_impl in order for tuple to fully provide the EBO. llvm-svn: 292159
Diffstat (limited to 'libcxx')
-rw-r--r--libcxx/include/__config10
-rw-r--r--libcxx/include/tuple2
2 files changed, 11 insertions, 1 deletions
diff --git a/libcxx/include/__config b/libcxx/include/__config
index d7ecdcfc9cd..86413d566e9 100644
--- a/libcxx/include/__config
+++ b/libcxx/include/__config
@@ -100,6 +100,9 @@
#ifndef __is_identifier
#define __is_identifier(__x) 1
#endif
+#ifndef __has_declspec_attribute
+#define __has_declspec_attribute(__x) 0
+#endif
#define __has_keyword(__x) !(__is_identifier(__x))
@@ -1023,6 +1026,13 @@ _LIBCPP_FUNC_VIS extern "C" void __sanitizer_annotate_contiguous_container(
# define _LIBCPP_DIAGNOSE_ERROR(...)
#endif
+#if defined(_LIBCPP_ABI_MICROSOFT) && \
+ (defined(_LIBCPP_COMPILER_MSVC) || __has_declspec_attribute(empty_bases))
+# define _LIBCPP_DECLSPEC_EMPTY_BASES __declspec(empty_bases)
+#else
+# define _LIBCPP_DECLSPEC_EMPTY_BASES
+#endif
+
#endif // __cplusplus
#endif // _LIBCPP_CONFIG
diff --git a/libcxx/include/tuple b/libcxx/include/tuple
index cddb70954ee..a17ea01f102 100644
--- a/libcxx/include/tuple
+++ b/libcxx/include/tuple
@@ -366,7 +366,7 @@ struct __all_default_constructible<__tuple_types<_Tp...>>
template<class _Indx, class ..._Tp> struct __tuple_impl;
template<size_t ..._Indx, class ..._Tp>
-struct __tuple_impl<__tuple_indices<_Indx...>, _Tp...>
+struct _LIBCPP_DECLSPEC_EMPTY_BASES __tuple_impl<__tuple_indices<_Indx...>, _Tp...>
: public __tuple_leaf<_Indx, _Tp>...
{
_LIBCPP_INLINE_VISIBILITY
OpenPOWER on IntegriCloud