Home | History | Annotate | Download | only in expr.prim.lambda
      1 // RUN: %clang_cc1 -fsyntax-only -std=c++11 %s -verify
      2 
      3 void defargs() {
      4   auto l1 = [](int i, int j = 17, int k = 18) { return i + j + k; };
      5   int i1 = l1(1);
      6   int i2 = l1(1, 2);
      7   int i3 = l1(1, 2, 3);
      8 }
      9 
     10 
     11 void defargs_errors() {
     12   auto l1 = [](int i,
     13                int j = 17,
     14                int k) { }; // expected-error{{missing default argument on parameter 'k'}}
     15 
     16   auto l2 = [](int i, int j = i) {}; // expected-error{{default argument references parameter 'i'}}
     17 
     18   int foo;
     19   auto l3 = [](int i = foo) {}; // expected-error{{default argument references local variable 'foo' of enclosing function}}
     20 }
     21 
     22 struct NonPOD {
     23   NonPOD();
     24   NonPOD(const NonPOD&);
     25   ~NonPOD();
     26 };
     27 
     28 struct NoDefaultCtor {
     29   NoDefaultCtor(const NoDefaultCtor&); // expected-note{{candidate constructor}} \
     30                                        // expected-note{{candidate constructor not viable: requires 1 argument, but 0 were provided}}
     31   ~NoDefaultCtor();
     32 };
     33 
     34 template<typename T>
     35 void defargs_in_template_unused(T t) {
     36   auto l1 = [](const T& value = T()) { };  // expected-error{{no matching constructor for initialization of 'NoDefaultCtor'}}
     37   l1(t);
     38 }
     39 
     40 template void defargs_in_template_unused(NonPOD);
     41 template void defargs_in_template_unused(NoDefaultCtor);  // expected-note{{in instantiation of function template specialization 'defargs_in_template_unused<NoDefaultCtor>' requested here}}
     42 
     43 template<typename T>
     44 void defargs_in_template_used() {
     45   auto l1 = [](const T& value = T()) { }; // expected-error{{no matching constructor for initialization of 'NoDefaultCtor'}} \
     46                                           // expected-note{{candidate function not viable: requires single argument 'value', but no arguments were provided}} \
     47                                           // expected-note{{conversion candidate of type 'void (*)(const NoDefaultCtor &)'}}
     48   l1(); // expected-error{{no matching function for call to object of type '(lambda at }}
     49 }
     50 
     51 template void defargs_in_template_used<NonPOD>();
     52 template void defargs_in_template_used<NoDefaultCtor>(); // expected-note{{in instantiation of function template specialization}}
     53 
     54