p2-0x.cpp revision 08d6e032a2a0a8656d12b3b7b93942987bb12eb7
10a36512b175103d60020aaa857363dca33f36558Richard Smith// RUN: %clang_cc1 -fsyntax-only -std=c++11 -pedantic -verify -fcxx-exceptions %s -fconstexpr-depth 256
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 {
36c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  NonConstexpr4();
37c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  int n;
38c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith};
39c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smithstruct NonConstexpr5 {
40c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  int n : NonConstexpr4().n; // expected-error {{constant expression}} expected-note {{non-literal type '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) :
81c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith      r(r) { // expected-note {{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
87c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr T t2(0); // expected-error {{must be initialized by a constant expression}}
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) {
9808d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith    return n + RecurseForever(n+1); // expected-note {{constexpr evaluation exceeded maximum depth of 256 calls}} expected-note 9{{in call to 'RecurseForever(}} expected-note {{skipping 246 calls}}
99c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  }
100c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  struct AlsoRecurseForever {
101c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    constexpr AlsoRecurseForever(int n) :
10208d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith      n(AlsoRecurseForever(n+1).n) // expected-note {{constexpr evaluation exceeded maximum depth of 256 calls}} expected-note 9{{in call to 'AlsoRecurseForever(}} expected-note {{skipping 246 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'}}
121c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    case (int)(unsigned)(long long)4.4e9: // ok
122c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    case (float)1e300: // expected-error {{constant expression}} expected-note {{value 1.0E+300 is outside the range of representable values of type 'float'}}
123c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    case (int)((float)1e37 / 1e30): // ok
124c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    case (int)(__fp16)65536: // expected-error {{constant expression}} expected-note {{value 65536 is outside the range of representable values of type 'half'}}
125c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith      break;
126c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    }
127c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  }
128c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
129c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  struct S {
130c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    int m;
131c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  };
132c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr S s = { 5 }; // expected-note {{declared here}}
133c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr const int *p = &s.m + 1;
134c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr const int &f(const int *q) {
135c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    return q[0]; // expected-note {{dereferenced pointer past the end of subobject of 's' is not a constant expression}}
136c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  }
137c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  struct T {
13808d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith    int n : f(p); // expected-error {{not an integer constant expression}} expected-note {{in call to 'f(&s.m + 1)'}}
139c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  };
140c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith}
141c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
142c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// - a lambda-expression (5.1.2);
143c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smithstruct Lambda {
144c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  // FIXME: clang crashes when trying to parse this! Revisit this check once
145c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  // lambdas are fully implemented.
146c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  //int n : []{ return 1; }();
147c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith};
148c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
149c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// FIXME:
150c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// - an lvalue-to-rvalue conversion (4.1) unless it is applied to
151c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith//
152c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith//   - a non-volatile glvalue of integral or enumeration type that refers to a
153c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith//   non-volatile const object with a preceding initialization, initialized with
154c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith//   a constant expression  [Note: a string literal (2.14.5 [lex.string])
155c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith//   corresponds to an array of such objects. -end note], or
156c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith//
157c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith//   - a non-volatile glvalue of literal type that refers to a non-volatile
158c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith//   object defined with constexpr, or that refers to a sub-object of such an
159c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith//   object, or
160c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith//
161c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith//   - a non-volatile glvalue of literal type that refers to a non-volatile
162c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith//   temporary object whose lifetime has not ended, initialized with a constant
163c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith//   expression;
164c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
165c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// FIXME:
166c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith//
167c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// DR1312: The proposed wording for this defect has issues, so we instead
168c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// prohibit casts from pointers to cv void (see core-20842 and core-20845).
169c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith//
170c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// - an lvalue-to-rvalue conversion (4.1 [conv.lval]) that is applied to a
171c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// glvalue of type cv1 T that refers to an object of type cv2 U, where T and U
172c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// are neither the same type nor similar types (4.4 [conv.qual]);
173c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
174c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// FIXME:
175c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// - an lvalue-to-rvalue conversion (4.1) that is applied to a glvalue that
176c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// refers to a non-active member of a union or a subobject thereof;
177c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
178c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// FIXME:
179c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// - an id-expression that refers to a variable or data member of reference type
180c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith//   unless the reference has a preceding initialization, initialized with a
181c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith//   constant expression;
182c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smithnamespace References {
183c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  const int a = 2;
184c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  int &b = *const_cast<int*>(&a);
185c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  int c = 10;
186c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  int &d = c;
187c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr int e = 42;
188c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  int &f = const_cast<int&>(e);
189c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  extern int &g;
190c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr int &h(); // expected-note {{here}}
191c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  int &i = h();
192c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr int &j() { return b; }
193c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  int &k = j();
194c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
195c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  struct S {
196c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    int A : a;
197c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    int B : b;
198c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    int C : c; // expected-error {{constant expression}}
199c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    int D : d; // expected-error {{constant expression}}
200c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    int D2 : &d - &c + 1;
201c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    int E : e / 2;
202c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    int F : f - 11;
203c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    int G : g; // expected-error {{constant expression}}
204c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    int H : h(); // expected-error {{constant expression}} expected-note {{undefined function 'h'}}
205c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    int I : i; // expected-error {{constant expression}}
206c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    int J : j();
207c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    int K : k;
208c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  };
209c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith}
210c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
211c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// - a dynamic_cast (5.2.7);
212c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smithnamespace DynamicCast {
213c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  struct S { int n; };
214c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr S s { 16 };
215c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  struct T {
216c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    int n : dynamic_cast<const S*>(&s)->n; // expected-warning {{constant expression}} expected-note {{dynamic_cast}}
217c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  };
218c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith}
219c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
220c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// - a reinterpret_cast (5.2.10);
221c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smithnamespace ReinterpretCast {
222c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  struct S { int n; };
223c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr S s { 16 };
224c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  struct T {
225c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    int n : reinterpret_cast<const S*>(&s)->n; // expected-warning {{constant expression}} expected-note {{reinterpret_cast}}
226c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  };
227c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  struct U {
228c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    int m : (long)(S*)6; // expected-warning {{constant expression}} expected-note {{reinterpret_cast}}
229c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  };
230c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith}
231c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
232c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// - a pseudo-destructor call (5.2.4);
233c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smithnamespace PseudoDtor {
234c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  int k;
235c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  typedef int I;
236c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  struct T {
237c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    int n : (k.~I(), 0); // expected-error {{constant expression}} expected-note{{subexpression}}
238c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  };
239c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith}
240c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
241c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// - increment or decrement operations (5.2.6, 5.3.2);
242c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smithnamespace IncDec {
243c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  int k = 2;
244c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  struct T {
245c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    int n : ++k; // expected-error {{constant expression}}
246c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    int m : --k; // expected-error {{constant expression}}
247c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  };
248c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith}
249c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
250c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// - a typeid expression (5.2.8) whose operand is of a polymorphic class type;
251c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smithnamespace std {
252c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  struct type_info {
253c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    virtual ~type_info();
254c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    const char *name;
255c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  };
256c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith}
257c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smithnamespace TypeId {
258c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  struct S { virtual void f(); };
259c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr S *p = 0;
260c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr const std::type_info &ti1 = typeid(*p); // expected-error {{must be initialized by a constant expression}}
261c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
262c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  // FIXME: Implement typeid evaluation.
263c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  struct T {} t;
264c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr const std::type_info &ti2 = typeid(t); // unexpected-error {{must be initialized by a constant expression}}
265c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith}
266c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
267c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// - a new-expression (5.3.4);
268c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// - a delete-expression (5.3.5);
269c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smithnamespace NewDelete {
270c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  int *p = 0;
271c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  struct T {
272c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    int n : *new int(4); // expected-error {{constant expression}} expected-note {{subexpression}}
273c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    int m : (delete p, 2); // expected-error {{constant expression}} expected-note {{subexpression}}
274c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  };
275c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith}
276c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
277c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// - a relational (5.9) or equality (5.10) operator where the result is
278c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith//   unspecified;
279c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smithnamespace UnspecifiedRelations {
280c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  int a, b;
281c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr int *p = &a, *q = &b;
282c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  // C++11 [expr.rel]p2: If two pointers p and q of the same type point to
283c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  // different objects that are not members of the same array or to different
284c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  // functions, or if only one of them is null, the results of p<q, p>q, p<=q,
285c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  // and p>=q are unspecified.
286c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr bool u1 = p < q; // expected-error {{constant expression}}
287c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr bool u2 = p > q; // expected-error {{constant expression}}
288c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr bool u3 = p <= q; // expected-error {{constant expression}}
289c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr bool u4 = p >= q; // expected-error {{constant expression}}
290c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr bool u5 = p < 0; // expected-error {{constant expression}}
291c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr bool u6 = p <= 0; // expected-error {{constant expression}}
292c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr bool u7 = p > 0; // expected-error {{constant expression}}
293c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr bool u8 = p >= 0; // expected-error {{constant expression}}
294c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr bool u9 = 0 < q; // expected-error {{constant expression}}
295c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr bool u10 = 0 <= q; // expected-error {{constant expression}}
296c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr bool u11 = 0 > q; // expected-error {{constant expression}}
297c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr bool u12 = 0 >= q; // expected-error {{constant expression}}
298c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  void f(), g();
299c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
300c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr void (*pf)() = &f, (*pg)() = &g;
301c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr bool u13 = pf < pg; // expected-error {{constant expression}}
302c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr bool u14 = pf == pg;
303c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
304c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  // FIXME:
305c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  // If two pointers point to non-static data members of the same object with
306c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  // different access control, the result is unspecified.
307c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
308c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  // FIXME:
309c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  // [expr.rel]p3: Pointers to void can be compared [...] if both pointers
310c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  // represent the same address or are both the null pointer [...]; otherwise
311c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  // the result is unspecified.
312c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
313c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  // FIXME: Implement comparisons of pointers to members.
314c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  // [expr.eq]p2: If either is a pointer to a virtual member function and
315c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  // neither is null, the result is unspecified.
316c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith}
317c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
318c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// - an assignment or a compound assignment (5.17); or
319c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smithnamespace Assignment {
320c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  int k;
321c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  struct T {
322c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    int n : (k = 9); // expected-error {{constant expression}}
323c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    int m : (k *= 2); // expected-error {{constant expression}}
324c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  };
325c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
326c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  struct Literal {
327c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    constexpr Literal(const char *name) : name(name) {}
328c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    const char *name;
329c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  };
330c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  struct Expr {
331c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    constexpr Expr(Literal l) : IsLiteral(true), l(l) {}
332c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    bool IsLiteral;
333c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    union {
334c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith      Literal l;
335c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith      // ...
336c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    };
337c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  };
338c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  struct MulEq {
339c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    constexpr MulEq(Expr a, Expr b) : LHS(a), RHS(b) {}
340c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    Expr LHS;
341c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    Expr RHS;
342c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  };
343c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  constexpr MulEq operator*=(Expr a, Expr b) { return MulEq(a, b); }
344c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  Literal a("a");
345c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  Literal b("b");
346c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  MulEq c = a *= b; // ok
347c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith}
348c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
349c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith// - a throw-expression (15.1)
350c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smithnamespace Throw {
351c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  struct S {
352c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    int n : (throw "hello", 10); // expected-error {{constant expression}} expected-note {{subexpression}}
353c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  };
354c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith}
35563fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor
35663fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor// PR9999
35763fe6814f339df30b8463b39995947cbdf920e48Douglas Gregortemplate<bool v>
35863fe6814f339df30b8463b39995947cbdf920e48Douglas Gregorclass bitWidthHolding {
35963fe6814f339df30b8463b39995947cbdf920e48Douglas Gregorpublic:
36063fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor  static const
36163fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor  unsigned int width = (v == 0 ? 0 : bitWidthHolding<(v >> 1)>::width + 1);
36263fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor};
36363fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor
36463fe6814f339df30b8463b39995947cbdf920e48Douglas Gregorstatic const int width=bitWidthHolding<255>::width;
36563fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor
36663fe6814f339df30b8463b39995947cbdf920e48Douglas Gregortemplate<bool b>
36763fe6814f339df30b8463b39995947cbdf920e48Douglas Gregorstruct always_false {
36863fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor  static const bool value = false;
36963fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor};
37063fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor
37163fe6814f339df30b8463b39995947cbdf920e48Douglas Gregortemplate<bool b>
37263fe6814f339df30b8463b39995947cbdf920e48Douglas Gregorstruct and_or {
37363fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor  static const bool and_value = b && and_or<always_false<b>::value>::and_value;
37463fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor  static const bool or_value = !b || and_or<always_false<b>::value>::or_value;
37563fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor};
37663fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor
37763fe6814f339df30b8463b39995947cbdf920e48Douglas Gregorstatic const bool and_value = and_or<true>::and_value;
37863fe6814f339df30b8463b39995947cbdf920e48Douglas Gregorstatic const bool or_value = and_or<true>::or_value;
379