p2-0x.cpp revision 395f1c08ff720be7df6535a86df14b6d36a2d57a
11e7fc3d31e17fbe314f86de96aac6e9a2f297167Richard Smith// RUN: %clang_cc1 -fsyntax-only -std=c++11 -pedantic -verify -fcxx-exceptions %s -fconstexpr-depth 128
2c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
3c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// A conditional-expression is a core constant expression unless it involves one
4c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// of the following as a potentially evaluated subexpression [...]:
5c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
6c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// - this (5.1.1 [expr.prim.general]) [Note: when evaluating a constant
7c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith//   expression, function invocation substitution (7.1.5 [dcl.constexpr])
8c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith//   replaces each occurrence of this in a constexpr member function with a
9c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith//   pointer to the class object. -end note];
10c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smithstruct This {
11c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  int this1 : this1; // expected-error {{undeclared}}
12c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  int this2 : this->this1; // expected-error {{invalid}}
13c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  void this3() {
14c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    int n1[this->this1]; // expected-warning {{variable length array}}
15c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    int n2[this1]; // expected-warning {{variable length array}}
16c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    (void)n1, (void)n2;
17c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  }
18c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith};
19c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
20c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// - an invocation of a function other than a constexpr constructor for a
21c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith//   literal class or a constexpr function [ Note: Overload resolution (13.3)
22c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith//   is applied as usual - end note ];
23c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smithstruct NonConstexpr1 {
24c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  static int f() { return 1; } // expected-note {{here}}
25c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  int n : f(); // expected-error {{constant expression}} expected-note {{non-constexpr function 'f' cannot be used in a constant expression}}
26c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith};
27c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smithstruct NonConstexpr2 {
28c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr NonConstexpr2(); // expected-note {{here}}
29c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  int n;
30c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith};
31c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smithstruct NonConstexpr3 {
32c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  NonConstexpr3();
33c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  int m : NonConstexpr2().n; // expected-error {{constant expression}} expected-note {{undefined constructor 'NonConstexpr2'}}
34c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith};
35c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smithstruct NonConstexpr4 {
3651201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith  NonConstexpr4(); // expected-note {{declared here}}
37c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  int n;
38c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith};
39c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smithstruct NonConstexpr5 {
4051201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith  int n : NonConstexpr4().n; // expected-error {{constant expression}} expected-note {{non-constexpr constructor 'NonConstexpr4' cannot be used in a constant expression}}
41c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith};
42c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
43c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// - an invocation of an undefined constexpr function or an undefined
44c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith//   constexpr constructor;
45c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smithstruct UndefinedConstexpr {
46c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr UndefinedConstexpr();
47c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  static constexpr int undefinedConstexpr1(); // expected-note {{here}}
48c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  int undefinedConstexpr2 : undefinedConstexpr1(); // expected-error {{constant expression}} expected-note {{undefined function 'undefinedConstexpr1' cannot be used in a constant expression}}
49c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith};
50c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
51c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// - an invocation of a constexpr function with arguments that, when substituted
52c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith//   by function invocation substitution (7.1.5), do not produce a constant
53c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith//   expression;
54c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smithnamespace NonConstExprReturn {
55c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  static constexpr const int &id_ref(const int &n) {
56c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    return n; // expected-note {{reference to temporary cannot be returned from a constexpr function}}
57c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  }
58c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  struct NonConstExprFunction {
5908d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith    int n : id_ref( // expected-error {{constant expression}} expected-note {{in call to 'id_ref(16)'}}
60c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith        16 // expected-note {{temporary created here}}
61c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith        );
62c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  };
63c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr const int *address_of(const int &a) {
64c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    return &a; // expected-note {{pointer to 'n' cannot be returned from a constexpr function}}
65c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  }
66c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr const int *return_param(int n) { // expected-note {{declared here}}
6708d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith    return address_of(n); // expected-note {{in call to 'address_of(n)'}}
68c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  }
69c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  struct S {
7008d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith    int n : *return_param(0); // expected-error {{constant expression}} expected-note {{in call to 'return_param(0)'}}
71c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  };
72c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith}
73c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
74c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// - an invocation of a constexpr constructor with arguments that, when
75c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith//   substituted by function invocation substitution (7.1.5), do not produce all
76c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith//   constant expressions for the constructor calls and full-expressions in the
77c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith//   mem-initializers (including conversions);
78c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smithnamespace NonConstExprCtor {
79c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  struct T {
80c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    constexpr T(const int &r) :
81099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith      r(r) { // expected-note 2{{reference to temporary cannot be used to initialize a member in a constant expression}}
82c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    }
83c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    const int &r;
84c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  };
85c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr int n = 0;
86c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr T t1(n); // ok
87099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith  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)'}}
88c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
89c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  struct S {
9008d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith    int n : T(4).r; // expected-error {{constant expression}} expected-note {{temporary created here}} expected-note {{in call to 'T(4)'}}
91c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  };
92c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith}
93c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
94c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// - an invocation of a constexpr function or a constexpr constructor that would
95c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith//   exceed the implementation-defined recursion limits (see Annex B);
96c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smithnamespace RecursionLimits {
97c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr int RecurseForever(int n) {
981e7fc3d31e17fbe314f86de96aac6e9a2f297167Richard Smith    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}}
99c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  }
100c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  struct AlsoRecurseForever {
101c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    constexpr AlsoRecurseForever(int n) :
1021e7fc3d31e17fbe314f86de96aac6e9a2f297167Richard Smith      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}}
103c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    {}
104c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    int n;
105c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  };
106c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  struct S {
10708d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith    int k : RecurseForever(0); // expected-error {{constant expression}} expected-note {{in call to}}
10808d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith    int l : AlsoRecurseForever(0).n; // expected-error {{constant expression}} expected-note {{in call to}}
109c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  };
110c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith}
111c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
112c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// FIXME:
113c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// - an operation that would have undefined behavior [Note: including, for
114c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith//   example, signed integer overflow (Clause 5 [expr]), certain pointer
115c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith//   arithmetic (5.7 [expr.add]), division by zero (5.6 [expr.mul]), or certain
116c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith//   shift operations (5.8 [expr.shift]) -end note];
117c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smithnamespace UndefinedBehavior {
118c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  void f(int n) {
119c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    switch (n) {
120c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    case (int)4.4e9: // expected-error {{constant expression}} expected-note {{value 4.4E+9 is outside the range of representable values of type 'int'}}
121395f1c08ff720be7df6535a86df14b6d36a2d57aRichard Smith    case (int)0x80000000u: // ok
122395f1c08ff720be7df6535a86df14b6d36a2d57aRichard Smith    case (int)10000000000ll: // expected-note {{here}}
123f72fccf533bca206af8e75d041c29db99e6a7f2cRichard Smith    case (unsigned int)10000000000ll: // expected-error {{duplicate case value}}
124c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    case (int)(unsigned)(long long)4.4e9: // ok
1258ef7b203332b0c8d65876a1f5e6d1db4e6f40e4bRichard Smith    case (int)(float)1e300: // expected-error {{constant expression}} expected-note {{value 1.0E+300 is outside the range of representable values of type 'float'}}
126c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    case (int)((float)1e37 / 1e30): // ok
127c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    case (int)(__fp16)65536: // expected-error {{constant expression}} expected-note {{value 65536 is outside the range of representable values of type 'half'}}
128c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith      break;
129c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    }
130c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  }
131c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
132c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  struct S {
133c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    int m;
134c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  };
135c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr S s = { 5 }; // expected-note {{declared here}}
136c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr const int *p = &s.m + 1;
137c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr const int &f(const int *q) {
138c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    return q[0]; // expected-note {{dereferenced pointer past the end of subobject of 's' is not a constant expression}}
139c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  }
14061e616206413d1779c7545c7a8ad1ce1129ad9c1Richard Smith  constexpr int n = (f(p), 0); // expected-error {{constant expression}} expected-note {{in call to 'f(&s.m + 1)'}}
141c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  struct T {
142244ee7b89a483fd3764637abdf95de2893b437d0Richard Smith    int n : f(p); // expected-error {{not an integral constant expression}} expected-note {{read of dereferenced one-past-the-end pointer}}
143c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  };
144b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith
145b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  namespace Ptr {
146b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    struct A {};
147b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    struct B : A { int n; };
148b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    B a[3][3];
149b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    constexpr B *p = a[0] + 4; // expected-error {{constant expression}} expected-note {{element 4 of array of 3 elements}}
150b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    B b = {};
151b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    constexpr A *pa = &b + 1; // expected-error {{constant expression}} expected-note {{base class of pointer past the end}}
152b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    constexpr B *pb = (B*)((A*)&b + 1); // expected-error {{constant expression}} expected-note {{derived class of pointer past the end}}
153b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    constexpr const int *pn = &(&b + 1)->n; // expected-error {{constant expression}} expected-note {{field of pointer past the end}}
154b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    constexpr B *parr = &a[3][0]; // expected-error {{constant expression}} expected-note {{array element of pointer past the end}}
155b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith
156b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    constexpr A *na = nullptr;
157b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    constexpr B *nb = nullptr;
158b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    constexpr A &ra = *nb; // expected-error {{constant expression}} expected-note {{cannot access base class of null pointer}}
159b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    constexpr B &rb = (B&)*na; // expected-error {{constant expression}} expected-note {{cannot access derived class of null pointer}}
160b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    static_assert((A*)nb == 0, "");
161b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    static_assert((B*)na == 0, "");
162b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    constexpr const int &nf = nb->n; // expected-error {{constant expression}} expected-note {{cannot access field of null pointer}}
163b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    constexpr const int &np = (*(int(*)[4])nullptr)[2]; // expected-error {{constant expression}} expected-note {{cannot access array element of null pointer}}
164b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  }
165c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith}
166c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
167c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// - a lambda-expression (5.1.2);
168c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smithstruct Lambda {
169c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  // FIXME: clang crashes when trying to parse this! Revisit this check once
170c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  // lambdas are fully implemented.
171c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  //int n : []{ return 1; }();
172c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith};
173c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
174c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// - an lvalue-to-rvalue conversion (4.1) unless it is applied to
1757098cbd601ad915aed22d4b5850da99359f25bf3Richard Smithnamespace LValueToRValue {
1767098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith  // - a non-volatile glvalue of integral or enumeration type that refers to a
1777098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith  //   non-volatile const object with a preceding initialization, initialized
1787098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith  //   with a constant expression  [Note: a string literal (2.14.5 [lex.string])
1797098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith  //   corresponds to an array of such objects. -end note], or
1807098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith  volatile const int vi = 1; // expected-note {{here}}
1817098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith  const int ci = 1;
1827098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith  volatile const int &vrci = ci;
1837098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith  static_assert(vi, ""); // expected-error {{constant expression}} expected-note {{read of volatile-qualified type 'const volatile int'}}
1847098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith  static_assert(const_cast<int&>(vi), ""); // expected-error {{constant expression}} expected-note {{read of volatile object 'vi'}}
1857098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith  static_assert(vrci, ""); // expected-error {{constant expression}} expected-note {{read of volatile-qualified type}}
1867098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith
1877098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith  // - a non-volatile glvalue of literal type that refers to a non-volatile
1887098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith  //   object defined with constexpr, or that refers to a sub-object of such an
1897098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith  //   object, or
1907098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith  struct S {
1917098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith    constexpr S(int=0) : i(1), v(1) {}
1927098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith    constexpr S(const S &s) : i(2), v(2) {}
1937098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith    int i;
1947098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith    volatile int v;
1957098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith  };
1967098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith  constexpr S s;
1977098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith  constexpr volatile S vs; // expected-note {{here}}
1987098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith  constexpr const volatile S &vrs = s;
1997098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith  static_assert(s.i, "");
2007098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith  static_assert(s.v, ""); // expected-error {{constant expression}} expected-note {{read of volatile-qualified type}}
2017098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith  static_assert(vs.i, ""); // expected-error {{constant expression}} expected-note {{read of volatile-qualified type}}
2027098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith  static_assert(const_cast<int&>(vs.i), ""); // expected-error {{constant expression}} expected-note {{read of volatile object 'vs'}}
2037098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith  static_assert(vrs.i, ""); // expected-error {{constant expression}} expected-note {{read of volatile-qualified type}}
2047098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith
2057098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith  // - a non-volatile glvalue of literal type that refers to a non-volatile
2067098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith  //   temporary object whose lifetime has not ended, initialized with a
2077098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith  //   constant expression;
2087098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith  constexpr volatile S f() { return S(); }
2097098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith  static_assert(f().i, ""); // ok! there's no lvalue-to-rvalue conversion here!
2107098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith  static_assert(((volatile const S&&)(S)0).i, ""); // expected-error {{constant expression}} expected-note {{subexpression}}
2117098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith}
212c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
213c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// FIXME:
214c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith//
2157098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith// DR1312: The proposed wording for this defect has issues, so we ignore this
2167098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith// bullet and instead prohibit casts from pointers to cv void (see core-20842
2177098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith// and core-20845).
218c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith//
219c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// - an lvalue-to-rvalue conversion (4.1 [conv.lval]) that is applied to a
220c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// glvalue of type cv1 T that refers to an object of type cv2 U, where T and U
221c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// are neither the same type nor similar types (4.4 [conv.qual]);
222c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
223c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// FIXME:
224c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// - an lvalue-to-rvalue conversion (4.1) that is applied to a glvalue that
225c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// refers to a non-active member of a union or a subobject thereof;
226c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
227c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// - an id-expression that refers to a variable or data member of reference type
228c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith//   unless the reference has a preceding initialization, initialized with a
229c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith//   constant expression;
230c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smithnamespace References {
231c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  const int a = 2;
232c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  int &b = *const_cast<int*>(&a);
2337098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith  int c = 10; // expected-note 2 {{here}}
234c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  int &d = c;
235c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr int e = 42;
236c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  int &f = const_cast<int&>(e);
237c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  extern int &g;
238099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith  constexpr int &h(); // expected-note 2{{here}}
239099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith  int &i = h(); // expected-note {{here}} expected-note {{undefined function 'h' cannot be used in a constant expression}}
240c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr int &j() { return b; }
241c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  int &k = j();
242c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
243c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  struct S {
244c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    int A : a;
245c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    int B : b;
2467098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith    int C : c; // expected-error {{constant expression}} expected-note {{read of non-const variable 'c'}}
2477098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith    int D : d; // expected-error {{constant expression}} expected-note {{read of non-const variable 'c'}}
248c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    int D2 : &d - &c + 1;
249c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    int E : e / 2;
250c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    int F : f - 11;
251c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    int G : g; // expected-error {{constant expression}}
252c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    int H : h(); // expected-error {{constant expression}} expected-note {{undefined function 'h'}}
253099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith    int I : i; // expected-error {{constant expression}} expected-note {{initializer of 'i' is not a constant expression}}
254c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    int J : j();
255c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    int K : k;
256c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  };
257c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith}
258c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
259c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// - a dynamic_cast (5.2.7);
260c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smithnamespace DynamicCast {
261c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  struct S { int n; };
262c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr S s { 16 };
263c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  struct T {
264c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    int n : dynamic_cast<const S*>(&s)->n; // expected-warning {{constant expression}} expected-note {{dynamic_cast}}
265c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  };
266c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith}
267c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
268c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// - a reinterpret_cast (5.2.10);
269c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smithnamespace ReinterpretCast {
270c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  struct S { int n; };
271c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr S s { 16 };
272c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  struct T {
273c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    int n : reinterpret_cast<const S*>(&s)->n; // expected-warning {{constant expression}} expected-note {{reinterpret_cast}}
274c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  };
275c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  struct U {
276c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    int m : (long)(S*)6; // expected-warning {{constant expression}} expected-note {{reinterpret_cast}}
277c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  };
278c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith}
279c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
280c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// - a pseudo-destructor call (5.2.4);
281c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smithnamespace PseudoDtor {
282c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  int k;
283c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  typedef int I;
284c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  struct T {
285c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    int n : (k.~I(), 0); // expected-error {{constant expression}} expected-note{{subexpression}}
286c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  };
287c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith}
288c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
289c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// - increment or decrement operations (5.2.6, 5.3.2);
290c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smithnamespace IncDec {
291c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  int k = 2;
292c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  struct T {
293c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    int n : ++k; // expected-error {{constant expression}}
294c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    int m : --k; // expected-error {{constant expression}}
295c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  };
296c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith}
297c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
298c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// - a typeid expression (5.2.8) whose operand is of a polymorphic class type;
299c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smithnamespace std {
300c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  struct type_info {
301c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    virtual ~type_info();
302c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    const char *name;
303c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  };
304c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith}
305c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smithnamespace TypeId {
306c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  struct S { virtual void f(); };
307c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr S *p = 0;
30847d2145675099893d702be4bc06bd9f26d8ddd13Richard Smith  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'}}
309c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
310c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  struct T {} t;
31147d2145675099893d702be4bc06bd9f26d8ddd13Richard Smith  constexpr const std::type_info &ti2 = typeid(t);
312c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith}
313c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
314c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// - a new-expression (5.3.4);
315c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// - a delete-expression (5.3.5);
316c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smithnamespace NewDelete {
317c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  int *p = 0;
318c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  struct T {
319c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    int n : *new int(4); // expected-error {{constant expression}} expected-note {{subexpression}}
320c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    int m : (delete p, 2); // expected-error {{constant expression}} expected-note {{subexpression}}
321c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  };
322c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith}
323c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
324c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// - a relational (5.9) or equality (5.10) operator where the result is
325c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith//   unspecified;
326c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smithnamespace UnspecifiedRelations {
327c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  int a, b;
328c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr int *p = &a, *q = &b;
329c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  // C++11 [expr.rel]p2: If two pointers p and q of the same type point to
330c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  // different objects that are not members of the same array or to different
331c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  // functions, or if only one of them is null, the results of p<q, p>q, p<=q,
332c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  // and p>=q are unspecified.
333c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr bool u1 = p < q; // expected-error {{constant expression}}
334c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr bool u2 = p > q; // expected-error {{constant expression}}
335c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr bool u3 = p <= q; // expected-error {{constant expression}}
336c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr bool u4 = p >= q; // expected-error {{constant expression}}
337c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr bool u5 = p < 0; // expected-error {{constant expression}}
338c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr bool u6 = p <= 0; // expected-error {{constant expression}}
339c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr bool u7 = p > 0; // expected-error {{constant expression}}
340c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr bool u8 = p >= 0; // expected-error {{constant expression}}
341c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr bool u9 = 0 < q; // expected-error {{constant expression}}
342c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr bool u10 = 0 <= q; // expected-error {{constant expression}}
343c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr bool u11 = 0 > q; // expected-error {{constant expression}}
344c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr bool u12 = 0 >= q; // expected-error {{constant expression}}
345c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  void f(), g();
346c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
347c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr void (*pf)() = &f, (*pg)() = &g;
348c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr bool u13 = pf < pg; // expected-error {{constant expression}}
349c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr bool u14 = pf == pg;
350c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
351c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  // FIXME:
352c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  // If two pointers point to non-static data members of the same object with
353c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  // different access control, the result is unspecified.
354c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
355c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  // FIXME:
356c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  // [expr.rel]p3: Pointers to void can be compared [...] if both pointers
357c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  // represent the same address or are both the null pointer [...]; otherwise
358c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  // the result is unspecified.
359c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
360c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  // FIXME: Implement comparisons of pointers to members.
361c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  // [expr.eq]p2: If either is a pointer to a virtual member function and
362c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  // neither is null, the result is unspecified.
363c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith}
364c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
365c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// - an assignment or a compound assignment (5.17); or
366c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smithnamespace Assignment {
367c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  int k;
368c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  struct T {
369c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    int n : (k = 9); // expected-error {{constant expression}}
370c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    int m : (k *= 2); // expected-error {{constant expression}}
371c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  };
372c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
373c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  struct Literal {
374c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    constexpr Literal(const char *name) : name(name) {}
375c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    const char *name;
376c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  };
377c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  struct Expr {
378c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    constexpr Expr(Literal l) : IsLiteral(true), l(l) {}
379c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    bool IsLiteral;
380c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    union {
381c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith      Literal l;
382c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith      // ...
383c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    };
384c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  };
385c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  struct MulEq {
386c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    constexpr MulEq(Expr a, Expr b) : LHS(a), RHS(b) {}
387c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    Expr LHS;
388c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    Expr RHS;
389c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  };
390c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr MulEq operator*=(Expr a, Expr b) { return MulEq(a, b); }
391c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  Literal a("a");
392c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  Literal b("b");
393c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  MulEq c = a *= b; // ok
394c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith}
395c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
396c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// - a throw-expression (15.1)
397c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smithnamespace Throw {
398c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  struct S {
399c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    int n : (throw "hello", 10); // expected-error {{constant expression}} expected-note {{subexpression}}
400c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  };
401c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith}
40263fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor
40363fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor// PR9999
4048ef7b203332b0c8d65876a1f5e6d1db4e6f40e4bRichard Smithtemplate<unsigned int v>
40563fe6814f339df30b8463b39995947cbdf920e48Douglas Gregorclass bitWidthHolding {
40663fe6814f339df30b8463b39995947cbdf920e48Douglas Gregorpublic:
40763fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor  static const
40863fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor  unsigned int width = (v == 0 ? 0 : bitWidthHolding<(v >> 1)>::width + 1);
40963fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor};
41063fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor
41163fe6814f339df30b8463b39995947cbdf920e48Douglas Gregorstatic const int width=bitWidthHolding<255>::width;
41263fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor
41363fe6814f339df30b8463b39995947cbdf920e48Douglas Gregortemplate<bool b>
41463fe6814f339df30b8463b39995947cbdf920e48Douglas Gregorstruct always_false {
41563fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor  static const bool value = false;
41663fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor};
41763fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor
41863fe6814f339df30b8463b39995947cbdf920e48Douglas Gregortemplate<bool b>
41963fe6814f339df30b8463b39995947cbdf920e48Douglas Gregorstruct and_or {
42063fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor  static const bool and_value = b && and_or<always_false<b>::value>::and_value;
42163fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor  static const bool or_value = !b || and_or<always_false<b>::value>::or_value;
42263fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor};
42363fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor
42463fe6814f339df30b8463b39995947cbdf920e48Douglas Gregorstatic const bool and_value = and_or<true>::and_value;
42563fe6814f339df30b8463b39995947cbdf920e48Douglas Gregorstatic const bool or_value = and_or<true>::or_value;
4268ef7b203332b0c8d65876a1f5e6d1db4e6f40e4bRichard Smith
4278ef7b203332b0c8d65876a1f5e6d1db4e6f40e4bRichard Smithstatic_assert(and_value == false, "");
4288ef7b203332b0c8d65876a1f5e6d1db4e6f40e4bRichard Smithstatic_assert(or_value == true, "");
429