2018-11-29 Jonathan Wakely <jwakely@redhat.com>
+ PR libstdc++/88119
+ * include/ext/aligned_buffer.h (__aligned_membuf): Add comment.
+ (__aligned_buffer): Use __alignof__ instead of std::alignment_of.
+ * include/std/type_traits (alignment_of): Use alignof instead of
+ __alignof__.
+ * testsuite/20_util/alignment_of/value.cc: Fix test to check values
+ match alignof not __alignof__, as required by the standard.
+
PR libstdc++/86910
PR libstdc++/87846
* src/filesystem/ops.cc (experimental::create_directories): Report
// Target macro ADJUST_FIELD_ALIGN can produce different alignment for
// types when used as class members. __aligned_membuf is intended
// for use as a class member, so align the buffer as for a class member.
+ // Since GCC 8 we could just use alignof(_Tp) instead, but older
+ // versions of non-GNU compilers might still need this trick.
struct _Tp2 { _Tp _M_t; };
alignas(__alignof__(_Tp2::_M_t)) unsigned char _M_storage[sizeof(_Tp)];
// This type is still used to avoid an ABI change.
template<typename _Tp>
struct __aligned_buffer
- : std::aligned_storage<sizeof(_Tp), std::alignment_of<_Tp>::value>
+ : std::aligned_storage<sizeof(_Tp), __alignof__(_Tp)>
{
typename
- std::aligned_storage<sizeof(_Tp), std::alignment_of<_Tp>::value>::type
- _M_storage;
+ std::aligned_storage<sizeof(_Tp), __alignof__(_Tp)>::type _M_storage;
__aligned_buffer() = default;
#include <type_traits>
#include <testsuite_tr1.h>
-void test01()
+template<typename T>
+constexpr bool test()
{
- using std::alignment_of;
- using namespace __gnu_test;
+ return __gnu_test::test_property<std::alignment_of, T>(alignof(T));
+}
- static_assert(test_property<alignment_of, char>(__alignof__(char)), "");
- static_assert(test_property<alignment_of, short>(__alignof__(short)), "");
- static_assert(test_property<alignment_of, int>(__alignof__(int)), "");
- static_assert(test_property<alignment_of, double>(__alignof__(double)), "");
- static_assert(test_property<alignment_of, int[4]>(__alignof__(int[4])), "");
- static_assert(test_property<alignment_of,
- ClassType>(__alignof__(ClassType)), "");
+void test01()
+{
+ static_assert(test<char>(), "");
+ static_assert(test<short>(), "");
+ static_assert(test<int>(), "");
+ static_assert(test<long>(), "");
+ static_assert(test<long long>(), "");
+ static_assert(test<float>(), "");
+ static_assert(test<double>(), "");
+ static_assert(test<long double>(), "");
+ static_assert(test<int[4]>(), "");
+ static_assert(test<__gnu_test::ClassType>(), "");
}