Home | History | Annotate | Download | only in class.copy
      1 // RUN: %clang_cc1 -fcxx-exceptions -fexceptions -std=c++11 -fsyntax-only -verify %s
      2 class X {
      3   X(const X&);
      4 
      5 public:
      6   X();
      7   X(X&&);
      8 };
      9 
     10 X return_by_move(int i, X x) {
     11   X x2;
     12   if (i == 0)
     13     return x;
     14   else if (i == 1)
     15     return x2;
     16   else
     17     return x;
     18 }
     19 
     20 void throw_move_only(X x) {
     21   X x2;
     22   throw x;
     23   throw x2;
     24 }
     25 
     26 namespace PR10142 {
     27   struct X {
     28     X();
     29     X(X&&);
     30     X(const X&) = delete; // expected-note 2{{function has been explicitly marked deleted here}}
     31   };
     32 
     33   void f(int i) {
     34     X x;
     35     try {
     36       X x2;
     37       if (i)
     38         throw x2; // okay
     39       throw x; // expected-error{{call to deleted constructor of 'PR10142::X'}}
     40     } catch (...) {
     41     }
     42   }
     43 
     44   template<typename T>
     45   void f2(int i) {
     46     T x;
     47     try {
     48       T x2;
     49       if (i)
     50         throw x2; // okay
     51       throw x; // expected-error{{call to deleted constructor of 'PR10142::X'}}
     52     } catch (...) {
     53     }
     54   }
     55 
     56   template void f2<X>(int); // expected-note{{in instantiation of function template specialization 'PR10142::f2<PR10142::X>' requested here}}
     57 }
     58