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
64 lines
1.5 KiB
C++
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}}
|
|
}
|