Corentin Jabot 69dd89fdcb [Clang] Fix references to captured variables in dependant context.
D119136 changed how captures are handled in a lambda call operator
declaration, but did not properly handled dependant context,
which led to crash when refering to init-captures in
a trailing return type.

We fix that bug by making transformations more symetric with parsing,
ie. we first create the call operator, then transform the capture,
then compute the type of the lambda call operaror.

This ensures captures exist and have the right type when
we parse a trailing requires-clause / return type.

Reviewed By: aaron.ballman

Differential Revision: https://reviews.llvm.org/D124012
2022-04-20 15:35:20 +02:00

64 lines
1.5 KiB
C++

// RUN: %clang_cc1 -fsyntax-only -std=c++11 %s -verify
// RUN: %clang_cc1 -fsyntax-only -std=c++1y %s -verify -DCPP1Y
void missing_lambda_declarator() {
[](){}();
}
template<typename T> T get();
void infer_void_return_type(int i) {
if (i > 17)
return []() { }();
if (i > 11)
return []() { return; }();
return [](int x) {
switch (x) {
case 0: return get<void>();
case 1: return;
case 2: return { 1, 2.0 }; //expected-error{{cannot deduce}}
}
}(7);
}
struct X { };
X infer_X_return_type(X x) {
return [&x](int y) {
if (y > 0)
return X();
else
return x;
}(5);
}
X infer_X_return_type_2(X x) {
return [x](int y) {
if (y > 0)
return X();
else
return x; // ok even in c++11, per dr1048.
}(5);
}
struct Incomplete; // expected-note 2{{forward declaration of 'Incomplete'}}
void test_result_type(int N) {
auto l1 = [] () -> Incomplete { }; // expected-error{{incomplete result type 'Incomplete' in lambda expression}}
typedef int vla[N];
auto l2 = [] () -> vla { }; // expected-error{{function cannot return array type 'vla' (aka 'int[N]')}}
}
template <typename T>
void test_result_type_tpl(int N) {
auto l1 = []() -> T {}; // expected-error{{incomplete result type 'Incomplete' in lambda expression}}
typedef int vla[N];
auto l2 = []() -> vla {}; // expected-error{{function cannot return array type 'vla' (aka 'int[N]')}}
}
void test_result_type_call() {
test_result_type_tpl<Incomplete>(10); // expected-note {{requested here}}
}