56 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			56 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
// 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}}
 | 
						|
}
 |