Daniel Dunbar | a572887 | 2009-12-15 20:14:24 +0000 | [diff] [blame] | 1 | // RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s |
Sebastian Redl | 1590d9c | 2009-05-27 19:34:06 +0000 | [diff] [blame] | 2 | // C++ [expr.const]p1: |
| 3 | // In several places, C++ requires expressions that evaluate to an integral |
| 4 | // or enumeration constant: as array bounds, as case expressions, as |
| 5 | // bit-field lengths, as enumerator initializers, as static member |
| 6 | // initializers, and as integral or enumeration non-type template arguments. |
| 7 | // An integral constant-expression can involve only literals, enumerators, |
| 8 | // const variables or static data members of integral or enumeration types |
| 9 | // initialized with constant expressions, and sizeof expressions. Floating |
| 10 | // literals can appear only if they are cast to integral or enumeration types. |
| 11 | |
| 12 | enum Enum { eval = 1 }; |
| 13 | const int cval = 2; |
| 14 | const Enum ceval = eval; |
| 15 | struct Struct { |
| 16 | static const int sval = 3; |
| 17 | static const Enum seval = eval; |
| 18 | }; |
| 19 | |
| 20 | template <int itval, Enum etval> struct C { |
| 21 | enum E { |
| 22 | v1 = 1, |
| 23 | v2 = eval, |
| 24 | v3 = cval, |
| 25 | v4 = ceval, |
| 26 | v5 = Struct::sval, |
| 27 | v6 = Struct::seval, |
| 28 | v7 = itval, |
| 29 | v8 = etval, |
| 30 | v9 = (int)1.5, |
| 31 | v10 = sizeof(Struct), |
| 32 | v11 = true? 1 + cval * Struct::sval ^ itval / (int)1.5 - sizeof(Struct) : 0 |
| 33 | }; |
| 34 | unsigned |
| 35 | b1 : 1, |
| 36 | b2 : eval, |
| 37 | b3 : cval, |
| 38 | b4 : ceval, |
| 39 | b5 : Struct::sval, |
| 40 | b6 : Struct::seval, |
| 41 | b7 : itval, |
| 42 | b8 : etval, |
| 43 | b9 : (int)1.5, |
| 44 | b10 : sizeof(Struct), |
| 45 | b11 : true? 1 + cval * Struct::sval ^ itval / (int)1.5 - sizeof(Struct) : 0 |
| 46 | ; |
| 47 | static const int |
| 48 | i1 = 1, |
| 49 | i2 = eval, |
| 50 | i3 = cval, |
| 51 | i4 = ceval, |
| 52 | i5 = Struct::sval, |
| 53 | i6 = Struct::seval, |
| 54 | i7 = itval, |
| 55 | i8 = etval, |
| 56 | i9 = (int)1.5, |
| 57 | i10 = sizeof(Struct), |
| 58 | i11 = true? 1 + cval * Struct::sval ^ itval / (int)1.5 - sizeof(Struct) : 0 |
| 59 | ; |
John McCall | 0fb9708 | 2010-05-18 03:19:21 +0000 | [diff] [blame] | 60 | void f(int cond) { |
| 61 | switch(cond) { |
Sebastian Redl | 1590d9c | 2009-05-27 19:34:06 +0000 | [diff] [blame] | 62 | case 0 + 1: |
| 63 | case 100 + eval: |
| 64 | case 200 + cval: |
| 65 | case 300 + ceval: |
| 66 | case 400 + Struct::sval: |
| 67 | case 500 + Struct::seval: |
| 68 | case 600 + itval: |
| 69 | case 700 + etval: |
| 70 | case 800 + (int)1.5: |
| 71 | case 900 + sizeof(Struct): |
| 72 | case 1000 + (true? 1 + cval * Struct::sval ^ |
| 73 | itval / (int)1.5 - sizeof(Struct) : 0): |
| 74 | ; |
| 75 | } |
| 76 | } |
| 77 | typedef C<itval, etval> T0; |
| 78 | }; |
| 79 | |
| 80 | template struct C<1, eval>; |
Douglas Gregor | af68d4e | 2010-04-15 15:53:31 +0000 | [diff] [blame] | 81 | template struct C<cval, ceval>; |
| 82 | template struct C<Struct::sval, Struct::seval>; |
| 83 | |
| 84 | enum { |
| 85 | a = sizeof(int) == 8, |
| 86 | b = a? 8 : 4 |
| 87 | }; |