// RUN: %clang_cc1 -fsyntax-only -std=c++11 %s -verify
template<typename T> void capture(const T&);
class NonCopyable {
NonCopyable(const NonCopyable&); // expected-note 2 {{implicitly declared private here}}
public:
void foo() const;
};
class NonConstCopy {
public:
NonConstCopy(NonConstCopy&); // expected-note{{would lose const}}
};
void capture_by_copy(NonCopyable nc, NonCopyable &ncr, const NonConstCopy nco) {
(void)[nc] { }; // expected-error{{capture of variable 'nc' as type 'NonCopyable' calls private copy constructor}}
(void)[=] {
ncr.foo(); // expected-error{{capture of variable 'ncr' as type 'NonCopyable' calls private copy constructor}}
}();
[nco] {}(); // expected-error{{no matching constructor for initialization of 'const NonConstCopy'}}
}
struct NonTrivial {
NonTrivial();
NonTrivial(const NonTrivial &);
~NonTrivial();
};
struct CopyCtorDefault {
CopyCtorDefault();
CopyCtorDefault(const CopyCtorDefault&, NonTrivial nt = NonTrivial());
void foo() const;
};
void capture_with_default_args(CopyCtorDefault cct) {
(void)[=] () -> void { cct.foo(); };
}
struct ExpectedArrayLayout {
CopyCtorDefault array[3];
};
void capture_array() {
CopyCtorDefault array[3];
auto x = [=]() -> void {
capture(array[0]);
};
static_assert(sizeof(x) == sizeof(ExpectedArrayLayout), "layout mismatch");
}
// Check for the expected non-static data members.
struct ExpectedLayout {
char a;
short b;
};
void test_layout(char a, short b) {
auto x = [=] () -> void {
capture(a);
capture(b);
};
static_assert(sizeof(x) == sizeof(ExpectedLayout), "Layout mismatch!");
}
struct ExpectedThisLayout {
ExpectedThisLayout* a;
void f() {
auto x = [this]() -> void {};
static_assert(sizeof(x) == sizeof(ExpectedThisLayout), "Layout mismatch!");
}
};
struct CaptureArrayAndThis {
int value;
void f() {
int array[3];
[=]() -> int {
int result = value;
for (unsigned i = 0; i < 3; ++i)
result += array[i];
return result;
}();
}
};
namespace rdar14468891 {
class X {
public:
virtual ~X() = 0; // expected-note{{unimplemented pure virtual method '~X' in 'X'}}
};
class Y : public X { };
void capture(X &x) {
[x]() {}(); // expected-error{{by-copy capture of value of abstract type 'rdar14468891::X'}}
}
}
namespace rdar15560464 {
struct X; // expected-note{{forward declaration of 'rdar15560464::X'}}
void foo(const X& param) {
auto x = ([=]() {
auto& y = param; // expected-error{{by-copy capture of variable 'param' with incomplete type 'const rdar15560464::X'}}
});
}
}