p2-0x.cpp revision 7b48a2986345480241f3b8209f71bb21b0530b4f
1bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner// RUN: %clang_cc1 -fsyntax-only -std=c++11 -pedantic -verify -fcxx-exceptions %s -fconstexpr-depth 128
2ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman
36fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// A conditional-expression is a core constant expression unless it involves one
46fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// of the following as a potentially evaluated subexpression [...]:
57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner
67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// - this (5.1.1 [expr.prim.general]) [Note: when evaluating a constant
7ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman//   expression, function invocation substitution (7.1.5 [dcl.constexpr])
86fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//   replaces each occurrence of this in a constexpr member function with a
9bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner//   pointer to the class object. -end note];
10bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerstruct This {
11bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  int this1 : this1; // expected-error {{undeclared}}
12bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  int this2 : this->this1; // expected-error {{invalid}}
13bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  void this3() {
14bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    int n1[this->this1]; // expected-warning {{variable length array}}
15674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak    int n2[this1]; // expected-warning {{variable length array}}
16674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak    (void)n1, (void)n2;
17bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  }
1843dfffe890f58468e2fe01f312978d7aa5303801Eric Christopher};
19fe854034677f59baca1e38075e71f6efca247a03Chris Lattner
204688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin// - an invocation of a function other than a constexpr constructor for a
2136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//   literal class or a constexpr function [ Note: Overload resolution (13.3)
2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//   is applied as usual - end note ];
23255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruthstruct NonConstexpr1 {
2450bee42b54cd9aec5f49566307df2b0cf23afcf6Craig Topper  static int f() { return 1; } // expected-note {{here}}
251f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer  int n : f(); // expected-error {{constant expression}} expected-note {{non-constexpr function 'f' cannot be used in a constant expression}}
2698a366d547772010e94609e4584489b3e5ce0043Bill Wendling};
27d40e103ea5bca8a223fc8261b3322b9454e9af12Peter Collingbournestruct NonConstexpr2 {
2850bee42b54cd9aec5f49566307df2b0cf23afcf6Craig Topper  constexpr NonConstexpr2(); // expected-note {{here}}
2950bee42b54cd9aec5f49566307df2b0cf23afcf6Craig Topper  int n;
30255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth};
31d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekestruct NonConstexpr3 {
32d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke  NonConstexpr3();
33d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke  int m : NonConstexpr2().n; // expected-error {{constant expression}} expected-note {{undefined constructor 'NonConstexpr2'}}
349d87eb19be82b28d288e38eab3bbe145060a0701Reid Spencer};
35bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerstruct NonConstexpr4 {
3613a3cf192887233fb9452ec5b7f841e4652c33c7Filip Pizlo  NonConstexpr4(); // expected-note {{declared here}}
374c5b23b24f230607fa18a162519875a91a5e89e0Jeffrey Yasskin  int n;
38bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner};
393ddc05bdde6ed65f93340ea467d362e80c0ceb9cChris Lattnerstruct NonConstexpr5 {
40b6c54ed8f50a351989993a5ef88507abc6d63e2dMisha Brukman  int n : NonConstexpr4().n; // expected-error {{constant expression}} expected-note {{non-constexpr constructor 'NonConstexpr4' cannot be used in a constant expression}}
41df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin};
42df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin
43df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin// - an invocation of an undefined constexpr function or an undefined
44bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner//   constexpr constructor;
45df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskinstruct UndefinedConstexpr {
461c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor  constexpr UndefinedConstexpr();
4713a3cf192887233fb9452ec5b7f841e4652c33c7Filip Pizlo  static constexpr int undefinedConstexpr1(); // expected-note {{here}}
489ea47179e647e806a2c67639bfead9d254514e59Dylan Noblesmith  int undefinedConstexpr2 : undefinedConstexpr1(); // expected-error {{constant expression}} expected-note {{undefined function 'undefinedConstexpr1' cannot be used in a constant expression}}
49b6c54ed8f50a351989993a5ef88507abc6d63e2dMisha Brukman};
50bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
5136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// - an invocation of a constexpr function with arguments that, when substituted
5236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//   by function invocation substitution (7.1.5), do not produce a constant
5336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//   expression;
5436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesnamespace NonConstExprReturn {
5536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  static constexpr const int &id_ref(const int &n) {
5648dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar    return n; // expected-note {{reference to temporary cannot be returned from a constexpr function}}
57cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
58ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer  struct NonConstExprFunction {
594c5b23b24f230607fa18a162519875a91a5e89e0Jeffrey Yasskin    int n : id_ref( // expected-error {{constant expression}} expected-note {{in call to 'id_ref(16)'}}
6023e5fcfec4640955fec41dc8348f467adf1a3e56Jeffrey Yasskin        16 // expected-note {{temporary created here}}
6123e5fcfec4640955fec41dc8348f467adf1a3e56Jeffrey Yasskin        );
6223e5fcfec4640955fec41dc8348f467adf1a3e56Jeffrey Yasskin  };
6323e5fcfec4640955fec41dc8348f467adf1a3e56Jeffrey Yasskin  constexpr const int *address_of(const int &a) {
6423e5fcfec4640955fec41dc8348f467adf1a3e56Jeffrey Yasskin    return &a; // expected-note {{pointer to 'n' cannot be returned from a constexpr function}}
6523e5fcfec4640955fec41dc8348f467adf1a3e56Jeffrey Yasskin  }
664c5b23b24f230607fa18a162519875a91a5e89e0Jeffrey Yasskin  constexpr const int *return_param(int n) { // expected-note {{declared here}}
674c5b23b24f230607fa18a162519875a91a5e89e0Jeffrey Yasskin    return address_of(n); // expected-note {{in call to 'address_of(n)'}}
6823e5fcfec4640955fec41dc8348f467adf1a3e56Jeffrey Yasskin  }
6923e5fcfec4640955fec41dc8348f467adf1a3e56Jeffrey Yasskin  struct S {
7023e5fcfec4640955fec41dc8348f467adf1a3e56Jeffrey Yasskin    int n : *return_param(0); // expected-error {{constant expression}} expected-note {{in call to 'return_param(0)'}}
71ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer  };
724c5b23b24f230607fa18a162519875a91a5e89e0Jeffrey Yasskin}
734c5b23b24f230607fa18a162519875a91a5e89e0Jeffrey Yasskin
74c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner// - an invocation of a constexpr constructor with arguments that, when
75c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner//   substituted by function invocation substitution (7.1.5), do not produce all
7623e5fcfec4640955fec41dc8348f467adf1a3e56Jeffrey Yasskin//   constant expressions for the constructor calls and full-expressions in the
77c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner//   mem-initializers (including conversions);
78c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattnernamespace NonConstExprCtor {
79c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner  struct T {
80c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner    constexpr T(const int &r) :
81c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner      r(r) { // expected-note 2{{reference to temporary cannot be used to initialize a member in a constant expression}}
820d5bd59553375dc85ac04c81ef48ef74c9e7193eJeffrey Yasskin    }
83ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer    const int &r;
84ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer  };
8523e5fcfec4640955fec41dc8348f467adf1a3e56Jeffrey Yasskin  constexpr int n = 0;
864c5b23b24f230607fa18a162519875a91a5e89e0Jeffrey Yasskin  constexpr T t1(n); // ok
87cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  constexpr T t2(0); // expected-error {{must be initialized by a constant expression}} expected-note {{temporary created here}} expected-note {{in call to 'T(0)'}}
88ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer
89ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer  struct S {
90ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer    int n : T(4).r; // expected-error {{constant expression}} expected-note {{temporary created here}} expected-note {{in call to 'T(4)'}}
910d5bd59553375dc85ac04c81ef48ef74c9e7193eJeffrey Yasskin  };
92cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines}
93ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer
94ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer// - an invocation of a constexpr function or a constexpr constructor that would
95c89d27a440370455336202b2a8f25eb9c73e67bcJeffrey Yasskin//   exceed the implementation-defined recursion limits (see Annex B);
9648dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbarnamespace RecursionLimits {
9748dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar  constexpr int RecurseForever(int n) {
98c5252da873d547a19069eaf9030fec203f128f66Dmitri Gribenko    return n + RecurseForever(n+1); // expected-note {{constexpr evaluation exceeded maximum depth of 128 calls}} expected-note 9{{in call to 'RecurseForever(}} expected-note {{skipping 118 calls}}
99cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
100ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer  struct AlsoRecurseForever {
101ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer    constexpr AlsoRecurseForever(int n) :
10248dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar      n(AlsoRecurseForever(n+1).n) // expected-note {{constexpr evaluation exceeded maximum depth of 128 calls}} expected-note 9{{in call to 'AlsoRecurseForever(}} expected-note {{skipping 118 calls}}
10348dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar    {}
10448dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar    int n;
105ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer  };
10648dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar  struct S {
10748dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar    int k : RecurseForever(0); // expected-error {{constant expression}} expected-note {{in call to}}
10848dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar    int l : AlsoRecurseForever(0).n; // expected-error {{constant expression}} expected-note {{in call to}}
10948dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar  };
11048dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar}
1114c5b23b24f230607fa18a162519875a91a5e89e0Jeffrey Yasskin
11248dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar// FIXME:
11348dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar// - an operation that would have undefined behavior [Note: including, for
11436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//   example, signed integer overflow (Clause 5 [expr]), certain pointer
11548dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar//   arithmetic (5.7 [expr.add]), division by zero (5.6 [expr.mul]), or certain
11648dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar//   shift operations (5.8 [expr.shift]) -end note];
117dc85724f703bddf6988b6b3f20203beab775f32bJeffrey Yasskinnamespace UndefinedBehavior {
11848dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar  void f(int n) {
11948dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar    switch (n) {
120446531e7bb4355117b070493ca8e81e4b123ef18Evan Cheng    case (int)4.4e9: // expected-error {{constant expression}} expected-note {{value 4.4E+9 is outside the range of representable values of type 'int'}}
12148dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar    case (int)0x80000000u: // ok
12248dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar    case (int)10000000000ll: // expected-note {{here}}
12348dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar    case (unsigned int)10000000000ll: // expected-error {{duplicate case value}}
124e846db667529eeeae531ce3b7382e18888d1eba0Chris Lattner    case (int)(unsigned)(long long)4.4e9: // ok
125d958a5a9feea7239a73c2068f43f237db550f46eChris Lattner    case (int)(float)1e300: // expected-error {{constant expression}} expected-note {{value 1.0E+300 is outside the range of representable values of type 'float'}}
126dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    case (int)((float)1e37 / 1e30): // ok
127dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    case (int)(__fp16)65536: // expected-error {{constant expression}} expected-note {{value 65536 is outside the range of representable values of type 'half'}}
128dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      break;
1294b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner    }
1304b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  }
1311514b5b334c72e1e190fe1ce2bce7bf7d8a91c1aChris Lattner
13248dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar  constexpr int int_min = ~0x7fffffff;
13348dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar  constexpr int minus_int_min = -int_min; // expected-error {{constant expression}} expected-note {{value 2147483648 is outside the range}}
134f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin  constexpr int div0 = 3 / 0; // expected-error {{constant expression}} expected-note {{division by zero}} expected-warning {{undefined}}
135f5b23368d27ef7dd44b2c45b5c08812ac99c7661Jim Grosbach  constexpr int mod0 = 3 % 0; // expected-error {{constant expression}} expected-note {{division by zero}} expected-warning {{undefined}}
13636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  constexpr int int_min_div_minus_1 = int_min / -1; // expected-error {{constant expression}} expected-note {{value 2147483648 is outside the range}}
137f5b23368d27ef7dd44b2c45b5c08812ac99c7661Jim Grosbach  constexpr int int_min_mod_minus_1 = int_min % -1; // expected-error {{constant expression}} expected-note {{value 2147483648 is outside the range}}
13846fa139e26be6ebc00be2fb45820c2560dd22a32Nicolas Geoffray
13948dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar  constexpr int shl_m1 = 0 << -1; // expected-error {{constant expression}} expected-note {{negative shift count -1}} expected-warning {{negative}}
140b6c54ed8f50a351989993a5ef88507abc6d63e2dMisha Brukman  constexpr int shl_0 = 0 << 0; // ok
141765c93cefda367d8e5a8e0afcd610a7e15bbd987Chris Lattner  constexpr int shl_31 = 0 << 31; // ok
1426d135972bf4e7fdc4de6b0538d6a3b91a06e3a5dDaniel Dunbar  constexpr int shl_32 = 0 << 32; // expected-error {{constant expression}} expected-note {{shift count 32 >= width of type 'int' (32}} expected-warning {{>= width of type}}
1436d135972bf4e7fdc4de6b0538d6a3b91a06e3a5dDaniel Dunbar  constexpr int shl_unsigned_negative = unsigned(-3) << 1; // ok
1444688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin  constexpr int shl_unsigned_into_sign = 1u << 31; // ok
1454688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin  constexpr int shl_unsigned_overflow = 1024u << 31; // ok
1464688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin  constexpr int shl_signed_negative = (-3) << 1; // expected-error {{constant expression}} expected-note {{left shift of negative value -3}}
1474688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin  constexpr int shl_signed_ok = 1 << 30; // ok
1484688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin  constexpr int shl_signed_into_sign = 1 << 31; // expected-error {{constant expression}} expected-note {{value 2147483648 is outside the range}}
149c5b28580a94e247300e5d3ccf532e153f2ae6f12Dylan Noblesmith  constexpr int shl_signed_overflow = 1024 << 31; // expected-error {{constant expression}} expected-note {{value 2199023255552 is outside the range}} expected-warning {{requires 43 bits to represent}}
1506d135972bf4e7fdc4de6b0538d6a3b91a06e3a5dDaniel Dunbar  constexpr int shl_signed_ok2 = 1024 << 20; // ok
1516d135972bf4e7fdc4de6b0538d6a3b91a06e3a5dDaniel Dunbar
1526d135972bf4e7fdc4de6b0538d6a3b91a06e3a5dDaniel Dunbar  constexpr int shr_m1 = 0 >> -1; // expected-error {{constant expression}} expected-note {{negative shift count -1}} expected-warning {{negative}}
15313a3cf192887233fb9452ec5b7f841e4652c33c7Filip Pizlo  constexpr int shr_0 = 0 >> 0; // ok
1546d135972bf4e7fdc4de6b0538d6a3b91a06e3a5dDaniel Dunbar  constexpr int shr_31 = 0 >> 31; // ok
155c5b28580a94e247300e5d3ccf532e153f2ae6f12Dylan Noblesmith  constexpr int shr_32 = 0 >> 32; // expected-error {{constant expression}} expected-note {{shift count 32 >= width of type}} expected-warning {{>= width of type}}
156026fa8782cd59f79ac6335e54a0d1cc882a0b626Jim Grosbach
157d958a5a9feea7239a73c2068f43f237db550f46eChris Lattner  struct S {
158d958a5a9feea7239a73c2068f43f237db550f46eChris Lattner    int m;
15948dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar  };
16048dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar  constexpr S s = { 5 }; // expected-note {{declared here}}
16148dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar  constexpr const int *p = &s.m + 1;
162f5b23368d27ef7dd44b2c45b5c08812ac99c7661Jim Grosbach  constexpr const int &f(const int *q) {
163bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    return q[0]; // expected-note {{dereferenced pointer past the end of subobject of 's' is not a constant expression}}
1646169453ba37ac353655f2475f336e66f31276752Andrew Kaylor  }
165765c93cefda367d8e5a8e0afcd610a7e15bbd987Chris Lattner  constexpr int n = (f(p), 0); // expected-error {{constant expression}} expected-note {{in call to 'f(&s.m + 1)'}}
166765c93cefda367d8e5a8e0afcd610a7e15bbd987Chris Lattner  struct T {
16748dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar    int n : f(p); // expected-error {{not an integral constant expression}} expected-note {{read of dereferenced one-past-the-end pointer}}
168ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer  };
169f4cc3096fd893cdef5b5c2664ebff8c13a07ad51Chris Lattner
1709f2f142d255bc96f109dd5c6524a485937b1f3a1Chris Lattner  namespace Ptr {
171f4cc3096fd893cdef5b5c2664ebff8c13a07ad51Chris Lattner    struct A {};
172ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman    struct B : A { int n; };
1739f2f142d255bc96f109dd5c6524a485937b1f3a1Chris Lattner    B a[3][3];
174bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    constexpr B *p = a[0] + 4; // expected-error {{constant expression}} expected-note {{element 4 of array of 3 elements}}
1759f2f142d255bc96f109dd5c6524a485937b1f3a1Chris Lattner    B b = {};
1769f2f142d255bc96f109dd5c6524a485937b1f3a1Chris Lattner    constexpr A *pa = &b + 1; // expected-error {{constant expression}} expected-note {{base class of pointer past the end}}
177f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin    constexpr B *pb = (B*)((A*)&b + 1); // expected-error {{constant expression}} expected-note {{derived class of pointer past the end}}
17848dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar    constexpr const int *pn = &(&b + 1)->n; // expected-error {{constant expression}} expected-note {{field of pointer past the end}}
17948dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar    constexpr B *parr = &a[3][0]; // expected-error {{constant expression}} expected-note {{array element of pointer past the end}}
18048dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar
18148dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar    constexpr A *na = nullptr;
1827a2bdde0a0eebcd2125055e0eacaca040f0b766cChris Lattner    constexpr B *nb = nullptr;
18348dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar    constexpr A &ra = *nb; // expected-error {{constant expression}} expected-note {{cannot access base class of null pointer}}
18448dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar    constexpr B &rb = (B&)*na; // expected-error {{constant expression}} expected-note {{cannot access derived class of null pointer}}
185f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin    static_assert((A*)nb == 0, "");
1869f2f142d255bc96f109dd5c6524a485937b1f3a1Chris Lattner    static_assert((B*)na == 0, "");
187dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    constexpr const int &nf = nb->n; // expected-error {{constant expression}} expected-note {{cannot access field of null pointer}}
18898a366d547772010e94609e4584489b3e5ce0043Bill Wendling    constexpr const int &np = (*(int(*)[4])nullptr)[2]; // expected-error {{constant expression}} expected-note {{cannot access array element of null pointer}}
189026fa8782cd59f79ac6335e54a0d1cc882a0b626Jim Grosbach
190489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin    struct C {
191489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin      constexpr int f() { return 0; }
19234c9433004cabd4760987dce4804a91c84908219Chris Lattner    } constexpr c = C();
19334c9433004cabd4760987dce4804a91c84908219Chris Lattner    constexpr int k1 = c.f(); // ok
194f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin    constexpr int k2 = ((C*)nullptr)->f(); // expected-error {{constant expression}} expected-note {{cannot call member function on null pointer}}
1951d929216916dc992f8643dda971aac58d47c7765Daniel Dunbar    constexpr int k3 = (&c)[1].f(); // expected-error {{constant expression}} expected-note {{cannot call member function on pointer past the end of object}}
1961d929216916dc992f8643dda971aac58d47c7765Daniel Dunbar    C c2;
1971d929216916dc992f8643dda971aac58d47c7765Daniel Dunbar    constexpr int k4 = c2.f(); // ok!
198f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin  }
199dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
200dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  namespace Overflow {
20198a366d547772010e94609e4584489b3e5ce0043Bill Wendling    // Signed int overflow.
202026fa8782cd59f79ac6335e54a0d1cc882a0b626Jim Grosbach    constexpr int n1 = 2 * 3 * 3 * 7 * 11 * 31 * 151 * 331; // ok
20388b5aca20a6dd0a8b15ff620bdee59aae567d245Eric Christopher    constexpr int n2 = 65536 * 32768; // expected-error {{constant expression}} expected-note {{value 2147483648 is outside the range of }}
204439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    constexpr int n3 = n1 + 1; // ok
2053472766f9eb7d66f234c390ce1b3a8b76f0ee9ceDuncan Sands    constexpr int n4 = n3 + 1; // expected-error {{constant expression}} expected-note {{value 2147483648 is outside the range of }}
206026fa8782cd59f79ac6335e54a0d1cc882a0b626Jim Grosbach    constexpr int n5 = -65536 * 32768; // ok
20798a366d547772010e94609e4584489b3e5ce0043Bill Wendling    constexpr int n6 = 3 * -715827883; // expected-error {{constant expression}} expected-note {{value -2147483649 is outside the range of }}
208f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin    constexpr int n7 = -n3 + -1; // ok
209f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin    constexpr int n8 = -1 + n7; // expected-error {{constant expression}} expected-note {{value -2147483649 is outside the range of }}
210f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin    constexpr int n9 = n3 - 0; // ok
211f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin    constexpr int n10 = n3 - -1; // expected-error {{constant expression}} expected-note {{value 2147483648 is outside the range of }}
212f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin    constexpr int n11 = -1 - n3; // ok
2132e40ae4de67ba37d02281d51e7dfd629205e1e30Chris Lattner    constexpr int n12 = -2 - n3; // expected-error {{constant expression}} expected-note {{value -2147483649 is outside the range of }}
214f5b23368d27ef7dd44b2c45b5c08812ac99c7661Jim Grosbach    constexpr int n13 = n5 + n5; // expected-error {{constant expression}} expected-note {{value -4294967296 is outside the range of }}
21536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    constexpr int n14 = n3 - n5; // expected-error {{constant expression}} expected-note {{value 4294967295 is outside the range of }}
21636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    constexpr int n15 = n5 * n5; // expected-error {{constant expression}} expected-note {{value 4611686018427387904 is outside the range of }}
21736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    constexpr signed char c1 = 100 * 2; // ok
21836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    constexpr signed char c2 = '\x64' * '\2'; // also ok
21936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    constexpr long long ll1 = 0x7fffffffffffffff; // ok
22036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    constexpr long long ll2 = ll1 + 1; // expected-error {{constant}} expected-note {{ 9223372036854775808 }}
22136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    constexpr long long ll3 = -ll1 - 1; // ok
22236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    constexpr long long ll4 = ll3 - 1; // expected-error {{constant}} expected-note {{ -9223372036854775809 }}
22336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    constexpr long long ll5 = ll3 * ll3; // expected-error {{constant}} expected-note {{ 85070591730234615865843651857942052864 }}
22436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
225dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    // Unsigned int overflow.
22636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    static_assert(65536u * 65536u == 0u, ""); // ok
22736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    static_assert(4294967295u + 1u == 0u, ""); // ok
22836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    static_assert(0u - 1u == 4294967295u, ""); // ok
22936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    static_assert(~0u * ~0u == 1u, ""); // ok
23036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
23136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // Floating-point overflow and NaN.
23236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    constexpr float f1 = 1e38f * 3.4028f; // ok
23336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    constexpr float f2 = 1e38f * 3.4029f; // expected-error {{constant expression}} expected-note {{floating point arithmetic produces an infinity}}
23436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    constexpr float f3 = 1e38f / -.2939f; // ok
23536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    constexpr float f4 = 1e38f / -.2938f; // expected-error {{constant expression}} expected-note {{floating point arithmetic produces an infinity}}
23636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    constexpr float f5 = 2e38f + 2e38f; // expected-error {{constant expression}} expected-note {{floating point arithmetic produces an infinity}}
23736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    constexpr float f6 = -2e38f - 2e38f; // expected-error {{constant expression}} expected-note {{floating point arithmetic produces an infinity}}
23836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    constexpr float f7 = 0.f / 0.f; // expected-error {{constant expression}} expected-note {{floating point arithmetic produces a NaN}}
23948dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar  }
2409f2f142d255bc96f109dd5c6524a485937b1f3a1Chris Lattner}
24136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
2429f2f142d255bc96f109dd5c6524a485937b1f3a1Chris Lattner// - a lambda-expression (5.1.2);
243f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskinstruct Lambda {
244f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin  // FIXME: clang crashes when trying to parse this! Revisit this check once
245f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin  // lambdas are fully implemented.
24660789e419e04c260e36af9a1add5ad316313e490Nate Begeman  //int n : []{ return 1; }();
247fe854034677f59baca1e38075e71f6efca247a03Chris Lattner};
248fe854034677f59baca1e38075e71f6efca247a03Chris Lattner
249fe854034677f59baca1e38075e71f6efca247a03Chris Lattner// - an lvalue-to-rvalue conversion (4.1) unless it is applied to
2502ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylornamespace LValueToRValue {
251f5b23368d27ef7dd44b2c45b5c08812ac99c7661Jim Grosbach  // - a non-volatile glvalue of integral or enumeration type that refers to a
252ff65e36be0f4fbe776ee6bb39b7ab14ebe3895ebChris Lattner  //   non-volatile const object with a preceding initialization, initialized
253ff65e36be0f4fbe776ee6bb39b7ab14ebe3895ebChris Lattner  //   with a constant expression  [Note: a string literal (2.14.5 [lex.string])
254ff65e36be0f4fbe776ee6bb39b7ab14ebe3895ebChris Lattner  //   corresponds to an array of such objects. -end note], or
255ff65e36be0f4fbe776ee6bb39b7ab14ebe3895ebChris Lattner  volatile const int vi = 1; // expected-note {{here}}
256ff65e36be0f4fbe776ee6bb39b7ab14ebe3895ebChris Lattner  const int ci = 1;
25745a93d6eb4c55876e94f91b471657f23fe2149aaDanil Malyshev  volatile const int &vrci = ci;
25845a93d6eb4c55876e94f91b471657f23fe2149aaDanil Malyshev  static_assert(vi, ""); // expected-error {{constant expression}} expected-note {{read of volatile-qualified type 'const volatile int'}}
25945a93d6eb4c55876e94f91b471657f23fe2149aaDanil Malyshev  static_assert(const_cast<int&>(vi), ""); // expected-error {{constant expression}} expected-note {{read of volatile object 'vi'}}
26045a93d6eb4c55876e94f91b471657f23fe2149aaDanil Malyshev  static_assert(vrci, ""); // expected-error {{constant expression}} expected-note {{read of volatile-qualified type}}
26145a93d6eb4c55876e94f91b471657f23fe2149aaDanil Malyshev
26245a93d6eb4c55876e94f91b471657f23fe2149aaDanil Malyshev  // - a non-volatile glvalue of literal type that refers to a non-volatile
26345a93d6eb4c55876e94f91b471657f23fe2149aaDanil Malyshev  //   object defined with constexpr, or that refers to a sub-object of such an
26445a93d6eb4c55876e94f91b471657f23fe2149aaDanil Malyshev  //   object, or
2658e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  struct S {
2668e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    constexpr S(int=0) : i(1), v(1) {}
26736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    constexpr S(const S &s) : i(2), v(2) {}
2682ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor    int i;
2692ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor    volatile int v;
27045a93d6eb4c55876e94f91b471657f23fe2149aaDanil Malyshev  };
27145a93d6eb4c55876e94f91b471657f23fe2149aaDanil Malyshev  constexpr S s;
27245a93d6eb4c55876e94f91b471657f23fe2149aaDanil Malyshev  constexpr volatile S vs; // expected-note {{here}}
273020f4e861a9a32059f76377e787703c92ba55a98Jim Grosbach  constexpr const volatile S &vrs = s;
274020f4e861a9a32059f76377e787703c92ba55a98Jim Grosbach  static_assert(s.i, "");
275020f4e861a9a32059f76377e787703c92ba55a98Jim Grosbach  static_assert(s.v, ""); // expected-error {{constant expression}} expected-note {{read of volatile-qualified type}}
276020f4e861a9a32059f76377e787703c92ba55a98Jim Grosbach  static_assert(vs.i, ""); // expected-error {{constant expression}} expected-note {{read of volatile-qualified type}}
277e940c1bb6c976539f07d6f440aeaacf7c25e1ddcJim Grosbach  static_assert(const_cast<int&>(vs.i), ""); // expected-error {{constant expression}} expected-note {{read of volatile object 'vs'}}
27850bee42b54cd9aec5f49566307df2b0cf23afcf6Craig Topper  static_assert(vrs.i, ""); // expected-error {{constant expression}} expected-note {{read of volatile-qualified type}}
27950bee42b54cd9aec5f49566307df2b0cf23afcf6Craig Topper
280020f4e861a9a32059f76377e787703c92ba55a98Jim Grosbach  // - a non-volatile glvalue of literal type that refers to a non-volatile
281020f4e861a9a32059f76377e787703c92ba55a98Jim Grosbach  //   temporary object whose lifetime has not ended, initialized with a
2828e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  //   constant expression;
2838e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  constexpr volatile S f() { return S(); }
2848e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  static_assert(f().i, ""); // ok! there's no lvalue-to-rvalue conversion here!
2858e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  static_assert(((volatile const S&&)(S)0).i, ""); // expected-error {{constant expression}} expected-note {{subexpression}}
2868e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor}
2878e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
2888e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor// FIXME:
2898e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor//
2908e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor// DR1312: The proposed wording for this defect has issues, so we ignore this
2918e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor// bullet and instead prohibit casts from pointers to cv void (see core-20842
2928e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor// and core-20845).
2938e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor//
2948e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor// - an lvalue-to-rvalue conversion (4.1 [conv.lval]) that is applied to a
2958e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor// glvalue of type cv1 T that refers to an object of type cv2 U, where T and U
2968e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor// are neither the same type nor similar types (4.4 [conv.qual]);
2978e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
2988e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor// FIXME:
299abb38fe8dec11b1ea7535f84fac8ad0f0af70addDavid Tweed// - an lvalue-to-rvalue conversion (4.1) that is applied to a glvalue that
300abb38fe8dec11b1ea7535f84fac8ad0f0af70addDavid Tweed// refers to a non-active member of a union or a subobject thereof;
301abb38fe8dec11b1ea7535f84fac8ad0f0af70addDavid Tweed
302abb38fe8dec11b1ea7535f84fac8ad0f0af70addDavid Tweed// - an id-expression that refers to a variable or data member of reference type
303abb38fe8dec11b1ea7535f84fac8ad0f0af70addDavid Tweed//   unless the reference has a preceding initialization, initialized with a
304abb38fe8dec11b1ea7535f84fac8ad0f0af70addDavid Tweed//   constant expression;
305abb38fe8dec11b1ea7535f84fac8ad0f0af70addDavid Tweednamespace References {
306abb38fe8dec11b1ea7535f84fac8ad0f0af70addDavid Tweed  const int a = 2;
30728989889bf3aa3314562d438aece245b71176ec4Andrew Kaylor  int &b = *const_cast<int*>(&a);
30828989889bf3aa3314562d438aece245b71176ec4Andrew Kaylor  int c = 10; // expected-note 2 {{here}}
3099ca6cdaee91fddcd3ea57dedcd624c14c7a40f65Chris Lattner  int &d = c;
31048dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar  constexpr int e = 42;
31148dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar  int &f = const_cast<int&>(e);
31248dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar  extern int &g;
3132ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor  constexpr int &h(); // expected-note 2{{here}}
31448dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar  int &i = h(); // expected-note {{here}} expected-note {{undefined function 'h' cannot be used in a constant expression}}
31518314dc741ab7dc4db02b199af77f43bd8551fd2Evan Cheng  constexpr int &j() { return b; }
31648dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar  int &k = j();
31748dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar
31848dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar  struct S {
31918314dc741ab7dc4db02b199af77f43bd8551fd2Evan Cheng    int A : a;
320f5b23368d27ef7dd44b2c45b5c08812ac99c7661Jim Grosbach    int B : b;
321f5b23368d27ef7dd44b2c45b5c08812ac99c7661Jim Grosbach    int C : c; // expected-error {{constant expression}} expected-note {{read of non-const variable 'c'}}
322e5dbbf2bddf7fc28d9f63a5e978af12184c80adaChris Lattner    int D : d; // expected-error {{constant expression}} expected-note {{read of non-const variable 'c'}}
323e5dbbf2bddf7fc28d9f63a5e978af12184c80adaChris Lattner    int D2 : &d - &c + 1;
324e5dbbf2bddf7fc28d9f63a5e978af12184c80adaChris Lattner    int E : e / 2;
325e5dbbf2bddf7fc28d9f63a5e978af12184c80adaChris Lattner    int F : f - 11;
326e5dbbf2bddf7fc28d9f63a5e978af12184c80adaChris Lattner    int G : g; // expected-error {{constant expression}}
327e5dbbf2bddf7fc28d9f63a5e978af12184c80adaChris Lattner    int H : h(); // expected-error {{constant expression}} expected-note {{undefined function 'h'}}
328e5dbbf2bddf7fc28d9f63a5e978af12184c80adaChris Lattner    int I : i; // expected-error {{constant expression}} expected-note {{initializer of 'i' is not a constant expression}}
329683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner    int J : j();
330683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner    int K : k;
331683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner  };
332683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner}
3334c5b23b24f230607fa18a162519875a91a5e89e0Jeffrey Yasskin
3344c5b23b24f230607fa18a162519875a91a5e89e0Jeffrey Yasskin// - a dynamic_cast (5.2.7);
335683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattnernamespace DynamicCast {
336f5b23368d27ef7dd44b2c45b5c08812ac99c7661Jim Grosbach  struct S { int n; };
33748dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar  constexpr S s { 16 };
33848dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar  struct T {
339683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner    int n : dynamic_cast<const S*>(&s)->n; // expected-warning {{constant expression}} expected-note {{dynamic_cast}}
340f5b23368d27ef7dd44b2c45b5c08812ac99c7661Jim Grosbach  };
341f049e07eb8930214941c72f8e4409df394de1567Nate Begeman}
342f049e07eb8930214941c72f8e4409df394de1567Nate Begeman
343f049e07eb8930214941c72f8e4409df394de1567Nate Begeman// - a reinterpret_cast (5.2.10);
344f5b23368d27ef7dd44b2c45b5c08812ac99c7661Jim Grosbachnamespace ReinterpretCast {
345f5feaf4fe381476b0ea567d7837c64b6590133e9Chris Lattner  struct S { int n; };
346683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner  constexpr S s { 16 };
347f4cc3096fd893cdef5b5c2664ebff8c13a07ad51Chris Lattner  struct T {
348f4cc3096fd893cdef5b5c2664ebff8c13a07ad51Chris Lattner    int n : reinterpret_cast<const S*>(&s)->n; // expected-warning {{constant expression}} expected-note {{reinterpret_cast}}
349f4cc3096fd893cdef5b5c2664ebff8c13a07ad51Chris Lattner  };
350f5b23368d27ef7dd44b2c45b5c08812ac99c7661Jim Grosbach  struct U {
351895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner    int m : (long)(S*)6; // expected-warning {{constant expression}} expected-note {{reinterpret_cast}}
352683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner  };
353683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner}
3548e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
3558e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor// - a pseudo-destructor call (5.2.4);
3568e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylornamespace PseudoDtor {
357683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner  int k;
35870bca51f92871c7f9d3eac9ab68292c149fab53cChris Lattner  typedef int I;
359895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner  struct T {
36048dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar    int n : (k.~I(), 0); // expected-error {{constant expression}} expected-note{{subexpression}}
3618e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  };
3628e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor}
3638e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
364bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner// - increment or decrement operations (5.2.6, 5.3.2);
365bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnernamespace IncDec {
366895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner  int k = 2;
367895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner  struct T {
3684c5b23b24f230607fa18a162519875a91a5e89e0Jeffrey Yasskin    int n : ++k; // expected-error {{constant expression}}
3697a9034c4db248fe8b8cb82762881b51b221988d3Jeffrey Yasskin    int m : --k; // expected-error {{constant expression}}
3707a9034c4db248fe8b8cb82762881b51b221988d3Jeffrey Yasskin  };
3718e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor}
3728e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
3738e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor// - a typeid expression (5.2.8) whose operand is of a polymorphic class type;
374fb0ef2e82cb2e80983c097100ae168af68ee8e7bBrian Gaekenamespace std {
375bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  struct type_info {
376f32a6a3091e0b01d17926f4b1cf78972854b8cb5Chris Lattner    virtual ~type_info();
377f32a6a3091e0b01d17926f4b1cf78972854b8cb5Chris Lattner    const char *name;
378f32a6a3091e0b01d17926f4b1cf78972854b8cb5Chris Lattner  };
3798e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor}
3808e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylornamespace TypeId {
381f32a6a3091e0b01d17926f4b1cf78972854b8cb5Chris Lattner  struct S { virtual void f(); };
382f5b23368d27ef7dd44b2c45b5c08812ac99c7661Jim Grosbach  constexpr S *p = 0;
383895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner  constexpr const std::type_info &ti1 = typeid(*p); // expected-error {{must be initialized by a constant expression}} expected-note {{typeid applied to expression of polymorphic type 'TypeId::S'}}
384895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner
3854c5b23b24f230607fa18a162519875a91a5e89e0Jeffrey Yasskin  struct T {} t;
3864c5b23b24f230607fa18a162519875a91a5e89e0Jeffrey Yasskin  constexpr const std::type_info &ti2 = typeid(t);
3878e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor}
3888e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
3898e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor// - a new-expression (5.3.4);
39018cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner// - a delete-expression (5.3.5);
39118cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattnernamespace NewDelete {
39218cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner  int *p = 0;
39318cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner  struct T {
39418cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner    int n : *new int(4); // expected-error {{constant expression}} expected-note {{subexpression}}
3958e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor    int m : (delete p, 2); // expected-error {{constant expression}} expected-note {{subexpression}}
3968e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  };
3978e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor}
3988e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
3998e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor// - a relational (5.9) or equality (5.10) operator where the result is
4008e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor//   unspecified;
4018e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylornamespace UnspecifiedRelations {
4028e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  int a, b;
4038e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  constexpr int *p = &a, *q = &b;
4048e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  // C++11 [expr.rel]p2: If two pointers p and q of the same type point to
4058e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  // different objects that are not members of the same array or to different
4068e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  // functions, or if only one of them is null, the results of p<q, p>q, p<=q,
4078e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  // and p>=q are unspecified.
4088e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  constexpr bool u1 = p < q; // expected-error {{constant expression}}
4098e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  constexpr bool u2 = p > q; // expected-error {{constant expression}}
4108e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  constexpr bool u3 = p <= q; // expected-error {{constant expression}}
4118e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  constexpr bool u4 = p >= q; // expected-error {{constant expression}}
4128e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  constexpr bool u5 = p < 0; // expected-error {{constant expression}}
413b3a847db0b991d3210706a2580428fdc2b6bf037Argyrios Kyrtzidis  constexpr bool u6 = p <= 0; // expected-error {{constant expression}}
414dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  constexpr bool u7 = p > 0; // expected-error {{constant expression}}
415b3a847db0b991d3210706a2580428fdc2b6bf037Argyrios Kyrtzidis  constexpr bool u8 = p >= 0; // expected-error {{constant expression}}
416c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner  constexpr bool u9 = 0 < q; // expected-error {{constant expression}}
417c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner  constexpr bool u10 = 0 <= q; // expected-error {{constant expression}}
418c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner  constexpr bool u11 = 0 > q; // expected-error {{constant expression}}
419c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner  constexpr bool u12 = 0 >= q; // expected-error {{constant expression}}
420c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner  void f(), g();
42148dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar
42248dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar  constexpr void (*pf)() = &f, (*pg)() = &g;
42348dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar  constexpr bool u13 = pf < pg; // expected-error {{constant expression}}
42448dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar  constexpr bool u14 = pf == pg;
425f4cc3096fd893cdef5b5c2664ebff8c13a07ad51Chris Lattner
426db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  // FIXME:
42748dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar  // If two pointers point to non-static data members of the same object with
42829794cba810ec249a9ede5ea77333a71579fd182Brian Gaeke  // different access control, the result is unspecified.
42929794cba810ec249a9ede5ea77333a71579fd182Brian Gaeke
43048dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar  // [expr.rel]p3: Pointers to void can be compared [...] if both pointers
43148dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar  // represent the same address or are both the null pointer [...]; otherwise
43248dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar  // the result is unspecified.
43348dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar  struct S { int a, b; } s;
43448dd875be12006060260526e4a1df0bae48dd5c9Daniel Dunbar  constexpr void *null = 0;
43518cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner  constexpr void *pv = (void*)&s.a;
43618cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner  constexpr void *qv = (void*)&s.b;
437e81aaf238c32dbc34274ede09fb16aa78dae9f53Misha Brukman  constexpr bool v1 = null < 0;
438e81aaf238c32dbc34274ede09fb16aa78dae9f53Misha Brukman  constexpr bool v2 = null < pv; // expected-error {{constant expression}}
439e81aaf238c32dbc34274ede09fb16aa78dae9f53Misha Brukman  constexpr bool v3 = null == pv; // ok
440e81aaf238c32dbc34274ede09fb16aa78dae9f53Misha Brukman  constexpr bool v4 = qv == pv; // ok
441e81aaf238c32dbc34274ede09fb16aa78dae9f53Misha Brukman  constexpr bool v5 = qv >= pv; // expected-error {{constant expression}} expected-note {{unequal pointers to void}}
4421514b5b334c72e1e190fe1ce2bce7bf7d8a91c1aChris Lattner  constexpr bool v6 = qv > null; // expected-error {{constant expression}}
4431514b5b334c72e1e190fe1ce2bce7bf7d8a91c1aChris Lattner  constexpr bool v7 = qv <= (void*)&s.b; // ok
4444c5b23b24f230607fa18a162519875a91a5e89e0Jeffrey Yasskin  constexpr bool v8 = qv > (void*)&s.a; // expected-error {{constant expression}} expected-note {{unequal pointers to void}}
4458e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor
4468e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  // FIXME: Implement comparisons of pointers to members.
4478e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor  // [expr.eq]p2: If either is a pointer to a virtual member function and
4481514b5b334c72e1e190fe1ce2bce7bf7d8a91c1aChris Lattner  // neither is null, the result is unspecified.
44972ea0c9ffaa1700730c8ce36e9b73aef4b914988Galina Kistanova}
4501514b5b334c72e1e190fe1ce2bce7bf7d8a91c1aChris Lattner
451df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin// - an assignment or a compound assignment (5.17); or
452df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskinnamespace Assignment {
453df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin  int k;
454df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin  struct T {
455df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin    int n : (k = 9); // expected-error {{constant expression}}
456df225c0253aa987830fbd3dfcb5d9f8f7f973336Bill Wendling    int m : (k *= 2); // expected-error {{constant expression}}
457df225c0253aa987830fbd3dfcb5d9f8f7f973336Bill Wendling  };
458df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin
4591c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor  struct Literal {
4601c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor    constexpr Literal(const char *name) : name(name) {}
4611c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor    const char *name;
4621c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor  };
4631c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor  struct Expr {
4641c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor    constexpr Expr(Literal l) : IsLiteral(true), l(l) {}
46536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    bool IsLiteral;
46636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    union {
46736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      Literal l;
46836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      // ...
46936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    };
47036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  };
47136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  struct MulEq {
47236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    constexpr MulEq(Expr a, Expr b) : LHS(a), RHS(b) {}
47336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    Expr LHS;
47436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    Expr RHS;
47536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  };
47636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  constexpr MulEq operator*=(Expr a, Expr b) { return MulEq(a, b); }
47736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  Literal a("a");
47836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  Literal b("b");
47936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  MulEq c = a *= b; // ok
48036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
481dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
48236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// - a throw-expression (15.1)
48318fec73e29d68b9c7473720507f51de39b0873b1Jeffrey Yasskinnamespace Throw {
484dc85724f703bddf6988b6b3f20203beab775f32bJeffrey Yasskin  struct S {
485dc85724f703bddf6988b6b3f20203beab775f32bJeffrey Yasskin    int n : (throw "hello", 10); // expected-error {{constant expression}} expected-note {{subexpression}}
486dc85724f703bddf6988b6b3f20203beab775f32bJeffrey Yasskin  };
487dc85724f703bddf6988b6b3f20203beab775f32bJeffrey Yasskin}
488dc85724f703bddf6988b6b3f20203beab775f32bJeffrey Yasskin
489dc85724f703bddf6988b6b3f20203beab775f32bJeffrey Yasskin// PR9999
490dc85724f703bddf6988b6b3f20203beab775f32bJeffrey Yasskintemplate<unsigned int v>
491dc85724f703bddf6988b6b3f20203beab775f32bJeffrey Yasskinclass bitWidthHolding {
492dc85724f703bddf6988b6b3f20203beab775f32bJeffrey Yasskinpublic:
493dc85724f703bddf6988b6b3f20203beab775f32bJeffrey Yasskin  static const
494dc85724f703bddf6988b6b3f20203beab775f32bJeffrey Yasskin  unsigned int width = (v == 0 ? 0 : bitWidthHolding<(v >> 1)>::width + 1);
495dc85724f703bddf6988b6b3f20203beab775f32bJeffrey Yasskin};
49618fec73e29d68b9c7473720507f51de39b0873b1Jeffrey Yasskin
49718fec73e29d68b9c7473720507f51de39b0873b1Jeffrey Yasskinstatic const int width=bitWidthHolding<255>::width;
4981c1a44699049cf56713a46ccaef7c747e4a888a3Chris Lattner
499dc85724f703bddf6988b6b3f20203beab775f32bJeffrey Yasskintemplate<bool b>
500dc85724f703bddf6988b6b3f20203beab775f32bJeffrey Yasskinstruct always_false {
5011c1a44699049cf56713a46ccaef7c747e4a888a3Chris Lattner  static const bool value = false;
50218fec73e29d68b9c7473720507f51de39b0873b1Jeffrey Yasskin};
50318fec73e29d68b9c7473720507f51de39b0873b1Jeffrey Yasskin
50418fec73e29d68b9c7473720507f51de39b0873b1Jeffrey Yasskintemplate<bool b>
50518fec73e29d68b9c7473720507f51de39b0873b1Jeffrey Yasskinstruct and_or {
50618fec73e29d68b9c7473720507f51de39b0873b1Jeffrey Yasskin  static const bool and_value = b && and_or<always_false<b>::value>::and_value;
507446531e7bb4355117b070493ca8e81e4b123ef18Evan Cheng  static const bool or_value = !b || and_or<always_false<b>::value>::or_value;
50877f86ad08775e0ed2a704ef09ffff3dbd6e04583Evan Cheng};
50977f86ad08775e0ed2a704ef09ffff3dbd6e04583Evan Cheng
51077f86ad08775e0ed2a704ef09ffff3dbd6e04583Evan Chengstatic const bool and_value = and_or<true>::and_value;
511446531e7bb4355117b070493ca8e81e4b123ef18Evan Chengstatic const bool or_value = and_or<true>::or_value;
512446531e7bb4355117b070493ca8e81e4b123ef18Evan Cheng
513446531e7bb4355117b070493ca8e81e4b123ef18Evan Chengstatic_assert(and_value == false, "");
514446531e7bb4355117b070493ca8e81e4b123ef18Evan Chengstatic_assert(or_value == true, "");
515446531e7bb4355117b070493ca8e81e4b123ef18Evan Cheng