summaryrefslogtreecommitdiffstats
path: root/tests/cxx/deleted_implicit.cc
blob: 0ca277d16be6eecf27c8db3a3c1eb1f56cb1cd18 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
//===--- deleted_implicit.cc - test input file for iwyu -------------------===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

// IWYU_ARGS: -std=c++11

// Tests that we don't crash when instantiating implicit methods, or rather,
// that we avoid instantiating implicit methods when they are to be considered
// deleted.

// http://en.cppreference.com/w/cpp/language/default_constructor#Deleted_implicitly-declared_default_constructor
// says C++11 considers the default constructor deleted if a type has a
// member of reference type.
// IWYU: class ...* does not declare any constructor to initialize its non-modifiable members
class ReferenceMember {
  int& ref_member;
};

// http://en.cppreference.com/w/cpp/language/copy_constructor#Deleted_implicitly-declared_copy_constructor
// says C++11 considers the copy constructor deleted if a type has a member of
// rvalue reference type.
// IWYU: class ...* does not declare any constructor to initialize its non-modifiable members
class RvalueReferenceMember {
  int&& ref_member;
};

// http://en.cppreference.com/w/cpp/language/move_constructor#Deleted_implicitly-declared_move_constructor
// says C++11 considers the move constructor deleted if a type has a non-static
// data member that cannot be moved (e.g. because its move ctor is deleted.)
class DeletedMoveCtor {
  DeletedMoveCtor(DeletedMoveCtor&&) = delete;
};

class ContainsDeletedMoveCtor {
  DeletedMoveCtor contained;
};

// http://en.cppreference.com/w/cpp/language/destructor#Deleted_implicitly-declared_destructor
// says C++11 considers the destructor deleted if a type has a base class with
// inaccessible or deleted destructor.
class PrivateDestructor {
  ~PrivateDestructor();
};

class Derived : public PrivateDestructor {
};

/**** IWYU_SUMMARY

(tests/cxx/deleted_implicit.cc has correct #includes/fwd-decls)

***** IWYU_SUMMARY */