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