xref: /aosp_15_r20/external/clang/test/SemaCXX/warn-self-move.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
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 Li void 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 Li void 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 Li struct C { C() {}; ~C() {} };
struct_test()45*67e74705SXin Li void 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