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 int arr[256] = {[255] = 42}; // expected-warning {{C99}} 45 }; 46 constexpr V v; 47 constexpr int get(const int *p) { return *p; } // expected-note {{read of dereferenced one-past-the-end pointer}} 48 constexpr int passLargeArray(V v) { return get(v.arr+256); } // expected-note {{in call to 'get(&v.arr[256])'}} 49 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, ...}})'}} 50 51 union Union { 52 constexpr Union(int n) : b(n) {} 53 constexpr Union(const Union &u) : b(u.b) {} 54 int a, b; 55 }; 56 constexpr Union myUnion = 76; 57 58 constexpr int badness(Union u) { return u.a + u.b; } // expected-note {{read of member 'a' of union with active member 'b'}} 59 static_assert(badness(myUnion), ""); // expected-error {{constant expression}} \ 60 expected-note {{in call to 'badness({.b = 76})'}} 61 62 struct MemPtrTest { 63 int n; 64 void f(); 65 }; 66 MemPtrTest mpt; // expected-note {{here}} 67 constexpr int MemPtr(int (MemPtrTest::*a), void (MemPtrTest::*b)(), int &c) { 68 return c; // expected-note {{read of non-constexpr variable 'mpt'}} 69 } 70 static_assert(MemPtr(&MemPtrTest::n, &MemPtrTest::f, mpt.*&MemPtrTest::n), ""); // expected-error {{constant expression}} \ 71 expected-note {{in call to 'MemPtr(&MemPtrTest::n, &MemPtrTest::f, mpt.n)'}} 72 73 template<typename CharT> 74 constexpr CharT get(const CharT *p) { return p[-1]; } // expected-note 5{{}} 75 76 constexpr char c = get("test\0\\\"\t\a\b\234"); // \ 77 expected-error {{}} expected-note {{"test\000\\\"\t\a\b\234"}} 78 constexpr char c8 = get(u8"test\0\\\"\t\a\b\234"); // \ 79 expected-error {{}} expected-note {{u8"test\000\\\"\t\a\b\234"}} 80 constexpr char16_t c16 = get(u"test\0\\\"\t\a\b\234\u1234"); // \ 81 expected-error {{}} expected-note {{u"test\000\\\"\t\a\b\234\u1234"}} 82 constexpr char32_t c32 = get(U"test\0\\\"\t\a\b\234\u1234\U0010ffff"); // \ 83 expected-error {{}} expected-note {{U"test\000\\\"\t\a\b\234\u1234\U0010FFFF"}} 84 constexpr wchar_t wc = get(L"test\0\\\"\t\a\b\234\u1234\xffffffff"); // \ 85 expected-error {{}} expected-note {{L"test\000\\\"\t\a\b\234\x1234\xFFFFFFFF"}} 86 87 constexpr char32_t c32_err = get(U"\U00110000"); // expected-error {{invalid universal character}} 88 89 #define fold(x) (__builtin_constant_p(x) ? (x) : (x)) 90 91 typedef decltype(sizeof(int)) LabelDiffTy; 92 constexpr LabelDiffTy mulBy3(LabelDiffTy x) { return x * 3; } // expected-note {{subexpression}} 93 void LabelDiffTest() { 94 static_assert(mulBy3(fold((LabelDiffTy)&&a-(LabelDiffTy)&&b)) == 3, ""); // expected-error {{constant expression}} expected-note {{call to 'mulBy3(&&a - &&b)'}} 95 a:b:return; 96 } 97 98 constexpr bool test_bool_printing(bool b) { return 1 / !(2*b | !(2*b)); } // expected-note 2{{division by zero}} 99 constexpr bool test_bool_0 = test_bool_printing(false); // expected-error {{constant expr}} expected-note {{in call to 'test_bool_printing(false)'}} 100 constexpr bool test_bool_1 = test_bool_printing(true); // expected-error {{constant expr}} expected-note {{in call to 'test_bool_printing(true)'}} 101