| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- // 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'}}
- });
- }
- }
|