]>
Commit | Line | Data |
---|---|---|
223e47cc LB |
1 | // RUN: %clang_cc1 -fsyntax-only -verify -pedantic %s |
2 | ||
3 | // C++-specific tests for integral constant expressions. | |
4 | ||
5 | const int c = 10; | |
6 | int ar[c]; | |
7 | ||
8 | struct X0 { | |
9 | static const int value = static_cast<int>(4.0); | |
10 | }; | |
11 | ||
12 | void f() { | |
13 | if (const int value = 17) { | |
14 | int array[value]; | |
15 | } | |
16 | } | |
17 | ||
18 | int a() { | |
19 | const int t=t; // expected-note {{declared here}} | |
20 | switch(1) { // expected-warning {{no case matching constant switch condition '1'}} | |
21 | case t:; // expected-error {{not an integral constant expression}} expected-note {{initializer of 't' is not a constant expression}} | |
22 | } | |
23 | } | |
24 | ||
25 | // PR6206: out-of-line definitions are legit | |
26 | namespace pr6206 { | |
27 | class Foo { | |
28 | public: | |
29 | static const int kBar; | |
30 | }; | |
31 | ||
32 | const int Foo::kBar = 20; | |
33 | ||
34 | char Test() { | |
35 | char str[Foo::kBar]; | |
36 | str[0] = '0'; | |
37 | return str[0]; | |
38 | } | |
39 | } | |
40 | ||
41 | // PR6373: default arguments don't count. | |
42 | void pr6373(const unsigned x = 0) { | |
43 | unsigned max = 80 / x; | |
44 | } | |
45 | ||
46 | ||
47 | // rdar://9204520 | |
48 | namespace rdar9204520 { | |
49 | ||
50 | struct A { | |
51 | static const int B = int(0.75 * 1000 * 1000); // expected-warning {{not a constant expression; folding it to a constant is a GNU extension}} | |
52 | }; | |
53 | ||
54 | int foo() { return A::B; } | |
55 | } | |
56 | ||
57 | // PR11040 | |
58 | const int x = 10; | |
59 | int* y = reinterpret_cast<const char&>(x); // expected-error {{cannot initialize}} | |
60 | ||
61 | // This isn't an integral constant expression, but make sure it folds anyway. | |
62 | struct PR8836 { char _; long long a; }; // expected-warning {{long long}} | |
63 | int PR8836test[(__typeof(sizeof(int)))&reinterpret_cast<const volatile char&>((((PR8836*)0)->a))]; // expected-warning {{folded to constant array as an extension}} expected-note {{cast which performs the conversions of a reinterpret_cast is not allowed in a constant expression}} | |
64 | ||
65 | const int nonconst = 1.0; // expected-note {{declared here}} | |
66 | int arr[nonconst]; // expected-warning {{folded to constant array as an extension}} expected-note {{initializer of 'nonconst' is not a constant expression}} | |
67 | const int castfloat = static_cast<int>(1.0); | |
68 | int arr2[castfloat]; // ok |