1*f4a2713aSLionel Sambuc // RUN: %clang_cc1 -triple x86_64-apple-darwin10.0.0 -fsyntax-only -verify %s 2*f4a2713aSLionel Sambuc template<typename T> int force_same(T, T); 3*f4a2713aSLionel Sambuc 4*f4a2713aSLionel Sambuc // C++ [dcl.enum]p5: 5*f4a2713aSLionel Sambuc // [...] If the underlying type is not fixed, the type of each enumerator is 6*f4a2713aSLionel Sambuc // the type of its initializing value: 7*f4a2713aSLionel Sambuc // - If an initializer is specified for an enumerator, the initializing 8*f4a2713aSLionel Sambuc // value has the same type as the expression. 9*f4a2713aSLionel Sambuc enum Bullet1 { 10*f4a2713aSLionel Sambuc Bullet1Val1 = 'a', 11*f4a2713aSLionel Sambuc Bullet1Val2 = 10u, 12*f4a2713aSLionel Sambuc Bullet1Val1IsChar = sizeof(force_same(Bullet1Val1, char(0))), 13*f4a2713aSLionel Sambuc Bullet1Val2IsUnsigned = sizeof(force_same(Bullet1Val2, unsigned(0))) 14*f4a2713aSLionel Sambuc }; 15*f4a2713aSLionel Sambuc 16*f4a2713aSLionel Sambuc // - If no initializer is specified for the first enumerator, the 17*f4a2713aSLionel Sambuc // initializing value has an unspecified integral type. 18*f4a2713aSLionel Sambuc enum Bullet2 { 19*f4a2713aSLionel Sambuc Bullet2Val, 20*f4a2713aSLionel Sambuc Bullet2ValIsInt = sizeof(force_same(Bullet2Val, int(0))) 21*f4a2713aSLionel Sambuc }; 22*f4a2713aSLionel Sambuc 23*f4a2713aSLionel Sambuc // - Otherwise the type of the initializing value is the same as the type 24*f4a2713aSLionel Sambuc // of the initializing value of the preceding enumerator unless the 25*f4a2713aSLionel Sambuc // incremented value is not representable in that type, in which case the 26*f4a2713aSLionel Sambuc // type is an unspecified integral type sufficient to contain the 27*f4a2713aSLionel Sambuc // incremented value. If no such type exists, the program is ill-formed. 28*f4a2713aSLionel Sambuc enum Bullet3a { 29*f4a2713aSLionel Sambuc Bullet3aVal1 = 17, 30*f4a2713aSLionel Sambuc Bullet3aVal2, 31*f4a2713aSLionel Sambuc Bullet3aVal2IsInt = sizeof(force_same(Bullet3aVal2, int(0))), 32*f4a2713aSLionel Sambuc Bullet3aVal3 = 2147483647, 33*f4a2713aSLionel Sambuc Bullet3aVal3IsInt = sizeof(force_same(Bullet3aVal3, int(0))), 34*f4a2713aSLionel Sambuc Bullet3aVal4, 35*f4a2713aSLionel Sambuc Bullet3aVal4IsUnsigned = sizeof(force_same(Bullet3aVal4, 0ul)) 36*f4a2713aSLionel Sambuc }; 37*f4a2713aSLionel Sambuc 38*f4a2713aSLionel Sambuc enum Bullet3b { 39*f4a2713aSLionel Sambuc Bullet3bVal1 = 17u, 40*f4a2713aSLionel Sambuc Bullet3bVal2, 41*f4a2713aSLionel Sambuc Bullet3bVal2IsInt = sizeof(force_same(Bullet3bVal2, 0u)), 42*f4a2713aSLionel Sambuc Bullet3bVal3 = 2147483647u, 43*f4a2713aSLionel Sambuc Bullet3bVal3IsInt = sizeof(force_same(Bullet3bVal3, 0u)), 44*f4a2713aSLionel Sambuc Bullet3bVal4, 45*f4a2713aSLionel Sambuc Bullet3bVal4IsUnsigned = sizeof(force_same(Bullet3bVal4, 0ul)) 46*f4a2713aSLionel Sambuc }; 47*f4a2713aSLionel Sambuc 48*f4a2713aSLionel Sambuc enum Bullet3c { 49*f4a2713aSLionel Sambuc Bullet3cVal1 = 0xFFFFFFFFFFFFFFFEull, 50*f4a2713aSLionel Sambuc Bullet3cVal2, 51*f4a2713aSLionel Sambuc Bullet3cVal3 // expected-warning{{not representable}} 52*f4a2713aSLionel Sambuc }; 53*f4a2713aSLionel Sambuc 54*f4a2713aSLionel Sambuc // Following the closing brace of an enum-specifier, each enumerator has the 55*f4a2713aSLionel Sambuc // type of its enumeration. 56*f4a2713aSLionel Sambuc int array0[sizeof(force_same(Bullet3bVal3, Bullet3b(0)))? 1 : -1]; 57