]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/SemaCXX/constant-expression.cpp
Update clang to 84175.
[FreeBSD/FreeBSD.git] / test / SemaCXX / constant-expression.cpp
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
13 enum Enum { eval = 1 };
14 const int cval = 2;
15 const Enum ceval = eval;
16 struct Struct {
17   static const int sval = 3;
18   static const Enum seval = eval;
19 };
20
21 template <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
81 template struct C<1, eval>;
82 //template struct C<cval, ceval>;
83 //template struct C<Struct::sval, Struct::seval>;