Sebastian Redl | 1590d9c | 2009-05-27 19:34:06 +0000 | [diff] [blame] | 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>; |