annotate gcc/testsuite/g++.dg/cpp0x/Wpessimizing-move1.C @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1 // PR c++/86981
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
2 // { dg-do compile { target c++11 } }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
3 // { dg-options "-Wpessimizing-move" }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
4
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
5 // Define std::move.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
6 namespace std {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
7 template<typename _Tp>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
8 struct remove_reference
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
9 { typedef _Tp type; };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
10
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
11 template<typename _Tp>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
12 struct remove_reference<_Tp&>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
13 { typedef _Tp type; };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
14
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
15 template<typename _Tp>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
16 struct remove_reference<_Tp&&>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
17 { typedef _Tp type; };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
18
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
19 template<typename _Tp>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
20 constexpr typename std::remove_reference<_Tp>::type&&
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
21 move(_Tp&& __t) noexcept
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
22 { return static_cast<typename std::remove_reference<_Tp>::type&&>(__t); }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
23 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
24
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
25 struct T {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
26 T() { }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
27 T(const T&) { }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
28 T(T&&) { }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
29 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
30 struct U {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
31 U() { }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
32 U(const U&) { }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
33 U(U&&) { }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
34 U(T) { }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
35 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
36
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
37 T g;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
38
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
39 T
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
40 fn1 ()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
41 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
42 T t;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
43 return std::move (t); // { dg-warning "moving a local object in a return statement prevents copy elision" }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
44 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
45
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
46 T
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
47 fn2 ()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
48 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
49 // Not a local variable.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
50 return std::move (g);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
51 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
52
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
53 int
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
54 fn3 ()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
55 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
56 int i = 42;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
57 // Not a class type.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
58 return std::move (i);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
59 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
60
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
61 T
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
62 fn4 (bool b)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
63 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
64 T t;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
65 if (b)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
66 throw std::move (t);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
67 return std::move (t); // { dg-warning "moving a local object in a return statement prevents copy elision" }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
68 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
69
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
70 T
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
71 fn5 (T t)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
72 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
73 // Function parameter; std::move is redundant but not pessimizing.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
74 return std::move (t);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
75 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
76
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
77 U
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
78 fn6 (T t, U u, bool b)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
79 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
80 if (b)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
81 return std::move (t);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
82 else
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
83 // Function parameter; std::move is redundant but not pessimizing.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
84 return std::move (u);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
85 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
86
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
87 U
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
88 fn6 (bool b)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
89 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
90 T t;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
91 U u;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
92 if (b)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
93 return std::move (t);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
94 else
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
95 return std::move (u); // { dg-warning "moving a local object in a return statement prevents copy elision" }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
96 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
97
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
98 T
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
99 fn7 ()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
100 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
101 static T t;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
102 // Non-local; don't warn.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
103 return std::move (t);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
104 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
105
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
106 T
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
107 fn8 ()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
108 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
109 return T();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
110 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
111
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
112 T
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
113 fn9 (int i)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
114 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
115 T t;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
116
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
117 switch (i)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
118 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
119 case 1:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
120 return std::move ((t)); // { dg-warning "moving a local object in a return statement prevents copy elision" }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
121 case 2:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
122 return (std::move (t)); // { dg-warning "moving a local object in a return statement prevents copy elision" }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
123 default:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
124 return (std::move ((t))); // { dg-warning "moving a local object in a return statement prevents copy elision" }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
125 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
126 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
127
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
128 int
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
129 fn10 ()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
130 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
131 return std::move (42);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
132 }