Home | History | Annotate | Download | only in SemaCXX
      1 // RUN: %clang_cc1 -std=c++11 -verify %s
      2 
      3 // rdar://12240916 stack overflow.
      4 namespace rdar12240916 {
      5 
      6 struct S2 {
      7   S2(const S2&);
      8   S2();
      9 };
     10 
     11 struct S { // expected-note {{not complete}}
     12   S x; // expected-error {{incomplete type}}
     13   S2 y;
     14 };
     15 
     16 S foo() {
     17   S s;
     18   return s;
     19 }
     20 
     21 struct S3; // expected-note {{forward declaration}}
     22 
     23 struct S4 {
     24   S3 x; // expected-error {{incomplete type}}
     25   S2 y;
     26 };
     27 
     28 struct S3 {
     29   S4 x;
     30   S2 y;
     31 };
     32 
     33 S4 foo2() {
     34   S4 s;
     35   return s;
     36 }
     37 
     38 }
     39 
     40 // rdar://12542261 stack overflow.
     41 namespace rdar12542261 {
     42 
     43 template <class _Tp>
     44 struct check_complete
     45 {
     46   static_assert(sizeof(_Tp) > 0, "Type must be complete.");
     47 };
     48 
     49 
     50 template<class _Rp>
     51 class function // expected-note 2 {{candidate}}
     52 {
     53 public:
     54   template<class _Fp>
     55   function(_Fp, typename check_complete<_Fp>::type* = 0);  // expected-note {{candidate}}
     56 };
     57 
     58 void foobar()
     59 {
     60   auto LeftCanvas = new Canvas(); // expected-error {{unknown type name}}
     61   function<void()> m_OnChange = [&, LeftCanvas]() { }; // expected-error {{no viable conversion}}
     62 }
     63 
     64 }
     65 
     66 namespace b6981007 {
     67   struct S {}; // expected-note 3{{candidate}}
     68   void f() {
     69     S s(1, 2, 3); // expected-error {{no matching}}
     70     for (auto x : s) {
     71       // We used to attempt to evaluate the initializer of this variable,
     72       // and crash because it has an undeduced type.
     73       // FIXME: We should set the loop variable to be invalid if we can't build
     74       // the loop, to suppress this follow-on error.
     75       const int &n(x); // expected-error {{could not bind to an lvalue of type 'auto'}}
     76     }
     77   }
     78 }
     79