llvm-project

Форк
0
/
block-variable-move.mm 
43 строки · 1.2 Кб
1
// RUN: %clang_cc1 -std=c++11 -fsyntax-only -fobjc-arc -verify -fblocks -Wpessimizing-move -Wredundant-move %s
2

3
// definitions for std::move
4
namespace std {
5
inline namespace foo {
6
template <class T> struct remove_reference { typedef T type; };
7
template <class T> struct remove_reference<T&> { typedef T type; };
8
template <class T> struct remove_reference<T&&> { typedef T type; };
9

10
template <class T> typename remove_reference<T>::type &&move(T &&t);
11
}
12
}
13

14
class MoveOnly {
15
public:
16
  MoveOnly() { }
17
  MoveOnly(MoveOnly &&) = default; // expected-note 2 {{copy constructor is implicitly deleted}}
18
  MoveOnly &operator=(MoveOnly &&) = default;
19
  ~MoveOnly();
20
};
21

22
void copyInit() {
23
  __block MoveOnly temp;
24
  MoveOnly temp2 = temp; // expected-error {{call to implicitly-deleted copy constructor of 'MoveOnly'}}
25
  MoveOnly temp3 = std::move(temp); // ok
26
}
27

28
MoveOnly errorOnCopy() {
29
  __block MoveOnly temp;
30
  return temp; // expected-error {{call to implicitly-deleted copy constructor of 'MoveOnly'}}
31
}
32

33
MoveOnly dontWarnOnMove() {
34
  __block MoveOnly temp;
35
  return std::move(temp); // ok
36
}
37

38
class MoveOnlySub : public MoveOnly {};
39

40
MoveOnly dontWarnOnMoveSubclass() {
41
  __block MoveOnlySub temp;
42
  return std::move(temp); // ok
43
}
44

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.