default-arguments.cpp 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. // RUN: %clang_cc1 -fsyntax-only -std=c++11 %s -verify
  2. void defargs() {
  3. auto l1 = [](int i, int j = 17, int k = 18) { return i + j + k; };
  4. int i1 = l1(1);
  5. int i2 = l1(1, 2);
  6. int i3 = l1(1, 2, 3);
  7. }
  8. void defargs_errors() {
  9. auto l1 = [](int i,
  10. int j = 17,
  11. int k) { }; // expected-error{{missing default argument on parameter 'k'}}
  12. auto l2 = [](int i, int j = i) {}; // expected-error{{default argument references parameter 'i'}}
  13. int foo;
  14. auto l3 = [](int i = foo) {}; // expected-error{{default argument references local variable 'foo' of enclosing function}}
  15. }
  16. struct NonPOD {
  17. NonPOD();
  18. NonPOD(const NonPOD&);
  19. ~NonPOD();
  20. };
  21. struct NoDefaultCtor {
  22. NoDefaultCtor(const NoDefaultCtor&); // expected-note{{candidate constructor}}
  23. ~NoDefaultCtor();
  24. };
  25. template<typename T>
  26. void defargs_in_template_unused(T t) {
  27. auto l1 = [](const T& value = T()) { };
  28. l1(t);
  29. }
  30. template void defargs_in_template_unused(NonPOD);
  31. template void defargs_in_template_unused(NoDefaultCtor);
  32. template<typename T>
  33. void defargs_in_template_used() {
  34. auto l1 = [](const T& value = T()) { }; // expected-error{{no matching constructor for initialization of 'NoDefaultCtor'}}
  35. l1(); // expected-note{{in instantiation of default function argument expression for 'operator()<NoDefaultCtor>' required here}}
  36. }
  37. template void defargs_in_template_used<NonPOD>();
  38. template void defargs_in_template_used<NoDefaultCtor>(); // expected-note{{in instantiation of function template specialization}}