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 {
12041080c2SHaojian Wu   int Y = foo();    // expected-error {{use of undeclared identifier 'foo'}} \
13041080c2SHaojian Wu                  // expected-note {{subexpression not valid in a constant expression}}
14041080c2SHaojian Wu   constexpr X2() {} // expected-error {{constexpr constructor never produces a constant expression}}
15041080c2SHaojian Wu };
16041080c2SHaojian Wu 
17*28ccd09dSHaojian Wu struct X3 {
18*28ccd09dSHaojian Wu   int Y;
19*28ccd09dSHaojian Wu   constexpr X3() // expected-error {{constexpr constructor never produces}}
20*28ccd09dSHaojian Wu       : Y(({foo();})) {} // expected-error {{use of undeclared identifier 'foo'}}
21*28ccd09dSHaojian Wu };
22*28ccd09dSHaojian Wu 
23041080c2SHaojian Wu struct CycleDelegate {
24041080c2SHaojian Wu   int Y;
25041080c2SHaojian Wu   CycleDelegate(int)
26041080c2SHaojian Wu       : Y(foo()) {} // expected-error {{use of undeclared identifier 'foo'}}
27041080c2SHaojian Wu   // no bogus "delegation cycle" diagnostic
28041080c2SHaojian Wu   CycleDelegate(float) : CycleDelegate(1) {}
29041080c2SHaojian Wu };
30