1a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith// RUN: %clang_cc1 -std=c++1y -verify %s -fcxx-exceptions -triple=x86_64-linux-gnu 2a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith 3a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smithstruct S { 4a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith // dummy ctor to make this a literal type 5a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith constexpr S(int); 6a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith 7a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith S(); 8a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith 9a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith int arr[10]; 10a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith 11a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith constexpr int &get(int n) { return arr[n]; } 12a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith constexpr const int &get(int n) const { return arr[n]; } 13a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith}; 14a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith 15a10b97898ee6339c3110e6ca33f178ff52f05238Richard SmithS s = S(); 16a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smithconst S &sr = s; 17a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smithstatic_assert(&s.get(4) - &sr.get(2) == 2, ""); 18a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith 19a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith// Compound-statements can be used in constexpr functions. 20a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smithconstexpr int e() {{{{}} return 5; }} 21a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smithstatic_assert(e() == 5, ""); 22a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith 23a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith// Types can be defined in constexpr functions. 24a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smithconstexpr int f() { 25a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith enum E { e1, e2, e3 }; 26a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith 27a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith struct S { 28a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith constexpr S(E e) : e(e) {} 29a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith constexpr int get() { return e; } 30a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith E e; 31a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith }; 32a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith 33a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith return S(e2).get(); 34a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith} 35a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smithstatic_assert(f() == 1, ""); 36a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith 37a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith// Variables can be declared in constexpr functions. 38a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smithconstexpr int g(int k) { 39a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith const int n = 9; 40a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith int k2 = k * k; 41a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith int k3 = k2 * k; 42a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith return 3 * k3 + 5 * k2 + n * k - 20; 43a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith} 44a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smithstatic_assert(g(2) == 42, ""); 45a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smithconstexpr int h(int n) { 46a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith static const int m = n; // expected-error {{static variable not permitted in a constexpr function}} 47a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith return m; 48a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith} 49a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smithconstexpr int i(int n) { 50a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith thread_local const int m = n; // expected-error {{thread_local variable not permitted in a constexpr function}} 51a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith return m; 52a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith} 53a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith 54a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith// if-statements can be used in constexpr functions. 55a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smithconstexpr int j(int k) { 56a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith if (k == 5) 57a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith return 1; 58a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith if (k == 1) 59a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith return 5; 60a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith else { 61a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith if (int n = 2 * k - 4) { 62a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith return n + 1; 63a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith return 2; 64a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith } 65a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith } 66a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith} // expected-note 2{{control reached end of constexpr function}} 67a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smithstatic_assert(j(0) == -3, ""); 68a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smithstatic_assert(j(1) == 5, ""); 69a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smithstatic_assert(j(2), ""); // expected-error {{constant expression}} expected-note {{in call to 'j(2)'}} 70a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smithstatic_assert(j(3) == 3, ""); 71a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smithstatic_assert(j(4) == 5, ""); 72a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smithstatic_assert(j(5) == 1, ""); 73a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith 74a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith// There can be 0 return-statements. 75a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smithconstexpr void k() { 76a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith} 77a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith 78a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith// If the return type is not 'void', no return statements => never a constant 79a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith// expression, so still diagnose that case. 80a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith[[noreturn]] constexpr int fn() { // expected-error {{no return statement in constexpr function}} 81a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith fn(); 82a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith} 83a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith 84a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith// We evaluate the body of a constexpr constructor, to check for side-effects. 85a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smithstruct U { 86a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith constexpr U(int n) { 87a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith if (j(n)) {} // expected-note {{in call to 'j(2)'}} 88a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith } 89a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith}; 90a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smithconstexpr U u1{1}; 91a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smithconstexpr U u2{2}; // expected-error {{constant expression}} expected-note {{in call to 'U(2)'}} 92a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith 93a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith// We allow expression-statements. 94a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smithconstexpr int l(bool b) { 95a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith if (b) 96a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith throw "invalid value for b!"; // expected-note {{subexpression not valid}} 97a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith return 5; 98a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith} 99a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smithstatic_assert(l(false) == 5, ""); 100a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smithstatic_assert(l(true), ""); // expected-error {{constant expression}} expected-note {{in call to 'l(true)'}} 101a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith 102a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith// Potential constant expression checking is still applied where possible. 103a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smithconstexpr int htonl(int x) { // expected-error {{never produces a constant expression}} 104a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith typedef unsigned char uchar; 105a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith uchar arr[4] = { uchar(x >> 24), uchar(x >> 16), uchar(x >> 8), uchar(x) }; 106a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith return *reinterpret_cast<int*>(arr); // expected-note {{reinterpret_cast is not allowed in a constant expression}} 107a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith} 108a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith 109a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smithconstexpr int maybe_htonl(bool isBigEndian, int x) { 110a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith if (isBigEndian) 111a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith return x; 112a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith 113a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith typedef unsigned char uchar; 114a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith uchar arr[4] = { uchar(x >> 24), uchar(x >> 16), uchar(x >> 8), uchar(x) }; 115a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith return *reinterpret_cast<int*>(arr); // expected-note {{reinterpret_cast is not allowed in a constant expression}} 116a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith} 117a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith 118a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smithconstexpr int swapped = maybe_htonl(false, 123); // expected-error {{constant expression}} expected-note {{in call}} 119a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith 120a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smithnamespace NS { 121a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith constexpr int n = 0; 122a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith} 123a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smithconstexpr int namespace_alias() { 124a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith namespace N = NS; 125a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith return N::n; 126a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith} 127bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith 128bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smithnamespace assign { 129bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith constexpr int a = 0; 130bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith const int b = 0; 1319a9ca98d6463530384aa12685034899c4cc8733dRichard Smith int c = 0; // expected-note {{here}} 132bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith 133bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith constexpr void set(const int &a, int b) { 1349a9ca98d6463530384aa12685034899c4cc8733dRichard Smith const_cast<int&>(a) = b; // expected-note 3{{constant expression cannot modify an object that is visible outside that expression}} 135bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith } 136bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith constexpr int wrap(int a, int b) { 137bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith set(a, b); 138bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith return a; 139bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith } 140bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith 141bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith static_assert((set(a, 1), a) == 1, ""); // expected-error {{constant expression}} expected-note {{in call to 'set(a, 1)'}} 142bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith static_assert((set(b, 1), b) == 1, ""); // expected-error {{constant expression}} expected-note {{in call to 'set(b, 1)'}} 1439a9ca98d6463530384aa12685034899c4cc8733dRichard Smith static_assert((set(c, 1), c) == 1, ""); // expected-error {{constant expression}} expected-note {{in call to 'set(c, 1)'}} 144bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith 145bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith static_assert(wrap(a, 1) == 1, ""); 146bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith static_assert(wrap(b, 1) == 1, ""); 147bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith static_assert(wrap(c, 1) == 1, ""); // expected-error {{constant expression}} expected-note {{read of non-const variable 'c'}} 148bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith} 149bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith 150bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smithnamespace string_assign { 151bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith template<typename T> 152bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith constexpr void swap(T &a, T &b) { 153bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith T tmp = a; 154bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith a = b; 155bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith b = tmp; 156bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith } 157bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith template<typename Iterator> 158bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith constexpr void reverse(Iterator begin, Iterator end) { 159bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith while (begin != end && begin != --end) 160bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith swap(*begin++, *end); 161bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith } 162bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith template<typename Iterator1, typename Iterator2> 163bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith constexpr bool equal(Iterator1 a, Iterator1 ae, Iterator2 b, Iterator2 be) { 164ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith while (a != ae && b != be) 1655528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith if (*a++ != *b++) 166bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith return false; 167bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith return a == ae && b == be; 168bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith } 169bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith constexpr bool test1(int n) { 170bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith char stuff[100] = "foobarfoo"; 171bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith const char stuff2[100] = "oofraboof"; 172bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith reverse(stuff, stuff + n); // expected-note {{cannot refer to element 101 of array of 100 elements}} 173bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith return equal(stuff, stuff + n, stuff2, stuff2 + n); 174bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith } 175bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith static_assert(!test1(1), ""); 176bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith static_assert(test1(3), ""); 177bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith static_assert(!test1(6), ""); 178bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith static_assert(test1(9), ""); 179bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith static_assert(!test1(100), ""); 180bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith static_assert(!test1(101), ""); // expected-error {{constant expression}} expected-note {{in call to 'test1(101)'}} 181bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith 1824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar constexpr void f() { // expected-error{{constexpr function never produces a constant expression}} expected-note@+2{{assignment to dereferenced one-past-the-end pointer is not allowed in a constant expression}} 183bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith char foo[10] = { "z" }; // expected-note {{here}} 1844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar foo[10] = 'x'; // expected-warning {{past the end}} 185bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith } 186bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith} 187bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith 188bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smithnamespace array_resize { 189bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith constexpr int do_stuff(int k1, int k2) { 190bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith int arr[1234] = { 1, 2, 3, 4 }; 191bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith arr[k1] = 5; // expected-note {{past-the-end}} expected-note {{cannot refer to element 1235}} expected-note {{cannot refer to element -1}} 192bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith return arr[k2]; 193bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith } 194bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith static_assert(do_stuff(1, 2) == 3, ""); 195bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith static_assert(do_stuff(0, 0) == 5, ""); 196bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith static_assert(do_stuff(1233, 1233) == 5, ""); 197bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith static_assert(do_stuff(1233, 0) == 1, ""); 198bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith static_assert(do_stuff(1234, 0) == 1, ""); // expected-error {{constant expression}} expected-note {{in call}} 199bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith static_assert(do_stuff(1235, 0) == 1, ""); // expected-error {{constant expression}} expected-note {{in call}} 200bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith static_assert(do_stuff(-1, 0) == 1, ""); // expected-error {{constant expression}} expected-note {{in call}} 201bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith} 202bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith 203bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smithnamespace potential_const_expr { 204bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith constexpr void set(int &n) { n = 1; } 205bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith constexpr int div_zero_1() { int z = 0; set(z); return 100 / z; } // no error 206bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith constexpr int div_zero_2() { // expected-error {{never produces a constant expression}} 207bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith int z = 0; 208bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith return 100 / (set(z), 0); // expected-note {{division by zero}} 209bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith } 210b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith int n; // expected-note {{declared here}} 211b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith constexpr int ref() { // expected-error {{never produces a constant expression}} 212b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith int &r = n; 213b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith return r; // expected-note {{read of non-const variable 'n'}} 214b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith } 215bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith} 216bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith 217bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smithnamespace subobject { 218bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith union A { constexpr A() : y(5) {} int x, y; }; 219bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith struct B { A a; }; 220bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith struct C : B {}; 221bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith union D { constexpr D() : c() {} constexpr D(int n) : n(n) {} C c; int n; }; 222bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith constexpr void f(D &d) { 223bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith d.c.a.y = 3; 224bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith // expected-note@-1 {{cannot modify an object that is visible outside}} 225bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith // expected-note@-2 {{assignment to member 'c' of union with active member 'n'}} 226bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith } 227bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith constexpr bool check(D &d) { return d.c.a.y == 3; } 228bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith 229bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith constexpr bool g() { D d; f(d); return d.c.a.y == 3; } 230bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith static_assert(g(), ""); 231bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith 232bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith D d; 233bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith constexpr bool h() { f(d); return check(d); } // expected-note {{in call}} 234bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith static_assert(h(), ""); // expected-error {{constant expression}} expected-note {{in call}} 235bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith 236bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith constexpr bool i() { D d(0); f(d); return check(d); } // expected-note {{in call}} 237bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith static_assert(i(), ""); // expected-error {{constant expression}} expected-note {{in call}} 238bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith 239bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith constexpr bool j() { D d; d.c.a.x = 3; return check(d); } // expected-note {{assignment to member 'x' of union with active member 'y'}} 240bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith static_assert(j(), ""); // expected-error {{constant expression}} expected-note {{in call}} 241bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith} 242bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith 243bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smithnamespace lifetime { 244bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith constexpr int &&id(int &&n) { return static_cast<int&&>(n); } 245bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith constexpr int &&dead() { return id(0); } // expected-note {{temporary created here}} 246bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith constexpr int bad() { int &&n = dead(); n = 1; return n; } // expected-note {{assignment to temporary whose lifetime has ended}} 247bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith static_assert(bad(), ""); // expected-error {{constant expression}} expected-note {{in call}} 248bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith} 249bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith 250bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smithnamespace const_modify { 2517247c88d1e41514a41085f83ebf03dd5220e054aDavid Blaikie constexpr int modify(int &n) { return n = 1; } // expected-note 2 {{modification of object of const-qualified type 'const int'}} 252bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith constexpr int test1() { int k = 0; return modify(k); } 2537247c88d1e41514a41085f83ebf03dd5220e054aDavid Blaikie constexpr int test2() { const int k = 0; return modify(const_cast<int&>(k)); } // expected-note 2 {{in call}} 254bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith static_assert(test1() == 1, ""); 255bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith static_assert(test2() == 1, ""); // expected-error {{constant expression}} expected-note {{in call}} 2567247c88d1e41514a41085f83ebf03dd5220e054aDavid Blaikie constexpr int i = test2(); // expected-error {{constant expression}} expected-note {{in call}} 257bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith} 258bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith 259bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smithnamespace null { 260bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith constexpr int test(int *p) { 261bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith return *p = 123; // expected-note {{assignment to dereferenced null pointer}} 262bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith } 263bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith static_assert(test(0), ""); // expected-error {{constant expression}} expected-note {{in call}} 264bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith} 2655528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith 2665528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smithnamespace incdec { 2675528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith template<typename T> constexpr T &ref(T &&r) { return r; } 2685528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith template<typename T> constexpr T postinc(T &&r) { return (r++, r); } 2695528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith template<typename T> constexpr T postdec(T &&r) { return (r--, r); } 2705528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith 2715528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith static_assert(++ref(0) == 1, ""); 2725528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith static_assert(ref(0)++ == 0, ""); 2735528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith static_assert(postinc(0) == 1, ""); 2745528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith static_assert(--ref(0) == -1, ""); 2755528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith static_assert(ref(0)-- == 0, ""); 2765528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith static_assert(postdec(0) == -1, ""); 2775528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith 2785528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith constexpr int overflow_int_inc_1 = ref(0x7fffffff)++; // expected-error {{constant}} expected-note {{2147483648}} 2795528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith constexpr int overflow_int_inc_1_ok = ref(0x7ffffffe)++; 2805528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith constexpr int overflow_int_inc_2 = ++ref(0x7fffffff); // expected-error {{constant}} expected-note {{2147483648}} 2815528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith constexpr int overflow_int_inc_2_ok = ++ref(0x7ffffffe); 2825528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith 2835528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith // inc/dec on short can't overflow because we promote to int first 2845528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith static_assert(++ref<short>(0x7fff) == (int)0xffff8000u, ""); 2855528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith static_assert(--ref<short>(0x8000) == 0x7fff, ""); 2865528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith 2875528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith // inc on bool sets to true 2885528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith static_assert(++ref(false), ""); // expected-warning {{deprecated}} 2895528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith static_assert(++ref(true), ""); // expected-warning {{deprecated}} 2905528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith 2915528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith int arr[10]; 2925528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith static_assert(++ref(&arr[0]) == &arr[1], ""); 2935528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith static_assert(++ref(&arr[9]) == &arr[10], ""); 2945528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith static_assert(++ref(&arr[10]) == &arr[11], ""); // expected-error {{constant}} expected-note {{cannot refer to element 11}} 2955528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith static_assert(ref(&arr[0])++ == &arr[0], ""); 2965528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith static_assert(ref(&arr[10])++ == &arr[10], ""); // expected-error {{constant}} expected-note {{cannot refer to element 11}} 2975528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith static_assert(postinc(&arr[0]) == &arr[1], ""); 2985528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith static_assert(--ref(&arr[10]) == &arr[9], ""); 2995528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith static_assert(--ref(&arr[1]) == &arr[0], ""); 3005528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith static_assert(--ref(&arr[0]) != &arr[0], ""); // expected-error {{constant}} expected-note {{cannot refer to element -1}} 3015528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith static_assert(ref(&arr[1])-- == &arr[1], ""); 3025528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith static_assert(ref(&arr[0])-- == &arr[0], ""); // expected-error {{constant}} expected-note {{cannot refer to element -1}} 3035528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith static_assert(postdec(&arr[1]) == &arr[0], ""); 3045528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith 3055528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith int x; 3065528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith static_assert(++ref(&x) == &x + 1, ""); 3075528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith 3085528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith static_assert(++ref(0.0) == 1.0, ""); 3095528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith static_assert(ref(0.0)++ == 0.0, ""); 3105528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith static_assert(postinc(0.0) == 1.0, ""); 3115528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith static_assert(--ref(0.0) == -1.0, ""); 3125528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith static_assert(ref(0.0)-- == 0.0, ""); 3135528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith static_assert(postdec(0.0) == -1.0, ""); 3145528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith 3155528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith static_assert(++ref(1e100) == 1e100, ""); 3165528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith static_assert(--ref(1e100) == 1e100, ""); 3175528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith 3185528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith union U { 3195528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith int a, b; 3205528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith }; 3215528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith constexpr int f(U u) { 3225528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith return ++u.b; // expected-note {{increment of member 'b' of union with active member 'a'}} 3235528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith } 3245528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith constexpr int wrong_member = f({0}); // expected-error {{constant}} expected-note {{in call to 'f({.a = 0})'}} 3255528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith constexpr int vol = --ref<volatile int>(0); // expected-error {{constant}} expected-note {{decrement of volatile-qualified}} 3265528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith 3275528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith constexpr int incr(int k) { 3285528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith int x = k; 3295528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith if (x++ == 100) 3305528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith return x; 3315528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith return incr(x); 3325528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith } 3335528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith static_assert(incr(0) == 101, ""); 3345528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith} 335ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith 336d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smithnamespace compound_assign { 337d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith constexpr bool test_int() { 338d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith int a = 3; 339d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith a += 6; 340a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith if (a != 9) return false; 341d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith a -= 2; 342a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith if (a != 7) return false; 343d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith a *= 3; 344a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith if (a != 21) return false; 345a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith if (&(a /= 10) != &a) return false; 346a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith if (a != 2) return false; 347d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith a <<= 3; 348a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith if (a != 16) return false; 349d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith a %= 6; 350a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith if (a != 4) return false; 351d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith a >>= 1; 352a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith if (a != 2) return false; 353d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith a ^= 10; 354a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith if (a != 8) return false; 355d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith a |= 5; 356a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith if (a != 13) return false; 357d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith a &= 14; 358a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith if (a != 12) return false; 359d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith return true; 360d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith } 361d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith static_assert(test_int(), ""); 362d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith 363a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith constexpr bool test_float() { 364a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith float f = 123.; 365a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith f *= 2; 366a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith if (f != 246.) return false; 367a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith if ((f -= 0.5) != 245.5) return false; 368a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith if (f != 245.5) return false; 369a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith f /= 0.5; 370a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith if (f != 491.) return false; 371a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith f += -40; 372a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith if (f != 451.) return false; 373a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith return true; 374a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith } 375a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith static_assert(test_float(), ""); 376a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith 377a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith constexpr bool test_ptr() { 378a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith int arr[123] = {}; 379a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith int *p = arr; 380a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith if ((p += 4) != &arr[4]) return false; 381a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith if (p != &arr[4]) return false; 382a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith p += -1; 383a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith if (p != &arr[3]) return false; 384a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith if ((p -= -10) != &arr[13]) return false; 385a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith if (p != &arr[13]) return false; 386a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith p -= 11; 387a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith if (p != &arr[2]) return false; 388a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith return true; 389a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith } 390a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith static_assert(test_ptr(), ""); 391a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith 392d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith template<typename T> 393d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith constexpr bool test_overflow() { 394d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith T a = 1; 395a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith while (a != a / 2) 396a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith a *= 2; // expected-note {{value 2147483648 is outside the range}} expected-note {{ 9223372036854775808 }} expected-note {{floating point arithmetic produces an infinity}} 397d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith return true; 398d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith } 399d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith 400d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith static_assert(test_overflow<int>(), ""); // expected-error {{constant}} expected-note {{call}} 401d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith static_assert(test_overflow<unsigned>(), ""); // ok, unsigned overflow is defined 402d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith static_assert(test_overflow<short>(), ""); // ok, short is promoted to int before multiplication 403d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith static_assert(test_overflow<unsigned short>(), ""); // ok 404d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith static_assert(test_overflow<unsigned long long>(), ""); // ok 405d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith static_assert(test_overflow<long long>(), ""); // expected-error {{constant}} expected-note {{call}} 406a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith static_assert(test_overflow<float>(), ""); // expected-error {{constant}} expected-note {{call}} 407d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith 408d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith constexpr short test_promotion(short k) { 409d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith short s = k; 410d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith s *= s; 411d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith return s; 412d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith } 413d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith static_assert(test_promotion(100) == 10000, ""); 414d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith static_assert(test_promotion(200) == -25536, ""); 415d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith static_assert(test_promotion(256) == 0, ""); 416a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith 417a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith constexpr const char *test_bounds(const char *p, int o) { 418a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith return p += o; // expected-note {{element 5 of}} expected-note {{element -1 of}} expected-note {{element 1000 of}} 419a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith } 420a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith static_assert(test_bounds("foo", 0)[0] == 'f', ""); 421a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith static_assert(test_bounds("foo", 3)[0] == 0, ""); 422a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith static_assert(test_bounds("foo", 4)[-3] == 'o', ""); 423a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith static_assert(test_bounds("foo" + 4, -4)[0] == 'f', ""); 424a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith static_assert(test_bounds("foo", 5) != 0, ""); // expected-error {{constant}} expected-note {{call}} 425a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith static_assert(test_bounds("foo", -1) != 0, ""); // expected-error {{constant}} expected-note {{call}} 426a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith static_assert(test_bounds("foo", 1000) != 0, ""); // expected-error {{constant}} expected-note {{call}} 427d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith} 428d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith 429ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smithnamespace loops { 430ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith constexpr int fib_loop(int a) { 431ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith int f_k = 0, f_k_plus_one = 1; 432ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith for (int k = 1; k != a; ++k) { 433ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith int f_k_plus_two = f_k + f_k_plus_one; 434ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith f_k = f_k_plus_one; 435ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith f_k_plus_one = f_k_plus_two; 436ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith } 437ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith return f_k_plus_one; 438ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith } 439ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith static_assert(fib_loop(46) == 1836311903, ""); 440ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith 441ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith constexpr bool breaks_work() { 442ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith int a = 0; 443ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith for (int n = 0; n != 100; ++n) { 444ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith ++a; 445ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith if (a == 5) continue; 446ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith if ((a % 5) == 0) break; 447ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith } 448ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith 449ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith int b = 0; 450ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith while (b != 17) { 451ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith ++b; 452ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith if (b == 6) continue; 453ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith if ((b % 6) == 0) break; 454ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith } 455ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith 456ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith int c = 0; 457ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith do { 458ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith ++c; 459ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith if (c == 7) continue; 460ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith if ((c % 7) == 0) break; 461ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith } while (c != 21); 462ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith 46387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return a == 10 && b == 12 && c == 14; 464ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith } 465ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith static_assert(breaks_work(), ""); 466ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith 467ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith void not_constexpr(); 468ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith constexpr bool no_cont_after_break() { 469ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith for (;;) { 470ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith break; 471ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith not_constexpr(); 472ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith } 473ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith while (true) { 474ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith break; 475ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith not_constexpr(); 476ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith } 477ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith do { 478ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith break; 479ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith not_constexpr(); 480ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith } while (true); 481ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith return true; 482ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith } 483ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith static_assert(no_cont_after_break(), ""); 484ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith 485ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith constexpr bool cond() { 486ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith for (int a = 1; bool b = a != 3; ++a) { 487ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith if (!b) 488ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith return false; 489ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith } 490ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith while (bool b = true) { 491ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith b = false; 492ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith break; 493ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith } 494ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith return true; 495ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith } 496ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith static_assert(cond(), ""); 497692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith 498692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith constexpr int range_for() { 499692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith int arr[] = { 1, 2, 3, 4, 5 }; 500692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith int sum = 0; 501692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith for (int x : arr) 502d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith sum += x; 503692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith return sum; 504692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith } 505692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith static_assert(range_for() == 15, ""); 506692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith 507692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith template<int...N> struct ints {}; 508692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith template<typename A, typename B> struct join_ints; 509692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith template<int...As, int...Bs> struct join_ints<ints<As...>, ints<Bs...>> { 510692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith using type = ints<As..., sizeof...(As) + Bs...>; 511692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith }; 512692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith template<unsigned N> struct make_ints { 513692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith using type = typename join_ints<typename make_ints<N/2>::type, typename make_ints<(N+1)/2>::type>::type; 514692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith }; 515692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith template<> struct make_ints<0> { using type = ints<>; }; 516692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith template<> struct make_ints<1> { using type = ints<0>; }; 517692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith 518692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith struct ignore { template<typename ...Ts> constexpr ignore(Ts &&...) {} }; 519692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith 520692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith template<typename T, unsigned N> struct array { 521692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith constexpr array() : arr{} {} 522692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith template<typename ...X> 523692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith constexpr array(X ...x) : arr{} { 524692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith init(typename make_ints<sizeof...(X)>::type{}, x...); 525692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith } 526692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith template<int ...I, typename ...X> constexpr void init(ints<I...>, X ...x) { 527692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith ignore{arr[I] = x ...}; 528692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith } 529692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith T arr[N]; 530692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith struct iterator { 531692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith T *p; 532692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith constexpr explicit iterator(T *p) : p(p) {} 533692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith constexpr bool operator!=(iterator o) { return p != o.p; } 534692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith constexpr iterator &operator++() { ++p; return *this; } 535692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith constexpr T &operator*() { return *p; } 536692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith }; 537692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith constexpr iterator begin() { return iterator(arr); } 538692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith constexpr iterator end() { return iterator(arr + N); } 539692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith }; 540692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith 541692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith constexpr int range_for_2() { 542692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith array<int, 5> arr { 1, 2, 3, 4, 5 }; 543692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith int sum = 0; 544692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith for (int k : arr) { 545d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith sum += k; 546692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith if (sum > 8) break; 547692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith } 548692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith return sum; 549692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith } 550692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith static_assert(range_for_2() == 10, ""); 551ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith} 552a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith 553d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smithnamespace assignment_op { 554a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith struct A { 555a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith constexpr A() : n(5) {} 556a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith int n; 557a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith struct B { 558a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith int k = 1; 559a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith union U { 560a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith constexpr U() : y(4) {} 561a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith int x; 562a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith int y; 563a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith } u; 564a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith } b; 565a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith }; 566a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith constexpr bool testA() { 567a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith A a, b; 568a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith a.n = 7; 569a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith a.b.u.y = 5; 570a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith b = a; 571a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith return b.n == 7 && b.b.u.y == 5 && b.b.k == 1; 572a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith } 573a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith static_assert(testA(), ""); 574a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith 575a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith struct B { 576a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith bool assigned = false; 577a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith constexpr B &operator=(const B&) { 578a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith assigned = true; 579a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith return *this; 580a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith } 581a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith }; 582a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith struct C : B { 583a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith B b; 584a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith int n = 5; 585a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith }; 586a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith constexpr bool testC() { 587a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith C c, d; 588a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith c.n = 7; 589a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith d = c; 590a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith c.n = 3; 591a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith return d.n == 7 && d.assigned && d.b.assigned; 592a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith } 593a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith static_assert(testC(), ""); 594a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith} 595284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith 596284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smithnamespace switch_stmt { 597284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith constexpr int f(char k) { 598284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith bool b = false; 599284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith int z = 6; 600284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith switch (k) { 601284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith return -1; 602284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith case 0: 603284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith if (false) { 604284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith case 1: 605284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith z = 1; 606284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith for (; b;) { 607284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith return 5; 608284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith while (0) 609284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith case 2: return 2; 610284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith case 7: z = 7; 611284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith do case 6: { 612284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith return z; 613284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith if (false) 614284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith case 3: return 3; 615284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith case 4: z = 4; 616284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith } while (1); 617284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith case 5: b = true; 618284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith case 9: z = 9; 619284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith } 620284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith return z; 621284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith } else if (false) case 8: z = 8; 622284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith else if (false) { 623284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith case 10: 624284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith z = -10; 625284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith break; 626284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith } 627284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith else z = 0; 628284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith return z; 629284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith default: 630284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith return -1; 631284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith } 632284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith return -z; 633284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith } 634284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith static_assert(f(0) == 0, ""); 635284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith static_assert(f(1) == 1, ""); 636284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith static_assert(f(2) == 2, ""); 637284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith static_assert(f(3) == 3, ""); 638284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith static_assert(f(4) == 4, ""); 639284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith static_assert(f(5) == 5, ""); 640284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith static_assert(f(6) == 6, ""); 641284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith static_assert(f(7) == 7, ""); 642284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith static_assert(f(8) == 8, ""); 643284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith static_assert(f(9) == 9, ""); 644284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith static_assert(f(10) == 10, ""); 645284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith 646284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith // Check that we can continue an outer loop from within a switch. 647284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith constexpr bool contin() { 648284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith for (int n = 0; n != 10; ++n) { 649284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith switch (n) { 650284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith case 0: 651284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith ++n; 652284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith continue; 653284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith case 1: 654284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith return false; 655284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith case 2: 656284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith return true; 657284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith } 658284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith } 659284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith return false; 660284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith } 661284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith static_assert(contin(), ""); 662284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith 663284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith constexpr bool switch_into_for() { 664284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith int n = 0; 665284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith switch (n) { 666284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith for (; n == 1; ++n) { 667284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith return n == 1; 668284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith case 0: ; 669284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith } 670284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith } 671284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith return false; 672284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith } 673284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith static_assert(switch_into_for(), ""); 674284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith 675284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith constexpr void duff_copy(char *a, const char *b, int n) { 676284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith switch ((n - 1) % 8 + 1) { 677284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith for ( ; n; n = (n - 1) & ~7) { 678284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith case 8: a[n-8] = b[n-8]; 679284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith case 7: a[n-7] = b[n-7]; 680284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith case 6: a[n-6] = b[n-6]; 681284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith case 5: a[n-5] = b[n-5]; 682284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith case 4: a[n-4] = b[n-4]; 683284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith case 3: a[n-3] = b[n-3]; 684284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith case 2: a[n-2] = b[n-2]; 685284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith case 1: a[n-1] = b[n-1]; 686284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith } 687284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith case 0: ; 688284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith } 689284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith } 690284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith 691284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith constexpr bool test_copy(const char *str, int n) { 692284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith char buffer[16] = {}; 693284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith duff_copy(buffer, str, n); 694284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith for (int i = 0; i != sizeof(buffer); ++i) 695284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith if (buffer[i] != (i < n ? str[i] : 0)) 696284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith return false; 697284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith return true; 698284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith } 699284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith static_assert(test_copy("foo", 0), ""); 700284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith static_assert(test_copy("foo", 1), ""); 701284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith static_assert(test_copy("foo", 2), ""); 702284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith static_assert(test_copy("hello world", 0), ""); 703284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith static_assert(test_copy("hello world", 7), ""); 704284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith static_assert(test_copy("hello world", 8), ""); 705284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith static_assert(test_copy("hello world", 9), ""); 706284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith static_assert(test_copy("hello world", 10), ""); 707284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith static_assert(test_copy("hello world", 10), ""); 708284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith} 709bdaeaed3e3293f1915cdf336f406d4d391331039Richard Smith 710bdaeaed3e3293f1915cdf336f406d4d391331039Richard Smithnamespace deduced_return_type { 711bdaeaed3e3293f1915cdf336f406d4d391331039Richard Smith constexpr auto f() { return 0; } 712bdaeaed3e3293f1915cdf336f406d4d391331039Richard Smith template<typename T> constexpr auto g(T t) { return t; } 713bdaeaed3e3293f1915cdf336f406d4d391331039Richard Smith static_assert(f() == 0, ""); 714bdaeaed3e3293f1915cdf336f406d4d391331039Richard Smith static_assert(g(true), ""); 715bdaeaed3e3293f1915cdf336f406d4d391331039Richard Smith} 716211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith 717211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smithnamespace modify_temporary_during_construction { 718211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith struct A { int &&temporary; int x; int y; }; 719211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith constexpr int f(int &r) { r *= 9; return r - 12; } 720176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines constexpr A a = { 6, f(a.temporary), a.temporary }; // expected-note {{temporary created here}} 721211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith static_assert(a.x == 42, ""); 722211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith static_assert(a.y == 54, ""); 723211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith constexpr int k = a.temporary++; // expected-error {{constant expression}} expected-note {{outside the expression that created the temporary}} 724211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith} 7257c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 7267c3e615f01e8f9f587315800fdaf2305ed824568Richard Smithnamespace std { 7277c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith typedef decltype(sizeof(int)) size_t; 7287c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 7297c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith template <class _E> 7307c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith class initializer_list 7317c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith { 7327c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith const _E* __begin_; 7337c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith size_t __size_; 7347c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 7357c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith constexpr initializer_list(const _E* __b, size_t __s) 7367c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith : __begin_(__b), 7377c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith __size_(__s) 7387c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith {} 7397c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 7407c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith public: 7417c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith typedef _E value_type; 7427c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith typedef const _E& reference; 7437c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith typedef const _E& const_reference; 7447c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith typedef size_t size_type; 7457c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 7467c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith typedef const _E* iterator; 7477c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith typedef const _E* const_iterator; 7487c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 7497c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith constexpr initializer_list() : __begin_(nullptr), __size_(0) {} 7507c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 7517c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith constexpr size_t size() const {return __size_;} 7527c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith constexpr const _E* begin() const {return __begin_;} 7537c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith constexpr const _E* end() const {return __begin_ + __size_;} 7547c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith }; 7557c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith} 7567c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 7577c3e615f01e8f9f587315800fdaf2305ed824568Richard Smithnamespace InitializerList { 7587c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith constexpr int sum(std::initializer_list<int> ints) { 7597c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith int total = 0; 7607c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith for (int n : ints) total += n; 7617c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith return total; 7627c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith } 7637c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith static_assert(sum({1, 2, 3, 4, 5}) == 15, ""); 7647c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith} 76537a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith 76637a84f653c196aa0b73fad96707175a62dcb6a12Richard Smithnamespace StmtExpr { 76737a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith constexpr int f(int k) { 76837a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith switch (k) { 76937a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith case 0: 77037a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith return 0; 77137a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith 77237a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith ({ 77337a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith case 1: // expected-note {{not supported}} 77437a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith return 1; 77537a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith }); 77637a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith } 77737a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith } 77837a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith static_assert(f(1) == 1, ""); // expected-error {{constant expression}} expected-note {{in call}} 77937a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith 78037a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith constexpr int g() { // expected-error {{never produces a constant}} 78137a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith return ({ int n; n; }); // expected-note {{object of type 'int' is not initialized}} 78237a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith } 78337a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith 78437a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith // FIXME: We should handle the void statement expression case. 78537a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith constexpr int h() { // expected-error {{never produces a constant}} 78637a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith ({ if (true) {} }); // expected-note {{not supported}} 78737a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith return 0; 78837a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith } 78937a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith} 790db2fe739e5aac227d85d149efc9036696997a26fRichard Smith 791db2fe739e5aac227d85d149efc9036696997a26fRichard Smithnamespace VirtualFromBase { 792db2fe739e5aac227d85d149efc9036696997a26fRichard Smith struct S1 { 793db2fe739e5aac227d85d149efc9036696997a26fRichard Smith virtual int f() const; 794db2fe739e5aac227d85d149efc9036696997a26fRichard Smith }; 795db2fe739e5aac227d85d149efc9036696997a26fRichard Smith struct S2 { 796db2fe739e5aac227d85d149efc9036696997a26fRichard Smith virtual int f(); 797db2fe739e5aac227d85d149efc9036696997a26fRichard Smith }; 798db2fe739e5aac227d85d149efc9036696997a26fRichard Smith template <typename T> struct X : T { 799db2fe739e5aac227d85d149efc9036696997a26fRichard Smith constexpr X() {} 800db2fe739e5aac227d85d149efc9036696997a26fRichard Smith double d = 0.0; 801db2fe739e5aac227d85d149efc9036696997a26fRichard Smith constexpr int f() { return sizeof(T); } 802db2fe739e5aac227d85d149efc9036696997a26fRichard Smith }; 803db2fe739e5aac227d85d149efc9036696997a26fRichard Smith 804db2fe739e5aac227d85d149efc9036696997a26fRichard Smith // Non-virtual f(), OK. 805db2fe739e5aac227d85d149efc9036696997a26fRichard Smith constexpr X<X<S1>> xxs1; 806db2fe739e5aac227d85d149efc9036696997a26fRichard Smith constexpr X<S1> *p = const_cast<X<X<S1>>*>(&xxs1); 807db2fe739e5aac227d85d149efc9036696997a26fRichard Smith static_assert(p->f() == sizeof(S1), ""); 808db2fe739e5aac227d85d149efc9036696997a26fRichard Smith 809db2fe739e5aac227d85d149efc9036696997a26fRichard Smith // Virtual f(), not OK. 810db2fe739e5aac227d85d149efc9036696997a26fRichard Smith constexpr X<X<S2>> xxs2; 811db2fe739e5aac227d85d149efc9036696997a26fRichard Smith constexpr X<S2> *q = const_cast<X<X<S2>>*>(&xxs2); 812db2fe739e5aac227d85d149efc9036696997a26fRichard Smith static_assert(q->f() == sizeof(X<S2>), ""); // expected-error {{constant expression}} expected-note {{virtual function call}} 813db2fe739e5aac227d85d149efc9036696997a26fRichard Smith} 81403ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith 81503ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smithnamespace Lifetime { 81603ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith constexpr int &get(int &&r) { return r; } 81703ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith constexpr int f() { 81803ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith int &r = get(123); 81903ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith return r; // expected-note {{read of object outside its lifetime}} 82003ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith } 82103ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith static_assert(f() == 123, ""); // expected-error {{constant expression}} expected-note {{in call}} 82203ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith 82303ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith constexpr int g() { 82403ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith int *p = 0; 82503ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith { 82603ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith int n = 0; 82703ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith p = &n; 82803ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith n = 42; 82903ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith } 83003ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith *p = 123; // expected-note {{assignment to object outside its lifetime}} 83103ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith return *p; 83203ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith } 83303ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith static_assert(g() == 42, ""); // expected-error {{constant expression}} expected-note {{in call}} 83403ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith 83503ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith constexpr int h(int n) { 83603ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith int *p[4] = {}; 83703ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith int &&r = 1; 83803ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith p[0] = &r; 83903ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith while (int a = 1) { 84003ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith p[1] = &a; 84103ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith for (int b = 1; int c = 1; ) { 84203ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith p[2] = &b, p[3] = &c; 84303ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith break; 84403ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith } 84503ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith break; 84603ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith } 84703ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith *p[n] = 0; // expected-note 3{{assignment to object outside its lifetime}} 84803ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith return *p[n]; 84903ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith } 85003ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith static_assert(h(0) == 0, ""); // ok, lifetime-extended 85103ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith static_assert(h(1) == 0, ""); // expected-error {{constant expression}} expected-note {{in call}} 85203ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith static_assert(h(2) == 0, ""); // expected-error {{constant expression}} expected-note {{in call}} 85303ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith static_assert(h(3) == 0, ""); // expected-error {{constant expression}} expected-note {{in call}} 85403ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith 85503ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith // FIXME: This function should be treated as non-constant. 85603ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith constexpr void lifetime_versus_loops() { 85703ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith int *p = 0; 85803ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith for (int i = 0; i != 2; ++i) { 85903ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith int *q = p; 86003ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith int n = 0; 86103ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith p = &n; 86203ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith if (i) 86303ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith // This modifies the 'n' from the previous iteration of the loop outside 86403ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith // its lifetime. 86503ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith ++*q; 86603ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith } 86703ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith } 86803ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith static_assert((lifetime_versus_loops(), true), ""); 86903ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith} 8703835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith 8713835a4ef050da466038844274d79f1fc9d77c0f1Richard Smithnamespace Bitfields { 8723835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith struct A { 87387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar bool b : 1; 8743835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith int n : 4; 8753835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith unsigned u : 5; 8763835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith }; 8773835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith constexpr bool test() { 8783835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith A a {}; 8793835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith a.b += 2; 8803835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith --a.n; 8813835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith --a.u; 8823835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith a.n = -a.n * 3; 8833835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith return a.b == false && a.n == 3 && a.u == 31; 8843835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith } 8853835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith static_assert(test(), ""); 8863835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith} 8879aebdc94d819e8a537030efc70567d585382ecf9Richard Smith 8889aebdc94d819e8a537030efc70567d585382ecf9Richard Smithnamespace PR17615 { 8899aebdc94d819e8a537030efc70567d585382ecf9Richard Smith struct A { 8909aebdc94d819e8a537030efc70567d585382ecf9Richard Smith int &&r; 8919aebdc94d819e8a537030efc70567d585382ecf9Richard Smith constexpr A(int &&r) : r(static_cast<int &&>(r)) {} 8929aebdc94d819e8a537030efc70567d585382ecf9Richard Smith constexpr A() : A(0) { 8939aebdc94d819e8a537030efc70567d585382ecf9Richard Smith (void)+r; // expected-note {{outside its lifetime}} 8949aebdc94d819e8a537030efc70567d585382ecf9Richard Smith } 8959aebdc94d819e8a537030efc70567d585382ecf9Richard Smith }; 8969aebdc94d819e8a537030efc70567d585382ecf9Richard Smith constexpr int k = A().r; // expected-error {{constant expression}} expected-note {{in call to}} 8979aebdc94d819e8a537030efc70567d585382ecf9Richard Smith} 898f72bc468e54819393c1805f19cbf353061b4c0ecRichard Smith 899f72bc468e54819393c1805f19cbf353061b4c0ecRichard Smithnamespace PR17331 { 900f72bc468e54819393c1805f19cbf353061b4c0ecRichard Smith template<typename T, unsigned int N> 901f72bc468e54819393c1805f19cbf353061b4c0ecRichard Smith constexpr T sum(const T (&arr)[N]) { 902f72bc468e54819393c1805f19cbf353061b4c0ecRichard Smith T result = 0; 903f72bc468e54819393c1805f19cbf353061b4c0ecRichard Smith for (T i : arr) 904f72bc468e54819393c1805f19cbf353061b4c0ecRichard Smith result += i; 905f72bc468e54819393c1805f19cbf353061b4c0ecRichard Smith return result; 906f72bc468e54819393c1805f19cbf353061b4c0ecRichard Smith } 907f72bc468e54819393c1805f19cbf353061b4c0ecRichard Smith 908f72bc468e54819393c1805f19cbf353061b4c0ecRichard Smith constexpr int ARR[] = { 1, 2, 3, 4, 5 }; 909f72bc468e54819393c1805f19cbf353061b4c0ecRichard Smith static_assert(sum(ARR) == 15, ""); 910f72bc468e54819393c1805f19cbf353061b4c0ecRichard Smith} 911176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 912176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace EmptyClass { 913176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines struct E1 {} e1; 914176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines union E2 {} e2; // expected-note 4{{here}} 915176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines struct E3 : E1 {} e3; 916176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 917176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines template<typename E> 918176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines constexpr int f(E &a, int kind) { 919176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines switch (kind) { 920176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case 0: { E e(a); return 0; } // expected-note {{read}} expected-note {{in call}} 921176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case 1: { E e(static_cast<E&&>(a)); return 0; } // expected-note {{read}} expected-note {{in call}} 922176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case 2: { E e; e = a; return 0; } // expected-note {{read}} expected-note {{in call}} 923176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case 3: { E e; e = static_cast<E&&>(a); return 0; } // expected-note {{read}} expected-note {{in call}} 924176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 925176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 926176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines constexpr int test1 = f(e1, 0); 927176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines constexpr int test2 = f(e2, 0); // expected-error {{constant expression}} expected-note {{in call}} 928176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines constexpr int test3 = f(e3, 0); 929176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines constexpr int test4 = f(e1, 1); 930176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines constexpr int test5 = f(e2, 1); // expected-error {{constant expression}} expected-note {{in call}} 931176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines constexpr int test6 = f(e3, 1); 932176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines constexpr int test7 = f(e1, 2); 933176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines constexpr int test8 = f(e2, 2); // expected-error {{constant expression}} expected-note {{in call}} 934176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines constexpr int test9 = f(e3, 2); 935176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines constexpr int testa = f(e1, 3); 936176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines constexpr int testb = f(e2, 3); // expected-error {{constant expression}} expected-note {{in call}} 937176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines constexpr int testc = f(e3, 3); 938176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 9394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 9404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarnamespace SpeculativeEvalWrites { 9414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Ensure that we don't try to speculatively evaluate writes. 9424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar constexpr int f() { 9434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar int i = 0; 9444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar int a = 0; 9454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // __builtin_object_size speculatively evaluates its first argument. 9464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar __builtin_object_size((i = 1, &a), 0); 9474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return i; 9484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 9494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 9504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar static_assert(!f(), ""); 9514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 9524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 9534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarnamespace PR27989 { 9544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar constexpr int f(int n) { 9554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar int a = (n = 1, 0); 9564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return n; 9574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 9584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar static_assert(f(0) == 1, ""); 9594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 960