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