p33-0x.cpp revision bca01b46850f867b2f4137f25c882022b58f8471
1// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -std=c++0x -fsyntax-only -verify %s
2class X {
3  X(const X&);
4
5public:
6  X();
7  X(X&&);
8};
9
10X 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
20void throw_move_only(X x) {
21  X x2;
22  throw x;
23  throw x2;
24}
25
26namespace 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