1 // RUN: %clang_cc1 -fsyntax-only -Wself-move -std=c++11 -verify %s
2 
3 // definitions for std::move
4 namespace std {
5 inline namespace foo {
6 template <class T> struct remove_reference { typedef T type; };
7 template <class T> struct remove_reference<T&> { typedef T type; };
8 template <class T> struct remove_reference<T&&> { typedef T type; };
9 
10 template <class T> typename remove_reference<T>::type &&move(T &&t);
11 }
12 }
13 
int_test()14 void int_test() {
15   int x = 5;
16   x = std::move(x);  // expected-warning{{explicitly moving}}
17   (x) = std::move(x);  // expected-warning{{explicitly moving}}
18 
19   using std::move;
20   x = move(x);  // expected-warning{{explicitly moving}}
21 }
22 
23 int global;
global_int_test()24 void global_int_test() {
25   global = std::move(global);  // expected-warning{{explicitly moving}}
26   (global) = std::move(global);  // expected-warning{{explicitly moving}}
27 
28   using std::move;
29   global = move(global);  // expected-warning{{explicitly moving}}
30 }
31 
32 class field_test {
33   int x;
field_test(field_test && other)34   field_test(field_test&& other) {
35     x = std::move(x);  // expected-warning{{explicitly moving}}
36     x = std::move(other.x);
37     other.x = std::move(x);
38     other.x = std::move(other.x);  // expected-warning{{explicitly moving}}
39   }
40 };
41 
42 struct A {};
43 struct B { A a; };
CC44 struct C { C() {}; ~C() {} };
struct_test()45 void struct_test() {
46   A a;
47   a = std::move(a);  // expected-warning{{explicitly moving}}
48 
49   B b;
50   b = std::move(b);  // expected-warning{{explicitly moving}}
51   b.a = std::move(b.a);  // expected-warning{{explicitly moving}}
52 
53   C c;
54   c = std::move(c);  // expected-warning{{explicitly moving}}
55 }
56