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