// RUN: %clang_cc1 -fsyntax-only -verify -std=c23 %s // GH87641 noticed that integer promotion of a bit-field of bit-precise integer // type was promoting to int rather than the type of the bit-field. struct S { unsigned _BitInt(7) x : 2; unsigned _BitInt(2) y : 2; unsigned _BitInt(72) z : 28; _BitInt(31) a : 12; _BitInt(33) b : 33; }; // We don't have to worry about promotion cases where the bit-precise type is // smaller than the width of the bit-field; that can't happen. struct T { unsigned _BitInt(28) oh_no : 72; // expected-error {{width of bit-field 'oh_no' (72 bits) exceeds the width of its type (28 bits)}} }; static_assert( _Generic(+(struct S){}.x, int : 0, unsigned _BitInt(7) : 1, unsigned _BitInt(2) : 2 ) == 1); static_assert( _Generic(+(struct S){}.y, int : 0, unsigned _BitInt(7) : 1, unsigned _BitInt(2) : 2 ) == 2); static_assert( _Generic(+(struct S){}.z, int : 0, unsigned _BitInt(72) : 1, unsigned _BitInt(28) : 2 ) == 1); static_assert( _Generic(+(struct S){}.a, int : 0, _BitInt(31) : 1, _BitInt(12) : 2, unsigned _BitInt(31) : 3 ) == 1); static_assert( _Generic(+(struct S){}.b, int : 0, long long : 1, _BitInt(33) : 2, unsigned _BitInt(33) : 3 ) == 2);