18d9bd653fc99e91ac79dbeb7cfa2abf18eda4d04Douglas Gregor// RUN: %clang_cc1 -std=c++11 %s -Winvalid-noreturn -verify
2b710dfe5231b0cd44dd987b9bd33c7f6ac165807Douglas Gregor
38d9bd653fc99e91ac79dbeb7cfa2abf18eda4d04Douglas Gregor// An attribute-specifier-seq in a lambda-declarator appertains to the
48d9bd653fc99e91ac79dbeb7cfa2abf18eda4d04Douglas Gregor// type of the corresponding function call operator.
58d9bd653fc99e91ac79dbeb7cfa2abf18eda4d04Douglas Gregorvoid test_attributes() {
6793cd1c4cdfaafc52e2c2ad9dae959befe4bb166Douglas Gregor  auto nrl = [](int x) -> int { if (x > 0) return x; }; // expected-warning{{control may reach end of non-void lambda}}
7793cd1c4cdfaafc52e2c2ad9dae959befe4bb166Douglas Gregor
8cd8ab51a44e80625d84126780b0d85a7732e25afRichard Smith  // FIXME: GCC accepts the [[gnu::noreturn]] attribute here.
9cd8ab51a44e80625d84126780b0d85a7732e25afRichard Smith  auto nrl2 = []() [[gnu::noreturn]] { return; }; // expected-warning{{attribute 'noreturn' ignored}}
108d9bd653fc99e91ac79dbeb7cfa2abf18eda4d04Douglas Gregor}
118d9bd653fc99e91ac79dbeb7cfa2abf18eda4d04Douglas Gregor
128d9bd653fc99e91ac79dbeb7cfa2abf18eda4d04Douglas Gregortemplate<typename T>
138d9bd653fc99e91ac79dbeb7cfa2abf18eda4d04Douglas Gregorstruct bogus_override_if_virtual : public T {
14215e4e17d00e12c38687a95502506d8f2ca3e646Douglas Gregor  bogus_override_if_virtual() : T(*(T*)0) { }
158d9bd653fc99e91ac79dbeb7cfa2abf18eda4d04Douglas Gregor  int operator()() const;
168d9bd653fc99e91ac79dbeb7cfa2abf18eda4d04Douglas Gregor};
178d9bd653fc99e91ac79dbeb7cfa2abf18eda4d04Douglas Gregor
188d9bd653fc99e91ac79dbeb7cfa2abf18eda4d04Douglas Gregorvoid test_quals() {
198d9bd653fc99e91ac79dbeb7cfa2abf18eda4d04Douglas Gregor  // This function call operator is declared const (9.3.1) if and only
208d9bd653fc99e91ac79dbeb7cfa2abf18eda4d04Douglas Gregor  // if the lambda- expression's parameter-declaration-clause is not
218d9bd653fc99e91ac79dbeb7cfa2abf18eda4d04Douglas Gregor  // followed by mutable.
22ef7d78bd5be466c369b04af742ed8268244d4fe7Douglas Gregor  auto l = [=](){}; // expected-note{{method is not marked volatile}}
238d9bd653fc99e91ac79dbeb7cfa2abf18eda4d04Douglas Gregor  const decltype(l) lc = l;
248d9bd653fc99e91ac79dbeb7cfa2abf18eda4d04Douglas Gregor  l();
258d9bd653fc99e91ac79dbeb7cfa2abf18eda4d04Douglas Gregor  lc();
268d9bd653fc99e91ac79dbeb7cfa2abf18eda4d04Douglas Gregor
27ef7d78bd5be466c369b04af742ed8268244d4fe7Douglas Gregor  auto ml = [=]() mutable{}; // expected-note{{method is not marked const}} \
28ef7d78bd5be466c369b04af742ed8268244d4fe7Douglas Gregor                             // expected-note{{method is not marked volatile}}
298d9bd653fc99e91ac79dbeb7cfa2abf18eda4d04Douglas Gregor  const decltype(ml) mlc = ml;
308d9bd653fc99e91ac79dbeb7cfa2abf18eda4d04Douglas Gregor  ml();
318d9bd653fc99e91ac79dbeb7cfa2abf18eda4d04Douglas Gregor  mlc(); // expected-error{{no matching function for call to object of type}}
328d9bd653fc99e91ac79dbeb7cfa2abf18eda4d04Douglas Gregor
338d9bd653fc99e91ac79dbeb7cfa2abf18eda4d04Douglas Gregor  // It is neither virtual nor declared volatile.
348d9bd653fc99e91ac79dbeb7cfa2abf18eda4d04Douglas Gregor  volatile decltype(l) lv = l;
358d9bd653fc99e91ac79dbeb7cfa2abf18eda4d04Douglas Gregor  volatile decltype(ml) mlv = ml;
368d9bd653fc99e91ac79dbeb7cfa2abf18eda4d04Douglas Gregor  lv(); // expected-error{{no matching function for call to object of type}}
378d9bd653fc99e91ac79dbeb7cfa2abf18eda4d04Douglas Gregor  mlv(); // expected-error{{no matching function for call to object of type}}
388d9bd653fc99e91ac79dbeb7cfa2abf18eda4d04Douglas Gregor
398d9bd653fc99e91ac79dbeb7cfa2abf18eda4d04Douglas Gregor  bogus_override_if_virtual<decltype(l)> bogus;
408d9bd653fc99e91ac79dbeb7cfa2abf18eda4d04Douglas Gregor}
418d9bd653fc99e91ac79dbeb7cfa2abf18eda4d04Douglas Gregor
427974c60375b2b9dfc20defc77c9ed8c3d6d241a1Richard Smith// Core issue 974: default arguments (8.3.6) may be specified in the
437974c60375b2b9dfc20defc77c9ed8c3d6d241a1Richard Smith// parameter-declaration-clause of a lambda-declarator.
44b710dfe5231b0cd44dd987b9bd33c7f6ac165807Douglas Gregorint test_default_args() {
457974c60375b2b9dfc20defc77c9ed8c3d6d241a1Richard Smith  return [](int i = 5, int j = 17) { return i+j;}(5, 6);
468d9bd653fc99e91ac79dbeb7cfa2abf18eda4d04Douglas Gregor}
478d9bd653fc99e91ac79dbeb7cfa2abf18eda4d04Douglas Gregor
488d9bd653fc99e91ac79dbeb7cfa2abf18eda4d04Douglas Gregor// Any exception-specification specified on a lambda-expression
498d9bd653fc99e91ac79dbeb7cfa2abf18eda4d04Douglas Gregor// applies to the corresponding function call operator.
508d9bd653fc99e91ac79dbeb7cfa2abf18eda4d04Douglas Gregorvoid test_exception_spec() {
518d9bd653fc99e91ac79dbeb7cfa2abf18eda4d04Douglas Gregor  auto tl1 = []() throw(int) {};
528d9bd653fc99e91ac79dbeb7cfa2abf18eda4d04Douglas Gregor  auto tl2 = []() {};
538d9bd653fc99e91ac79dbeb7cfa2abf18eda4d04Douglas Gregor  static_assert(!noexcept(tl1()), "lambda can throw");
548d9bd653fc99e91ac79dbeb7cfa2abf18eda4d04Douglas Gregor  static_assert(!noexcept(tl2()), "lambda can throw");
558d9bd653fc99e91ac79dbeb7cfa2abf18eda4d04Douglas Gregor
568d9bd653fc99e91ac79dbeb7cfa2abf18eda4d04Douglas Gregor  auto ntl1 = []() throw() {};
578d9bd653fc99e91ac79dbeb7cfa2abf18eda4d04Douglas Gregor  auto ntl2 = []() noexcept(true) {};
588d9bd653fc99e91ac79dbeb7cfa2abf18eda4d04Douglas Gregor  auto ntl3 = []() noexcept {};
598d9bd653fc99e91ac79dbeb7cfa2abf18eda4d04Douglas Gregor  static_assert(noexcept(ntl1()), "lambda cannot throw");
608d9bd653fc99e91ac79dbeb7cfa2abf18eda4d04Douglas Gregor  static_assert(noexcept(ntl2()), "lambda cannot throw");
618d9bd653fc99e91ac79dbeb7cfa2abf18eda4d04Douglas Gregor  static_assert(noexcept(ntl3()), "lambda cannot throw");
62b710dfe5231b0cd44dd987b9bd33c7f6ac165807Douglas Gregor}
638d9bd653fc99e91ac79dbeb7cfa2abf18eda4d04Douglas Gregor
64