1*e8a3ddafSNathan James // RUN: %check_clang_tidy %s cppcoreguidelines-special-member-functions %t -- -config="{CheckOptions: {cppcoreguidelines-special-member-functions.AllowMissingMoveFunctionsWhenCopyIsDeleted: true}}" --
289a1d03eSRichard 
389a1d03eSRichard class DefinesEverything {
489a1d03eSRichard   DefinesEverything(const DefinesEverything &);
589a1d03eSRichard   DefinesEverything(DefinesEverything &&);
689a1d03eSRichard   DefinesEverything &operator=(const DefinesEverything &);
789a1d03eSRichard   DefinesEverything &operator=(DefinesEverything &&);
889a1d03eSRichard   ~DefinesEverything();
989a1d03eSRichard };
1089a1d03eSRichard 
1189a1d03eSRichard class DefinesNothing {
1289a1d03eSRichard };
1389a1d03eSRichard 
1489a1d03eSRichard class DeletedCopyCtorAndOperator {
1589a1d03eSRichard   ~DeletedCopyCtorAndOperator() = default;
1689a1d03eSRichard   DeletedCopyCtorAndOperator(const DeletedCopyCtorAndOperator &) = delete;
1789a1d03eSRichard   DeletedCopyCtorAndOperator &operator=(const DeletedCopyCtorAndOperator &) = delete;
1889a1d03eSRichard };
1989a1d03eSRichard 
2089a1d03eSRichard // CHECK-MESSAGES: [[@LINE+1]]:7: warning: class 'DefaultedCopyCtorAndOperator' defines a default destructor, a copy constructor and a copy assignment operator but does not define a move constructor or a move assignment operator [cppcoreguidelines-special-member-functions]
2189a1d03eSRichard class DefaultedCopyCtorAndOperator {
2289a1d03eSRichard   ~DefaultedCopyCtorAndOperator() = default;
2389a1d03eSRichard   DefaultedCopyCtorAndOperator(const DefaultedCopyCtorAndOperator &) = default;
2489a1d03eSRichard   DefaultedCopyCtorAndOperator &operator=(const DefaultedCopyCtorAndOperator &) = default;
2589a1d03eSRichard };
2689a1d03eSRichard 
2789a1d03eSRichard // CHECK-MESSAGES: [[@LINE+1]]:7: warning: class 'DefinedCopyCtorAndOperator' defines a default destructor, a copy constructor and a copy assignment operator but does not define a move constructor or a move assignment operator [cppcoreguidelines-special-member-functions]
2889a1d03eSRichard class DefinedCopyCtorAndOperator {
2989a1d03eSRichard   ~DefinedCopyCtorAndOperator() = default;
3089a1d03eSRichard   DefinedCopyCtorAndOperator(const DefinedCopyCtorAndOperator &);
3189a1d03eSRichard   DefinedCopyCtorAndOperator &operator=(const DefinedCopyCtorAndOperator &);
3289a1d03eSRichard };
3389a1d03eSRichard 
3489a1d03eSRichard // CHECK-MESSAGES: [[@LINE+1]]:7: warning: class 'MissingCopyCtor' defines a default destructor and a copy assignment operator but does not define a copy constructor, a move constructor or a move assignment operator [cppcoreguidelines-special-member-functions]
3589a1d03eSRichard class MissingCopyCtor {
3689a1d03eSRichard   ~MissingCopyCtor() = default;
3789a1d03eSRichard   MissingCopyCtor &operator=(const MissingCopyCtor &) = delete;
3889a1d03eSRichard };
3989a1d03eSRichard 
4089a1d03eSRichard // CHECK-MESSAGES: [[@LINE+1]]:7:  warning: class 'MissingCopyOperator' defines a default destructor and a copy constructor but does not define a copy assignment operator, a move constructor or a move assignment operator [cppcoreguidelines-special-member-functions]
4189a1d03eSRichard class MissingCopyOperator {
4289a1d03eSRichard   ~MissingCopyOperator() = default;
4389a1d03eSRichard   MissingCopyOperator(const MissingCopyOperator &) = delete;
4489a1d03eSRichard };
4589a1d03eSRichard 
4689a1d03eSRichard // CHECK-MESSAGES: [[@LINE+1]]:7:  warning: class 'MissingAll' defines a default destructor but does not define a copy constructor, a copy assignment operator, a move constructor or a move assignment operator [cppcoreguidelines-special-member-functions]
4789a1d03eSRichard class MissingAll {
4889a1d03eSRichard   ~MissingAll() = default;
4989a1d03eSRichard };
50