1 | // RUN: %clang_cc1 %s -std=c++11 -fsyntax-only -verify -triple x86_64-linux-gnu |
2 | |
3 | struct S; |
4 | constexpr int extract(const S &s); |
5 | |
6 | struct S { |
7 | constexpr S() : n(extract(*this)), m(0) {} // expected-note {{in call to 'extract(s1)'}} |
8 | constexpr S(int k) : n(k), m(extract(*this)) {} |
9 | int n, m; |
10 | }; |
11 | |
12 | constexpr int extract(const S &s) { return s.n; } // expected-note {{read of object outside its lifetime is not allowed in a constant expression}} |
13 | |
14 | constexpr S s1; // ok |
15 | void f() { |
16 | constexpr S s1; // expected-error {{constant expression}} expected-note {{in call to 'S()'}} |
17 | constexpr S s2(10); |
18 | } |
19 | |
20 | typedef __attribute__((vector_size(16))) int vector_int; |
21 | |
22 | struct T { |
23 | constexpr T() : arr() {} |
24 | int arr[4]; |
25 | }; |
26 | struct U : T { |
27 | constexpr U(const int *p) : T(), another(), p(p) {} |
28 | constexpr U(const U &u) : T(), another(), p(u.p) {} |
29 | T another; |
30 | const int *p; |
31 | }; |
32 | constexpr U u1(&u1.arr[2]); |
33 | |
34 | constexpr int test_printing(int a, float b, _Complex int c, _Complex float d, |
35 | int *e, int &f, vector_int g, U h) { |
36 | return *e; // expected-note {{read of non-constexpr variable 'u2'}} |
37 | } |
38 | U u2(0); // expected-note {{here}} |
39 | static_assert(test_printing(12, 39.762, 3 + 4i, 12.9 + 3.6i, &u2.arr[4], u2.another.arr[2], (vector_int){5, 1, 2, 3}, u1) == 0, ""); // \ |
40 | expected-error {{constant expression}} \ |
41 | expected-note {{in call to 'test_printing(12, 3.976200e+01, 3+4i, 1.290000e+01+3.600000e+00i, &u2.T::arr[4], u2.another.arr[2], {5, 1, 2, 3}, {{{}}, {{}}, &u1.T::arr[2]})'}} |
42 | |
43 | struct V { |
44 | // FIXME: when we can generate these as constexpr constructors, remove the |
45 | // explicit definitions. |
46 | constexpr V() : arr{[255] = 42} {} |
47 | constexpr V(const V &v) : arr{[255] = 42} {} |
48 | int arr[256]; |
49 | }; |
50 | constexpr V v; |
51 | constexpr int get(const int *p) { return *p; } // expected-note {{read of dereferenced one-past-the-end pointer}} |
52 | constexpr int passLargeArray(V v) { return get(v.arr+256); } // expected-note {{in call to 'get(&v.arr[256])'}} |
53 | static_assert(passLargeArray(v) == 0, ""); // expected-error {{constant expression}} expected-note {{in call to 'passLargeArray({{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...}})'}} |
54 | |
55 | union Union { |
56 | constexpr Union(int n) : b(n) {} |
57 | constexpr Union(const Union &u) : b(u.b) {} |
58 | int a, b; |
59 | }; |
60 | constexpr Union myUnion = 76; |
61 | |
62 | constexpr int badness(Union u) { return u.a + u.b; } // expected-note {{read of member 'a' of union with active member 'b'}} |
63 | static_assert(badness(myUnion), ""); // expected-error {{constant expression}} \ |
64 | expected-note {{in call to 'badness({.b = 76})'}} |
65 | |
66 | struct MemPtrTest { |
67 | int n; |
68 | void f(); |
69 | }; |
70 | MemPtrTest mpt; // expected-note {{here}} |
71 | constexpr int MemPtr(int (MemPtrTest::*a), void (MemPtrTest::*b)(), int &c) { |
72 | return c; // expected-note {{read of non-constexpr variable 'mpt'}} |
73 | } |
74 | static_assert(MemPtr(&MemPtrTest::n, &MemPtrTest::f, mpt.*&MemPtrTest::n), ""); // expected-error {{constant expression}} \ |
75 | expected-note {{in call to 'MemPtr(&MemPtrTest::n, &MemPtrTest::f, mpt.n)'}} |
76 | |
77 | template<typename CharT> |
78 | constexpr CharT get(const CharT *p) { return p[-1]; } // expected-note 5{{}} |
79 | |
80 | constexpr char c = get("test\0\\\"\t\a\b\234"); // \ |
81 | expected-error {{}} expected-note {{"test\000\\\"\t\a\b\234"}} |
82 | constexpr char c8 = get(u8"test\0\\\"\t\a\b\234"); // \ |
83 | expected-error {{}} expected-note {{u8"test\000\\\"\t\a\b\234"}} |
84 | constexpr char16_t c16 = get(u"test\0\\\"\t\a\b\234\u1234"); // \ |
85 | expected-error {{}} expected-note {{u"test\000\\\"\t\a\b\234\u1234"}} |
86 | constexpr char32_t c32 = get(U"test\0\\\"\t\a\b\234\u1234\U0010ffff"); // \ |
87 | expected-error {{}} expected-note {{U"test\000\\\"\t\a\b\234\u1234\U0010FFFF"}} |
88 | constexpr wchar_t wc = get(L"test\0\\\"\t\a\b\234\u1234\xffffffff"); // \ |
89 | expected-error {{}} expected-note {{L"test\000\\\"\t\a\b\234\x1234\xFFFFFFFF"}} |
90 | |
91 | constexpr char32_t c32_err = get(U"\U00110000"); // expected-error {{invalid universal character}} |
92 | |
93 | #define fold(x) (__builtin_constant_p(x) ? (x) : (x)) |
94 | |
95 | typedef decltype(sizeof(int)) LabelDiffTy; |
96 | constexpr LabelDiffTy mulBy3(LabelDiffTy x) { return x * 3; } // expected-note {{subexpression}} |
97 | void LabelDiffTest() { |
98 | static_assert(mulBy3(fold((LabelDiffTy)&&a-(LabelDiffTy)&&b)) == 3, ""); // expected-error {{constant expression}} expected-note {{call to 'mulBy3(&&a - &&b)'}} |
99 | a:b:return; |
100 | } |
101 | |
102 | constexpr bool test_bool_printing(bool b) { return 1 / !(2*b | !(2*b)); } // expected-note 2{{division by zero}} |
103 | constexpr bool test_bool_0 = test_bool_printing(false); // expected-error {{constant expr}} expected-note {{in call to 'test_bool_printing(false)'}} |
104 | constexpr bool test_bool_1 = test_bool_printing(true); // expected-error {{constant expr}} expected-note {{in call to 'test_bool_printing(true)'}} |
105 | |