|  | // RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s | 
|  | // C++ [expr.const]p1: | 
|  | //   In several places, C++ requires expressions that evaluate to an integral | 
|  | //   or enumeration constant: as array bounds, as case expressions, as | 
|  | //   bit-field lengths, as enumerator initializers, as static member | 
|  | //   initializers, and as integral or enumeration non-type template arguments. | 
|  | //   An integral constant-expression can involve only literals, enumerators, | 
|  | //   const variables or static data members of integral or enumeration types | 
|  | //   initialized with constant expressions, and sizeof expressions. Floating | 
|  | //   literals can appear only if they are cast to integral or enumeration types. | 
|  |  | 
|  | enum Enum { eval = 1 }; | 
|  | const int cval = 2; | 
|  | const Enum ceval = eval; | 
|  | struct Struct { | 
|  | static const int sval = 3; | 
|  | static const Enum seval = eval; | 
|  | }; | 
|  |  | 
|  | template <int itval, Enum etval> struct C { | 
|  | enum E { | 
|  | v1 = 1, | 
|  | v2 = eval, | 
|  | v3 = cval, | 
|  | v4 = ceval, | 
|  | v5 = Struct::sval, | 
|  | v6 = Struct::seval, | 
|  | v7 = itval, | 
|  | v8 = etval, | 
|  | v9 = (int)1.5, | 
|  | v10 = sizeof(Struct), | 
|  | v11 = true? 1 + cval * Struct::sval ^ itval / (int)1.5 - sizeof(Struct) : 0 | 
|  | }; | 
|  | unsigned | 
|  | b1 : 1, | 
|  | b2 : eval, | 
|  | b3 : cval, | 
|  | b4 : ceval, | 
|  | b5 : Struct::sval, | 
|  | b6 : Struct::seval, | 
|  | b7 : itval, | 
|  | b8 : etval, | 
|  | b9 : (int)1.5, | 
|  | b10 : sizeof(Struct), | 
|  | b11 : true? 1 + cval * Struct::sval ^ itval / (int)1.5 - sizeof(Struct) : 0 | 
|  | ; | 
|  | static const int | 
|  | i1 = 1, | 
|  | i2 = eval, | 
|  | i3 = cval, | 
|  | i4 = ceval, | 
|  | i5 = Struct::sval, | 
|  | i6 = Struct::seval, | 
|  | i7 = itval, | 
|  | i8 = etval, | 
|  | i9 = (int)1.5, | 
|  | i10 = sizeof(Struct), | 
|  | i11 = true? 1 + cval * Struct::sval ^ itval / (int)1.5 - sizeof(Struct) : 0 | 
|  | ; | 
|  | void f(int cond) { | 
|  | switch(cond) { | 
|  | case    0 + 1: | 
|  | case  100 + eval: | 
|  | case  200 + cval: | 
|  | case  300 + ceval: | 
|  | case  400 + Struct::sval: | 
|  | case  500 + Struct::seval: | 
|  | case  600 + itval: | 
|  | case  700 + etval: | 
|  | case  800 + (int)1.5: | 
|  | case  900 + sizeof(Struct): | 
|  | case 1000 + (true? 1 + cval * Struct::sval ^ | 
|  | itval / (int)1.5 - sizeof(Struct) : 0): | 
|  | ; | 
|  | } | 
|  | } | 
|  | typedef C<itval, etval> T0; | 
|  | }; | 
|  |  | 
|  | template struct C<1, eval>; | 
|  | template struct C<cval, ceval>; | 
|  | template struct C<Struct::sval, Struct::seval>; | 
|  |  | 
|  | enum { | 
|  | a = sizeof(int) == 8, | 
|  | b = a? 8 : 4 | 
|  | }; |