brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.4 KiB · 417cf2d Raw
52 lines · c
1// RUN: %clang_cc1 -triple x86_64 -ffreestanding -verify -std=c2x %s2 3/* WG14 N3035: yes4 * _BitInt Fixes5 */6 7#include <stdint.h>8 9/* intmax_t and uintmax_t don't need to be able to represent all of the values10 * of a bit-precise integer type. We test this by using a bit-precise integer11 * suffix on some huge values used within the preprocessor.12 */13#if 0x1'FFFF'FFFF'FFFF'FFFFwb == 0 /* expected-error {{integer literal is too large to be represented in any integer type}} */14#endif15 16/* Yet we can use that value as an initializer... */17_BitInt(66) Val = 0x1'FFFF'FFFF'FFFF'FFFFwb;18 19/* ...so long as the type is wide enough. */20intmax_t WrongVal = 0x1'FFFF'FFFF'FFFF'FFFFwb; /* expected-warning-re {{implicit conversion from '_BitInt(66)' to 'intmax_t' (aka '{{.*}}') changes value from 36893488147419103231 to -1}} */21 22/* None of the types in stdint.h may be defined in terms of a bit-precise23 * integer type. This macro presumes that if the type is not one of the builtin24 * scalar integer types, the type must be a bit-precise type. We're using this25 * because C does not have a particularly straightforward way to use _Generic26 * with arbitrary bit-precise integer types.27 */28#define IS_NOT_BIT_PRECISE(TYPE) _Generic((TYPE){ 0 },                          \29                                   short : 1, int : 1, long : 1, long long : 1, \30                                   unsigned short : 1, unsigned int : 1,        \31                                   unsigned long : 1, unsigned long long : 1,   \32                                   char : 1, signed char : 1, unsigned char : 1,\33                                   default : 0)34static_assert(IS_NOT_BIT_PRECISE(int8_t));35static_assert(IS_NOT_BIT_PRECISE(uint8_t));36static_assert(IS_NOT_BIT_PRECISE(int16_t));37static_assert(IS_NOT_BIT_PRECISE(uint16_t));38static_assert(IS_NOT_BIT_PRECISE(int32_t));39static_assert(IS_NOT_BIT_PRECISE(uint32_t));40static_assert(IS_NOT_BIT_PRECISE(int64_t));41static_assert(IS_NOT_BIT_PRECISE(uint64_t));42static_assert(IS_NOT_BIT_PRECISE(intmax_t));43static_assert(IS_NOT_BIT_PRECISE(uintmax_t));44static_assert(IS_NOT_BIT_PRECISE(intptr_t));45static_assert(IS_NOT_BIT_PRECISE(uintptr_t));46 47/* FIXME: N3035 also added wording disallowing using a bit-precise integer type48 * as the compatible type for an enumerated type. However, we don't have a49 * direct way to test that, so we're claiming conformance without test50 * coverage.51 */52