| // RUN: %clang_cc1 -fsyntax-only -Wself-move -std=c++11 -verify %s |
| |
| // definitions for std::move |
| namespace std { |
| inline namespace foo { |
| template <class T> struct remove_reference { typedef T type; }; |
| template <class T> struct remove_reference<T&> { typedef T type; }; |
| template <class T> struct remove_reference<T&&> { typedef T type; }; |
| |
| template <class T> typename remove_reference<T>::type &&move(T &&t); |
| } |
| } |
| |
| void int_test() { |
| int x = 5; |
| x = std::move(x); // expected-warning{{explicitly moving}} |
| (x) = std::move(x); // expected-warning{{explicitly moving}} |
| |
| using std::move; |
| x = move(x); // expected-warning{{explicitly moving}} |
| } |
| |
| int global; |
| void global_int_test() { |
| global = std::move(global); // expected-warning{{explicitly moving}} |
| (global) = std::move(global); // expected-warning{{explicitly moving}} |
| |
| using std::move; |
| global = move(global); // expected-warning{{explicitly moving}} |
| } |
| |
| class field_test { |
| int x; |
| field_test(field_test&& other) { |
| x = std::move(x); // expected-warning{{explicitly moving}} |
| x = std::move(other.x); |
| other.x = std::move(x); |
| other.x = std::move(other.x); // expected-warning{{explicitly moving}} |
| } |
| }; |
| |
| struct A {}; |
| struct B { A a; }; |
| struct C { C() {}; ~C() {} }; |
| void struct_test() { |
| A a; |
| a = std::move(a); // expected-warning{{explicitly moving}} |
| |
| B b; |
| b = std::move(b); // expected-warning{{explicitly moving}} |
| b.a = std::move(b.a); // expected-warning{{explicitly moving}} |
| |
| C c; |
| c = std::move(c); // expected-warning{{explicitly moving}} |
| } |