constant-expression.cpp revision 1590d9c0fec4c710c2962e4bb71f76979b5163d3
1// RUN: clang-cc -fsyntax-only -verify -std=c++98 %s 2 3// C++ [expr.const]p1: 4// In several places, C++ requires expressions that evaluate to an integral 5// or enumeration constant: as array bounds, as case expressions, as 6// bit-field lengths, as enumerator initializers, as static member 7// initializers, and as integral or enumeration non-type template arguments. 8// An integral constant-expression can involve only literals, enumerators, 9// const variables or static data members of integral or enumeration types 10// initialized with constant expressions, and sizeof expressions. Floating 11// literals can appear only if they are cast to integral or enumeration types. 12 13enum Enum { eval = 1 }; 14const int cval = 2; 15const Enum ceval = eval; 16struct Struct { 17 static const int sval = 3; 18 static const Enum seval = eval; 19}; 20 21template <int itval, Enum etval> struct C { 22 enum E { 23 v1 = 1, 24 v2 = eval, 25 v3 = cval, 26 v4 = ceval, 27 v5 = Struct::sval, 28 v6 = Struct::seval, 29 v7 = itval, 30 v8 = etval, 31 v9 = (int)1.5, 32 v10 = sizeof(Struct), 33 v11 = true? 1 + cval * Struct::sval ^ itval / (int)1.5 - sizeof(Struct) : 0 34 }; 35 unsigned 36 b1 : 1, 37 b2 : eval, 38 b3 : cval, 39 b4 : ceval, 40 b5 : Struct::sval, 41 b6 : Struct::seval, 42 b7 : itval, 43 b8 : etval, 44 b9 : (int)1.5, 45 b10 : sizeof(Struct), 46 b11 : true? 1 + cval * Struct::sval ^ itval / (int)1.5 - sizeof(Struct) : 0 47 ; 48 static const int 49 i1 = 1, 50 i2 = eval, 51 i3 = cval, 52 i4 = ceval, 53 i5 = Struct::sval, 54 i6 = Struct::seval, 55 i7 = itval, 56 i8 = etval, 57 i9 = (int)1.5, 58 i10 = sizeof(Struct), 59 i11 = true? 1 + cval * Struct::sval ^ itval / (int)1.5 - sizeof(Struct) : 0 60 ; 61 void f() { 62 switch(0) { 63 case 0 + 1: 64 case 100 + eval: 65 case 200 + cval: 66 case 300 + ceval: 67 case 400 + Struct::sval: 68 case 500 + Struct::seval: 69 case 600 + itval: 70 case 700 + etval: 71 case 800 + (int)1.5: 72 case 900 + sizeof(Struct): 73 case 1000 + (true? 1 + cval * Struct::sval ^ 74 itval / (int)1.5 - sizeof(Struct) : 0): 75 ; 76 } 77 } 78 typedef C<itval, etval> T0; 79}; 80 81template struct C<1, eval>; 82//template struct C<cval, ceval>; 83//template struct C<Struct::sval, Struct::seval>; 84