[libcxx-commits] [libcxx] 03dd205 - Adjust max_align_t handling

Joerg Sonnenberger via libcxx-commits libcxx-commits at lists.llvm.org
Mon Feb 24 16:43:08 PST 2020


Author: Joerg Sonnenberger
Date: 2020-02-25T01:36:43+01:00
New Revision: 03dd205c1516d9930a80101a7e0a6793af47ec9e

URL: https://github.com/llvm/llvm-project/commit/03dd205c1516d9930a80101a7e0a6793af47ec9e
DIFF: https://github.com/llvm/llvm-project/commit/03dd205c1516d9930a80101a7e0a6793af47ec9e.diff

LOG: Adjust max_align_t handling

Depend on the compiler to provide a correct implementation of
max_align_t. If __STDCPP_NEW_ALIGNMENT__ is missing and C++03 mode has
been explicitly enabled, provide a minimal fallback in <new> as
alignment of the largest primitive types.

Added: 
    

Modified: 
    libcxx/include/cstddef
    libcxx/include/new
    libcxx/include/stddef.h

Removed: 
    


################################################################################
diff  --git a/libcxx/include/cstddef b/libcxx/include/cstddef
index 87eee4bf5b42..2a0bfeb6e15f 100644
--- a/libcxx/include/cstddef
+++ b/libcxx/include/cstddef
@@ -25,7 +25,7 @@ Types:
 
     ptr
diff _t
     size_t
-    max_align_t
+    max_align_t // C++11
     nullptr_t
     byte // C++17
 
@@ -49,12 +49,8 @@ _LIBCPP_BEGIN_NAMESPACE_STD
 using ::ptr
diff _t;
 using ::size_t;
 
-#if defined(__CLANG_MAX_ALIGN_T_DEFINED) || defined(_GCC_MAX_ALIGN_T) || \
-    defined(__DEFINED_max_align_t) || defined(__NetBSD__)
-// Re-use the compiler's <stddef.h> max_align_t where possible.
+#if !defined(_LIBCPP_CXX03_LANG)
 using ::max_align_t;
-#else
-typedef long double max_align_t;
 #endif
 
 template <class _Tp> struct __libcpp_is_integral                     { enum { value = 0 }; };

diff  --git a/libcxx/include/new b/libcxx/include/new
index 40d351e9b770..b64057a87854 100644
--- a/libcxx/include/new
+++ b/libcxx/include/new
@@ -226,9 +226,19 @@ inline _LIBCPP_INLINE_VISIBILITY void  operator delete[](void*, void*) _NOEXCEPT
 
 _LIBCPP_BEGIN_NAMESPACE_STD
 
+#if defined(_LIBCPP_CXX03_LANG)
+union __libcpp_max_align_t {
+  void * __f1;
+  long long int __f2;
+  long double __f3;
+};
+#endif
+
 _LIBCPP_CONSTEXPR inline _LIBCPP_INLINE_VISIBILITY bool __is_overaligned_for_new(size_t __align) _NOEXCEPT {
 #ifdef __STDCPP_DEFAULT_NEW_ALIGNMENT__
   return __align > __STDCPP_DEFAULT_NEW_ALIGNMENT__;
+#elif defined(_LIBCPP_CXX03_LANG)
+  return __align > alignment_of<__libcpp_max_align_t>::value;
 #else
   return __align > alignment_of<max_align_t>::value;
 #endif

diff  --git a/libcxx/include/stddef.h b/libcxx/include/stddef.h
index 6497dcda2af4..ba28b29c0b3f 100644
--- a/libcxx/include/stddef.h
+++ b/libcxx/include/stddef.h
@@ -51,12 +51,6 @@ extern "C++" {
 using std::nullptr_t;
 }
 
-// Re-use the compiler's <stddef.h> max_align_t where possible.
-#if !defined(__CLANG_MAX_ALIGN_T_DEFINED) && !defined(_GCC_MAX_ALIGN_T) && \
-    !defined(__DEFINED_max_align_t) && !defined(__NetBSD__)
-typedef long double max_align_t;
-#endif
-
 #endif
 
 #endif  // _LIBCPP_STDDEF_H


        


More information about the libcxx-commits mailing list