14fd05dc4062580acea72f8b8231fb0ea3ee49032Richard Smith// RUN: %clang_cc1 %s -std=c++11 -fsyntax-only -verify -triple x86_64-linux-gnu
208d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith
3099e7f647ccda915513f2b2ec53352dc756082d3Richard Smithstruct S;
4099e7f647ccda915513f2b2ec53352dc756082d3Richard Smithconstexpr int extract(const S &s);
508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith
608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smithstruct S {
7099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith  constexpr S() : n(extract(*this)), m(0) {} // expected-note {{in call to 'extract(s1)'}}
808d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith  constexpr S(int k) : n(k), m(extract(*this)) {}
908d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith  int n, m;
1008d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith};
1108d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith
12bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smithconstexpr int extract(const S &s) { return s.n; } // expected-note {{read of object outside its lifetime is not allowed in a constant expression}}
1308d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith
1451201882382fb40c9456a06c7f93d6ddd4a57712Richard Smithconstexpr S s1; // ok
1551201882382fb40c9456a06c7f93d6ddd4a57712Richard Smithvoid f() {
1651201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith  constexpr S s1; // expected-error {{constant expression}} expected-note {{in call to 'S()'}}
1751201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith  constexpr S s2(10);
1851201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith}
1908d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith
2008d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smithtypedef __attribute__((vector_size(16))) int vector_int;
2108d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith
2208d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smithstruct T {
2308d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith  constexpr T() : arr() {}
2408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith  int arr[4];
2508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith};
2608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smithstruct U : T {
2708d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith  constexpr U(const int *p) : T(), another(), p(p) {}
2808d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith  constexpr U(const U &u) : T(), another(), p(u.p) {}
2908d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith  T another;
3008d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith  const int *p;
3108d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith};
3208d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smithconstexpr U u1(&u1.arr[2]);
3308d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith
3408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smithconstexpr int test_printing(int a, float b, _Complex int c, _Complex float d,
3508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith                            int *e, int &f, vector_int g, U h) {
367098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith  return *e; // expected-note {{read of non-constexpr variable 'u2'}}
3708d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith}
387098cbd601ad915aed22d4b5850da99359f25bf3Richard SmithU u2(0); // expected-note {{here}}
3908d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smithstatic_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, ""); // \
4008d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smithexpected-error {{constant expression}} \
4108d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smithexpected-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]})'}}
4208d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith
4308d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smithstruct V {
4408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith  // FIXME: when we can generate these as constexpr constructors, remove the
4508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith  // explicit definitions.
4608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith  constexpr V() : arr{[255] = 42} {}
4708d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith  constexpr V(const V &v) : arr{[255] = 42} {}
4808d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith  int arr[256];
4908d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith};
5008d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smithconstexpr V v;
517098cbd601ad915aed22d4b5850da99359f25bf3Richard Smithconstexpr int get(const int *p) { return *p; } // expected-note {{read of dereferenced one-past-the-end pointer}}
5208d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smithconstexpr int passLargeArray(V v) { return get(v.arr+256); } // expected-note {{in call to 'get(&v.arr[256])'}}
5308d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smithstatic_assert(passLargeArray(v) == 0, ""); // expected-error {{constant expression}} expected-note {{in call to 'passLargeArray({{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...}})'}}
5408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith
5508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smithunion Union {
5608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith  constexpr Union(int n) : b(n) {}
5708d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith  constexpr Union(const Union &u) : b(u.b) {}
5808d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith  int a, b;
5908d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith};
6008d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smithconstexpr Union myUnion = 76;
6108d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith
627098cbd601ad915aed22d4b5850da99359f25bf3Richard Smithconstexpr int badness(Union u) { return u.a + u.b; } // expected-note {{read of member 'a' of union with active member 'b'}}
6308d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smithstatic_assert(badness(myUnion), ""); // expected-error {{constant expression}} \
6408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith        expected-note {{in call to 'badness({.b = 76})'}}
6508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith
6608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smithstruct MemPtrTest {
6708d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith  int n;
6808d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith  void f();
6908d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith};
707098cbd601ad915aed22d4b5850da99359f25bf3Richard SmithMemPtrTest mpt; // expected-note {{here}}
7108d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smithconstexpr int MemPtr(int (MemPtrTest::*a), void (MemPtrTest::*b)(), int &c) {
727098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith  return c; // expected-note {{read of non-constexpr variable 'mpt'}}
7308d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith}
7408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smithstatic_assert(MemPtr(&MemPtrTest::n, &MemPtrTest::f, mpt.*&MemPtrTest::n), ""); // expected-error {{constant expression}} \
7508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smithexpected-note {{in call to 'MemPtr(&MemPtrTest::n, &MemPtrTest::f, mpt.n)'}}
764debc82d9d967501b8650599cd44003d7026f56cRichard Smith
774debc82d9d967501b8650599cd44003d7026f56cRichard Smithtemplate<typename CharT>
784debc82d9d967501b8650599cd44003d7026f56cRichard Smithconstexpr CharT get(const CharT *p) { return p[-1]; } // expected-note 5{{}}
794debc82d9d967501b8650599cd44003d7026f56cRichard Smith
804debc82d9d967501b8650599cd44003d7026f56cRichard Smithconstexpr char c = get("test\0\\\"\t\a\b\234"); // \
814debc82d9d967501b8650599cd44003d7026f56cRichard Smith  expected-error {{}} expected-note {{"test\000\\\"\t\a\b\234"}}
824debc82d9d967501b8650599cd44003d7026f56cRichard Smithconstexpr char c8 = get(u8"test\0\\\"\t\a\b\234"); // \
834debc82d9d967501b8650599cd44003d7026f56cRichard Smith  expected-error {{}} expected-note {{u8"test\000\\\"\t\a\b\234"}}
844debc82d9d967501b8650599cd44003d7026f56cRichard Smithconstexpr char16_t c16 = get(u"test\0\\\"\t\a\b\234\u1234"); // \
854debc82d9d967501b8650599cd44003d7026f56cRichard Smith  expected-error {{}} expected-note {{u"test\000\\\"\t\a\b\234\u1234"}}
86a2d8669b09363d3d3a3c67982e08a38c8ed015d0Richard Smithconstexpr char32_t c32 = get(U"test\0\\\"\t\a\b\234\u1234\U0010ffff"); // \
87a2d8669b09363d3d3a3c67982e08a38c8ed015d0Richard Smith  expected-error {{}} expected-note {{U"test\000\\\"\t\a\b\234\u1234\U0010FFFF"}}
8869f50e7f29766ce76e79c69c38302ba654202377Richard Smithconstexpr wchar_t wc = get(L"test\0\\\"\t\a\b\234\u1234\xffffffff"); // \
8969f50e7f29766ce76e79c69c38302ba654202377Richard Smith  expected-error {{}} expected-note {{L"test\000\\\"\t\a\b\234\x1234\xFFFFFFFF"}}
90a2d8669b09363d3d3a3c67982e08a38c8ed015d0Richard Smith
91a2d8669b09363d3d3a3c67982e08a38c8ed015d0Richard Smithconstexpr char32_t c32_err = get(U"\U00110000"); // expected-error {{invalid universal character}}
925930a4c5224eea3b0558655f7f8c9ea027ef573eEli Friedman
935930a4c5224eea3b0558655f7f8c9ea027ef573eEli Friedmantypedef decltype(sizeof(int)) LabelDiffTy;
945930a4c5224eea3b0558655f7f8c9ea027ef573eEli Friedmanconstexpr LabelDiffTy mulBy3(LabelDiffTy x) { return x * 3; } // expected-note {{subexpression}}
955930a4c5224eea3b0558655f7f8c9ea027ef573eEli Friedmanvoid LabelDiffTest() {
965930a4c5224eea3b0558655f7f8c9ea027ef573eEli Friedman  static_assert(mulBy3((LabelDiffTy)&&a-(LabelDiffTy)&&b) == 3, ""); // expected-error {{constant expression}} expected-note {{call to 'mulBy3(&&a - &&b)'}}
975930a4c5224eea3b0558655f7f8c9ea027ef573eEli Friedman  a:b:return;
985930a4c5224eea3b0558655f7f8c9ea027ef573eEli Friedman}
99f602806965531ee06fd8664b9d7a8912c4af2870Richard Smith
100f602806965531ee06fd8664b9d7a8912c4af2870Richard Smithconstexpr bool test_bool_printing(bool b) { return 1 / !(2*b | !(2*b)); } // expected-note 2{{division by zero}}
101f602806965531ee06fd8664b9d7a8912c4af2870Richard Smithconstexpr bool test_bool_0 = test_bool_printing(false); // expected-error {{constant expr}} expected-note {{in call to 'test_bool_printing(false)'}}
102f602806965531ee06fd8664b9d7a8912c4af2870Richard Smithconstexpr bool test_bool_1 = test_bool_printing(true); // expected-error {{constant expr}} expected-note {{in call to 'test_bool_printing(true)'}}
103