teak-llvm/clang/test/SemaCXX/warn-self-move.cpp
Richard Trieu 36d0b2b49f Extend the self move warning to record types.
Move the logic for checking self moves into SemaChecking and add that function
to Sema since it is now used in multiple places.

llvm-svn: 225756
2015-01-13 02:32:02 +00:00

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}}
}