blob: 02ea802c7265a6533806847799b579bf09eeab0f [file] [log] [blame]
Sebastian Redl1590d9c2009-05-27 19:34:06 +00001// 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>;