154042f1bd78f1f1ea86be7d4af541462e127d2edDouglas Gregor// RUN: %clang_cc1 -fsyntax-only -std=c++11 %s -verify
254042f1bd78f1f1ea86be7d4af541462e127d2edDouglas Gregor
354042f1bd78f1f1ea86be7d4af541462e127d2edDouglas Gregorvoid missing_lambda_declarator() {
454042f1bd78f1f1ea86be7d4af541462e127d2edDouglas Gregor  [](){}();
554042f1bd78f1f1ea86be7d4af541462e127d2edDouglas Gregor}
654042f1bd78f1f1ea86be7d4af541462e127d2edDouglas Gregor
754042f1bd78f1f1ea86be7d4af541462e127d2edDouglas Gregortemplate<typename T> T get();
854042f1bd78f1f1ea86be7d4af541462e127d2edDouglas Gregor
954042f1bd78f1f1ea86be7d4af541462e127d2edDouglas Gregorvoid infer_void_return_type(int i) {
1054042f1bd78f1f1ea86be7d4af541462e127d2edDouglas Gregor  if (i > 17)
1154042f1bd78f1f1ea86be7d4af541462e127d2edDouglas Gregor    return []() { }();
1254042f1bd78f1f1ea86be7d4af541462e127d2edDouglas Gregor
1354042f1bd78f1f1ea86be7d4af541462e127d2edDouglas Gregor  if (i > 11)
1454042f1bd78f1f1ea86be7d4af541462e127d2edDouglas Gregor    return []() { return; }();
1554042f1bd78f1f1ea86be7d4af541462e127d2edDouglas Gregor
1654042f1bd78f1f1ea86be7d4af541462e127d2edDouglas Gregor  return [](int x) {
1754042f1bd78f1f1ea86be7d4af541462e127d2edDouglas Gregor    switch (x) {
1854042f1bd78f1f1ea86be7d4af541462e127d2edDouglas Gregor    case 0: return get<void>();
1954042f1bd78f1f1ea86be7d4af541462e127d2edDouglas Gregor    case 1: return;
20a0c2b21e0d84ad289781e08e14148da6b8b8b76dDouglas Gregor    case 2: return { 1, 2.0 }; // expected-error{{cannot deduce lambda return type from initializer list}}
2154042f1bd78f1f1ea86be7d4af541462e127d2edDouglas Gregor    }
2254042f1bd78f1f1ea86be7d4af541462e127d2edDouglas Gregor  }(7);
2354042f1bd78f1f1ea86be7d4af541462e127d2edDouglas Gregor}
2454042f1bd78f1f1ea86be7d4af541462e127d2edDouglas Gregor
2554042f1bd78f1f1ea86be7d4af541462e127d2edDouglas Gregorstruct X { };
2654042f1bd78f1f1ea86be7d4af541462e127d2edDouglas Gregor
2754042f1bd78f1f1ea86be7d4af541462e127d2edDouglas GregorX infer_X_return_type(X x) {
2854042f1bd78f1f1ea86be7d4af541462e127d2edDouglas Gregor  return [&x](int y) { // expected-warning{{omitted result type}}
2954042f1bd78f1f1ea86be7d4af541462e127d2edDouglas Gregor    if (y > 0)
3054042f1bd78f1f1ea86be7d4af541462e127d2edDouglas Gregor      return X();
3154042f1bd78f1f1ea86be7d4af541462e127d2edDouglas Gregor    else
3254042f1bd78f1f1ea86be7d4af541462e127d2edDouglas Gregor      return x;
3354042f1bd78f1f1ea86be7d4af541462e127d2edDouglas Gregor  }(5);
3454042f1bd78f1f1ea86be7d4af541462e127d2edDouglas Gregor}
3554042f1bd78f1f1ea86be7d4af541462e127d2edDouglas Gregor
3654042f1bd78f1f1ea86be7d4af541462e127d2edDouglas GregorX infer_X_return_type_fail(X x) {
3754042f1bd78f1f1ea86be7d4af541462e127d2edDouglas Gregor  return [x](int y) { // expected-warning{{omitted result type}}
3854042f1bd78f1f1ea86be7d4af541462e127d2edDouglas Gregor    if (y > 0)
3954042f1bd78f1f1ea86be7d4af541462e127d2edDouglas Gregor      return X();
404e88df72e690498aeba2dc3d5089388b27be66faDouglas Gregor    else
414e88df72e690498aeba2dc3d5089388b27be66faDouglas Gregor      return x; // expected-error{{return type 'const X' must match previous return type 'X' when lambda expression has unspecified explicit return type}}
4254042f1bd78f1f1ea86be7d4af541462e127d2edDouglas Gregor  }(5);
4354042f1bd78f1f1ea86be7d4af541462e127d2edDouglas Gregor}
4453393f23d8b767f976427a6d45b310bf37dd91c4Douglas Gregor
4553393f23d8b767f976427a6d45b310bf37dd91c4Douglas Gregorstruct Incomplete; // expected-note{{forward declaration of 'Incomplete'}}
4653393f23d8b767f976427a6d45b310bf37dd91c4Douglas Gregorvoid test_result_type(int N) {
4753393f23d8b767f976427a6d45b310bf37dd91c4Douglas Gregor  auto l1 = [] () -> Incomplete { }; // expected-error{{incomplete result type 'Incomplete' in lambda expression}}
4853393f23d8b767f976427a6d45b310bf37dd91c4Douglas Gregor
4953393f23d8b767f976427a6d45b310bf37dd91c4Douglas Gregor  typedef int vla[N];
5053393f23d8b767f976427a6d45b310bf37dd91c4Douglas Gregor  auto l2 = [] () -> vla { }; // expected-error{{function cannot return array type 'vla' (aka 'int [N]')}}
5153393f23d8b767f976427a6d45b310bf37dd91c4Douglas Gregor}
52