@@ -91,11 +91,9 @@ _LIBCPP_HIDE_FROM_ABI _LIBCPP_NO_SANITIZE("address") size_t __get_array_cookie([
9191
9292#if defined(_LIBCPP_ABI_ITANIUM)
9393
94- using _ArrayCookie = size_t ;
95- char const * __allocation_start = reinterpret_cast <char const *>(__ptr) - sizeof (_ArrayCookie);
96- char __cookie[sizeof (_ArrayCookie)];
97- __builtin_memcpy (&__cookie, __allocation_start, sizeof (_ArrayCookie)); // necessary to avoid violating strict aliasing
98- return *reinterpret_cast <_ArrayCookie const *>(&__cookie);
94+ struct _ArrayCookie {
95+ size_t __element_count;
96+ };
9997
10098#elif defined(_LIBCPP_ABI_ITANIUM_WITH_ARM_DIFFERENCES)
10199
@@ -104,16 +102,18 @@ _LIBCPP_HIDE_FROM_ABI _LIBCPP_NO_SANITIZE("address") size_t __get_array_cookie([
104102 size_t __element_count;
105103 };
106104
107- char const * __allocation_start = reinterpret_cast <char const *>(__ptr) - sizeof (_ArrayCookie);
108- char __cookie[sizeof (_ArrayCookie)];
109- __builtin_memcpy (&__cookie, __allocation_start, sizeof (_ArrayCookie)); // necessary to avoid violating strict aliasing
110- return reinterpret_cast <_ArrayCookie const *>(&__cookie)->__element_count ;
111-
112105#else
113106
114- static_assert (sizeof (_Tp) == 0 , " This function is not implemented for this ABI" );
107+ static_assert (false , " Getting the array cookie is not implemented on this ABI" );
115108
116109#endif
110+
111+ char const * __allocation_start = reinterpret_cast <char const *>(__ptr) - sizeof (_ArrayCookie);
112+ _ArrayCookie __cookie;
113+ // This is necessary to avoid violating strict aliasing. It's valid because _ArrayCookie is an
114+ // implicit lifetime type.
115+ __builtin_memcpy (&__cookie, __allocation_start, sizeof (_ArrayCookie));
116+ return __cookie.__element_count ;
117117}
118118
119119_LIBCPP_END_NAMESPACE_STD
0 commit comments