brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.6 KiB · b570a96 Raw
112 lines · cpp
1// RUN: %clang_cc1 -fsyntax-only -std=c++11 %s -verify2 3template<typename T> void capture(const T&);4 5class NonCopyable {6  NonCopyable(const NonCopyable&); // expected-note 2 {{implicitly declared private here}}7public:8  void foo() const;9};10 11class NonConstCopy {12public:13  NonConstCopy(NonConstCopy&); // expected-note{{would lose const}}14};15 16void capture_by_copy(NonCopyable nc, NonCopyable &ncr, const NonConstCopy nco) {17  (void)[nc] { }; // expected-error{{capture of variable 'nc' as type 'NonCopyable' calls private copy constructor}}18  (void)[=] { // expected-error{{capture of variable 'ncr' as type 'NonCopyable' calls private copy constructor}}19    ncr.foo();20  }();21 22  [nco] {}(); // expected-error{{no matching constructor for initialization of 'const NonConstCopy'}}23}24 25struct NonTrivial {26  NonTrivial();27  NonTrivial(const NonTrivial &);28  ~NonTrivial();29};30 31struct CopyCtorDefault {32  CopyCtorDefault();33  CopyCtorDefault(const CopyCtorDefault&, NonTrivial nt = NonTrivial());34 35  void foo() const;36};37 38void capture_with_default_args(CopyCtorDefault cct) {39  (void)[=] () -> void { cct.foo(); };40}41 42struct ExpectedArrayLayout {43  CopyCtorDefault array[3];44};45 46void capture_array() {47  CopyCtorDefault array[3];48  auto x = [=]() -> void {49    capture(array[0]);50  };51  static_assert(sizeof(x) == sizeof(ExpectedArrayLayout), "layout mismatch");52}53 54// Check for the expected non-static data members.55 56struct ExpectedLayout {57  char a;58  short b;59};60 61void test_layout(char a, short b) {62  auto x = [=] () -> void {63    capture(a);64    capture(b);65  };66  static_assert(sizeof(x) == sizeof(ExpectedLayout), "Layout mismatch!");67}68 69struct ExpectedThisLayout {70  ExpectedThisLayout* a;71  void f() {72    auto x = [this]() -> void {};73    static_assert(sizeof(x) == sizeof(ExpectedThisLayout), "Layout mismatch!");74  }75};76 77struct CaptureArrayAndThis {78  int value;79 80  void f() {81    int array[3];82    [=]() -> int {83      int result = value;84      for (unsigned i = 0; i < 3; ++i)85        result += array[i];86      return result;87    }();88  }89};90 91namespace rdar14468891 {92  class X {93  public:94    virtual ~X() = 0; // expected-note{{unimplemented pure virtual method '~X' in 'X'}}95  };96 97  class Y : public X { };98 99  void capture(X &x) {100    [x]() {}(); // expected-error{{by-copy capture of value of abstract type 'X'}}101  }102}103 104namespace rdar15560464 {105  struct X; // expected-note{{forward declaration of 'rdar15560464::X'}}106  void foo(const X& param) {107    auto x = ([=]() {108        auto& y = param; // expected-error{{by-copy capture of variable 'param' with incomplete type 'const X'}}109      });110  }111}112