1 // RUN: clang-cc -fsyntax-only -verify -std=c++98 %s
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.
13 enum Enum { eval = 1 };
15 const Enum ceval = eval;
17 static const int sval = 3;
18 static const Enum seval = eval;
21 template <int itval, Enum etval> struct C {
33 v11 = true? 1 + cval * Struct::sval ^ itval / (int)1.5 - sizeof(Struct) : 0
46 b11 : true? 1 + cval * Struct::sval ^ itval / (int)1.5 - sizeof(Struct) : 0
59 i11 = true? 1 + cval * Struct::sval ^ itval / (int)1.5 - sizeof(Struct) : 0
67 case 400 + Struct::sval:
68 case 500 + Struct::seval:
72 case 900 + sizeof(Struct):
73 case 1000 + (true? 1 + cval * Struct::sval ^
74 itval / (int)1.5 - sizeof(Struct) : 0):
78 typedef C<itval, etval> T0;
81 template struct C<1, eval>;
82 //template struct C<cval, ceval>;
83 //template struct C<Struct::sval, Struct::seval>;