Index: include/type_traits =================================================================== --- include/type_traits +++ include/type_traits @@ -4941,6 +4941,21 @@ #endif +#if _LIBCPP_STD_VER > 17 +enum class endian +{ + little = 0xDEAD, + big = 0xFACE, +#if defined(_LIBCPP_LITTLE_ENDIAN) + native = little +#elif defined(_LIBCPP_BIG_ENDIAN) + native = big +#else + native = 0xCAFE +#endif +}; +#endif + _LIBCPP_END_NAMESPACE_STD #if _LIBCPP_STD_VER > 14 Index: test/std/utilities/meta/meta.type.synop/endian.pass.cpp =================================================================== --- test/std/utilities/meta/meta.type.synop/endian.pass.cpp +++ test/std/utilities/meta/meta.type.synop/endian.pass.cpp @@ -0,0 +1,47 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++98, c++03, c++11, c++14, c++1z + +// enum class endian; + +#include +#include +#include + +#include "test_macros.h" + +int main() { + typedef std::endian E; + static_assert(std::is_enum::value, ""); + +// Check that E is a scoped enum by checking for conversions. + typedef std::underlying_type::type UT; + static_assert(!std::is_convertible::value, ""); + +// test that the enumeration values exist + static_assert( std::endian::little == std::endian::little ); + static_assert( std::endian::big == std::endian::big ); + static_assert( std::endian::native == std::endian::native ); + static_assert( std::endian::little != std::endian::big ); + +// Technically not required, but true on all existing machines + static_assert( std::endian::native == std::endian::little || + std::endian::native == std::endian::big ); + +// Try to check at runtime + { + uint32_t i = 0x01020304; + char c[4]; + static_assert(sizeof(i) == sizeof(c)); + std::memcpy(c, &i, sizeof(c)); + + assert ((c[0] == 1) == (std::endian::native == std::endian::big)); + } +}