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