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 | |
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; |
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; |
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; }; |
44 | struct C { C() {}; ~C() {} }; |
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 | |