blob: 7f6a9c6a82f0deac8da8c7e786df6c3bafa68537 [file] [log] [blame]
Richard Smith3cbdeba2012-04-05 00:54:51 +00001// RUN: %clang_cc1 %s -std=c++11 -fsyntax-only -verify -triple x86_64-linux-gnu
Richard Smithf6f003a2011-12-16 19:06:07 +00002
Richard Smithd0b4dd62011-12-19 06:19:21 +00003struct S;
4constexpr int extract(const S &s);
Richard Smithf6f003a2011-12-16 19:06:07 +00005
6struct S {
Richard Smithd0b4dd62011-12-19 06:19:21 +00007 constexpr S() : n(extract(*this)), m(0) {} // expected-note {{in call to 'extract(s1)'}}
Richard Smithf6f003a2011-12-16 19:06:07 +00008 constexpr S(int k) : n(k), m(extract(*this)) {}
9 int n, m;
10};
11
Richard Smith3da88fa2013-04-26 14:36:30 +000012constexpr int extract(const S &s) { return s.n; } // expected-note {{read of object outside its lifetime is not allowed in a constant expression}}
Richard Smithf6f003a2011-12-16 19:06:07 +000013
Richard Smithfddd3842011-12-30 21:15:51 +000014constexpr S s1; // ok
15void f() {
16 constexpr S s1; // expected-error {{constant expression}} expected-note {{in call to 'S()'}}
17 constexpr S s2(10);
18}
Richard Smithf6f003a2011-12-16 19:06:07 +000019
20typedef __attribute__((vector_size(16))) int vector_int;
21
22struct T {
23 constexpr T() : arr() {}
24 int arr[4];
25};
26struct 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};
32constexpr U u1(&u1.arr[2]);
33
34constexpr int test_printing(int a, float b, _Complex int c, _Complex float d,
35 int *e, int &f, vector_int g, U h) {
Richard Smithf2b681b2011-12-21 05:04:46 +000036 return *e; // expected-note {{read of non-constexpr variable 'u2'}}
Richard Smithf6f003a2011-12-16 19:06:07 +000037}
Richard Smithf2b681b2011-12-21 05:04:46 +000038U u2(0); // expected-note {{here}}
Richard Smithf6f003a2011-12-16 19:06:07 +000039static_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, ""); // \
40expected-error {{constant expression}} \
Alp Toker6ed72512013-12-14 01:07:05 +000041expected-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]})'}}
Richard Smithf6f003a2011-12-16 19:06:07 +000042
43struct 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};
50constexpr V v;
Richard Smithf2b681b2011-12-21 05:04:46 +000051constexpr int get(const int *p) { return *p; } // expected-note {{read of dereferenced one-past-the-end pointer}}
Richard Smithf6f003a2011-12-16 19:06:07 +000052constexpr int passLargeArray(V v) { return get(v.arr+256); } // expected-note {{in call to 'get(&v.arr[256])'}}
Alp Toker6ed72512013-12-14 01:07:05 +000053static_assert(passLargeArray(v) == 0, ""); // expected-error {{constant expression}} expected-note {{in call to 'passLargeArray({{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...}})'}}
Richard Smithf6f003a2011-12-16 19:06:07 +000054
55union Union {
56 constexpr Union(int n) : b(n) {}
57 constexpr Union(const Union &u) : b(u.b) {}
58 int a, b;
59};
60constexpr Union myUnion = 76;
61
Richard Smithf2b681b2011-12-21 05:04:46 +000062constexpr int badness(Union u) { return u.a + u.b; } // expected-note {{read of member 'a' of union with active member 'b'}}
Richard Smithf6f003a2011-12-16 19:06:07 +000063static_assert(badness(myUnion), ""); // expected-error {{constant expression}} \
64 expected-note {{in call to 'badness({.b = 76})'}}
65
66struct MemPtrTest {
67 int n;
68 void f();
69};
Richard Smithf2b681b2011-12-21 05:04:46 +000070MemPtrTest mpt; // expected-note {{here}}
Richard Smithf6f003a2011-12-16 19:06:07 +000071constexpr int MemPtr(int (MemPtrTest::*a), void (MemPtrTest::*b)(), int &c) {
Richard Smithf2b681b2011-12-21 05:04:46 +000072 return c; // expected-note {{read of non-constexpr variable 'mpt'}}
Richard Smithf6f003a2011-12-16 19:06:07 +000073}
74static_assert(MemPtr(&MemPtrTest::n, &MemPtrTest::f, mpt.*&MemPtrTest::n), ""); // expected-error {{constant expression}} \
75expected-note {{in call to 'MemPtr(&MemPtrTest::n, &MemPtrTest::f, mpt.n)'}}
Richard Smith88eb4d32011-12-30 23:37:31 +000076
77template<typename CharT>
78constexpr CharT get(const CharT *p) { return p[-1]; } // expected-note 5{{}}
79
80constexpr char c = get("test\0\\\"\t\a\b\234"); // \
81 expected-error {{}} expected-note {{"test\000\\\"\t\a\b\234"}}
82constexpr char c8 = get(u8"test\0\\\"\t\a\b\234"); // \
83 expected-error {{}} expected-note {{u8"test\000\\\"\t\a\b\234"}}
84constexpr 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"}}
Richard Smithdbfd4032012-01-02 18:14:06 +000086constexpr 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"}}
Richard Smith7ba85c32012-04-05 00:17:44 +000088constexpr 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"}}
Richard Smithdbfd4032012-01-02 18:14:06 +000090
91constexpr char32_t c32_err = get(U"\U00110000"); // expected-error {{invalid universal character}}
Eli Friedmanb1bc3682012-01-05 23:59:40 +000092
Richard Smith0c6124b2015-12-03 01:36:22 +000093#define fold(x) (__builtin_constant_p(x) ? (x) : (x))
94
Eli Friedmanb1bc3682012-01-05 23:59:40 +000095typedef decltype(sizeof(int)) LabelDiffTy;
96constexpr LabelDiffTy mulBy3(LabelDiffTy x) { return x * 3; } // expected-note {{subexpression}}
97void LabelDiffTest() {
Richard Smith0c6124b2015-12-03 01:36:22 +000098 static_assert(mulBy3(fold((LabelDiffTy)&&a-(LabelDiffTy)&&b)) == 3, ""); // expected-error {{constant expression}} expected-note {{call to 'mulBy3(&&a - &&b)'}}
Eli Friedmanb1bc3682012-01-05 23:59:40 +000099 a:b:return;
100}
Richard Smith5614ca72012-03-23 23:55:39 +0000101
102constexpr bool test_bool_printing(bool b) { return 1 / !(2*b | !(2*b)); } // expected-note 2{{division by zero}}
103constexpr bool test_bool_0 = test_bool_printing(false); // expected-error {{constant expr}} expected-note {{in call to 'test_bool_printing(false)'}}
104constexpr bool test_bool_1 = test_bool_printing(true); // expected-error {{constant expr}} expected-note {{in call to 'test_bool_printing(true)'}}