p5.cpp revision 745f5147e065900267c85a5568785a1991d4838f
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 -fcxx-exceptions %s
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace StdExample {
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)constexpr int f(void *) { return 0; }
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)constexpr int f(...) { return 1; }
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)constexpr int g1() { return f(0); }
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)constexpr int g2(int n) { return f(n); }
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)constexpr int g3(int n) { return f(n*0); }
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace N {
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  constexpr int c = 5;
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  constexpr int h() { return c; }
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)constexpr int c = 0;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)constexpr int g4() { return N::h(); }
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static_assert(f(0) == 0, "");
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static_assert(f('0') == 1, "");
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static_assert(g1() == 0, "");
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static_assert(g2(0) == 1, "");
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static_assert(g2(1) == 1, "");
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static_assert(g3(0) == 1, "");
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static_assert(g3(1) == 1, "");
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static_assert(N::h() == 5, "");
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static_assert(g4() == 5, "");
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)constexpr int f(bool b)
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  { return b ? throw 0 : 0; } // ok
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)constexpr int f() { return throw 0, 0; } // expected-error {{constexpr function never produces a constant expression}} expected-note {{subexpression}}
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct B {
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  constexpr B(int x) : i(0) { }
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int i;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)int global; // expected-note {{declared here}}
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct D : B {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  constexpr D() : B(global) { } // expected-error {{constexpr constructor never produces a constant expression}} expected-note {{read of non-const}}
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace PotentialConstant {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)constexpr int Comma(int n) { return // expected-error {{constexpr function never produces a constant expression}}
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (void)(n * 2),
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  throw 0, // expected-note {{subexpression}}
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
53
54int ng; // expected-note 5{{here}}
55constexpr int BinaryOp1(int n) { return n + ng; } // expected-error {{never produces}} expected-note {{read}}
56constexpr int BinaryOp2(int n) { return ng + n; } // expected-error {{never produces}} expected-note {{read}}
57
58double dg; // expected-note 2{{here}}
59constexpr double BinaryOp1(double d) { return d + dg; } // expected-error {{never produces}} expected-note {{read}}
60constexpr double BinaryOp2(double d) { return dg + d; } // expected-error {{never produces}} expected-note {{read}}
61
62constexpr int Add(int a, int b, int c) { return a + b + c; }
63constexpr int FunctionArgs(int a) { return Add(a, ng, a); } // expected-error {{never produces}} expected-note {{read}}
64
65struct S { int a; int b; int c[2]; };
66constexpr S InitList(int a) { return { a, ng }; }; // expected-error {{never produces}} expected-note {{read}}
67constexpr S InitList2(int a) { return { a, a, { ng } }; }; // expected-error {{never produces}} expected-note {{read}}
68
69constexpr S InitList3(int a) { return a ? (S){ a, a } : (S){ a, ng }; }; // ok
70
71// FIXME: Check both arms of a ?: if the conditional is a potential constant
72// expression with an unknown value, and diagnose if neither is constant.
73constexpr S InitList4(int a) { return a ? (S){ a, ng } : (S){ a, ng }; };
74
75}
76