| // RUN: %clang_cc1 -triple x86_64-linux-gnu -fsyntax-only -std=c++17 -verify=expected %s |
| // RUN: %clang_cc1 -triple x86_64-linux-gnu -fsyntax-only -std=c++17 -verify=expected %s -fexperimental-new-constant-interpreter |
| constexpr void undefined(); // expected-note 4 {{declared here}} |
| static constexpr int r = [] { // expected-error {{constexpr variable 'r' must be initialized by a constant expression}} \ |
| expected-note {{in call to '[] {}.operator()()'}}} |
| undefined(); // expected-note {{undefined function 'undefined' cannot be used in a constant expression}} |
| return 0; |
| }(); |
| |
| static constexpr auto valid_lambda = [] {}; |
| |
| static constexpr int nested = [] { // expected-error {{constexpr variable 'nested' must be initialized by a constant expression}} \ |
| expected-note {{in call to '[] {}.operator()()'}}} |
| valid_lambda(); |
| auto inner = [] { // expected-note {{in call to '[] {}.operator()()'}}} |
| undefined(); // expected-note {{undefined function 'undefined' cannot be used in a constant expression}} |
| return 1; |
| }(); |
| return 0; |
| }(); |
| |
| static constexpr float type_mismatch = [] { // expected-error {{cannot initialize a variable of type 'const float' with an rvalue of type 'void'}} |
| }(); |
| |
| constexpr auto named_lambda = [] { |
| undefined(); // expected-note {{undefined function 'undefined' cannot be used in a constant expression}} |
| return 0; |
| }; |
| |
| static constexpr int named_lambda_result = named_lambda(); // expected-error {{constexpr variable 'named_lambda_result' must be initialized by a constant expression}} \ |
| expected-note {{in call to 'named_lambda.operator()()'}} |
| |
| static constexpr int undeclared = []{ // expected-error {{constexpr variable 'undeclared' must be initialized by a constant expression}} |
| foo(); // expected-error {{use of undeclared identifier 'foo'}} |
| return 0; |
| }(); |
| |
| |
| static constexpr int with_param = [](int x) { // expected-error {{constexpr variable 'with_param' must be initialized by a constant expression}} \ |
| expected-note {{in call to '[](int x) {}.operator()(2)'}} |
| undefined(); // expected-note {{undefined function 'undefined' cannot be used in a constant expression}} |
| return x; |
| }(2); |