1041080c2SHaojian Wu // RUN: %clang_cc1 -frecovery-ast -verify %s
2041080c2SHaojian Wu 
3041080c2SHaojian Wu struct X {
4041080c2SHaojian Wu   int Y;
5041080c2SHaojian Wu   constexpr X() // expected-error {{constexpr constructor never produces}}
6041080c2SHaojian Wu       : Y(foo()) {} // expected-error {{use of undeclared identifier 'foo'}}
7041080c2SHaojian Wu };
8041080c2SHaojian Wu // no crash on evaluating the constexpr ctor.
9041080c2SHaojian Wu constexpr int Z = X().Y; // expected-error {{constexpr variable 'Z' must be initialized by a constant expression}}
10041080c2SHaojian Wu 
11041080c2SHaojian Wu struct X2 {
12*f8f1e5fbSHaojian Wu   int Y = foo();    // expected-error {{use of undeclared identifier 'foo'}}
13041080c2SHaojian Wu   constexpr X2() {} // expected-error {{constexpr constructor never produces a constant expression}}
14041080c2SHaojian Wu };
15041080c2SHaojian Wu 
1628ccd09dSHaojian Wu struct X3 {
1728ccd09dSHaojian Wu   int Y;
1828ccd09dSHaojian Wu   constexpr X3() // expected-error {{constexpr constructor never produces}}
1928ccd09dSHaojian Wu       : Y(({foo();})) {} // expected-error {{use of undeclared identifier 'foo'}}
2028ccd09dSHaojian Wu };
2128ccd09dSHaojian Wu 
22041080c2SHaojian Wu struct CycleDelegate {
23041080c2SHaojian Wu   int Y;
24041080c2SHaojian Wu   CycleDelegate(int)
25041080c2SHaojian Wu       : Y(foo()) {} // expected-error {{use of undeclared identifier 'foo'}}
26041080c2SHaojian Wu   // no bogus "delegation cycle" diagnostic
27041080c2SHaojian Wu   CycleDelegate(float) : CycleDelegate(1) {}
28041080c2SHaojian Wu };
29*f8f1e5fbSHaojian Wu 
30*f8f1e5fbSHaojian Wu struct X4 {
31*f8f1e5fbSHaojian Wu   int* p = new int(invalid()); // expected-error {{use of undeclared identifier}}
32*f8f1e5fbSHaojian Wu };
33*f8f1e5fbSHaojian Wu // no crash on evaluating the CXXDefaultInitExpr.
34*f8f1e5fbSHaojian Wu constexpr int* s = X4().p; // expected-error {{must be initialized by}}
35