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 expected-warning {{unqualified call to 'std::move}} 22 } 23 24 int global; 25 void global_int_test() { 26 global = std::move(global); // expected-warning{{explicitly moving}} 27 (global) = std::move(global); // expected-warning{{explicitly moving}} 28 29 using std::move; 30 global = move(global); // expected-warning{{explicitly moving}} \ 31 expected-warning {{unqualified call to 'std::move}} 32 } 33 34 class field_test { 35 int x; 36 field_test(field_test&& other) { 37 x = std::move(x); // expected-warning{{explicitly moving}} 38 x = std::move(other.x); 39 other.x = std::move(x); 40 other.x = std::move(other.x); // expected-warning{{explicitly moving}} 41 } 42 void withSuggest(int x) { 43 x = std::move(x); // expected-warning{{explicitly moving variable of type 'int' to itself; did you mean to move to member 'x'?}} 44 } 45 }; 46 47 struct A {}; 48 struct B { A a; }; 49 struct C { C() {}; ~C() {} }; 50 void struct_test() { 51 A a; 52 a = std::move(a); // expected-warning{{explicitly moving}} 53 54 B b; 55 b = std::move(b); // expected-warning{{explicitly moving}} 56 b.a = std::move(b.a); // expected-warning{{explicitly moving}} 57 58 C c; 59 c = std::move(c); // expected-warning{{explicitly moving}} 60 } 61