// RUN: %check_clang_tidy %s readability-deleted-default %t -- -- -std=c++11 -fno-ms-compatibility class NoDefault { public: NoDefault() = delete; NoDefault(NoDefault &&Other) = delete; NoDefault(const NoDefault &Other) = delete; }; class MissingEverything { public: MissingEverything() = default; // CHECK-MESSAGES: warning: default constructor is explicitly defaulted but implicitly deleted, probably because a non-static data member or a base class is lacking a default constructor; definition can either be removed or explicitly deleted [readability-deleted-default] MissingEverything(MissingEverything &&Other) = default; // CHECK-MESSAGES: warning: move constructor is explicitly defaulted but implicitly deleted, probably because a non-static data member or a base class is neither copyable nor movable; definition can either be removed or explicitly deleted [readability-deleted-default] MissingEverything(const MissingEverything &Other) = default; // CHECK-MESSAGES: warning: copy constructor is explicitly defaulted but implicitly deleted, probably because a non-static data member or a base class is not copyable; definition can either be removed or explicitly deleted [readability-deleted-default] MissingEverything &operator=(MissingEverything &&Other) = default; // CHECK-MESSAGES: warning: move assignment operator is explicitly defaulted but implicitly deleted, probably because a base class or a non-static data member is not assignable, e.g. because the latter is marked 'const'; definition can either be removed or explicitly deleted [readability-deleted-default] MissingEverything &operator=(const MissingEverything &Other) = default; // CHECK-MESSAGES: warning: copy assignment operator is explicitly defaulted but implicitly deleted, probably because a base class or a non-static data member is not assignable, e.g. because the latter is marked 'const'; definition can either be removed or explicitly deleted [readability-deleted-default] private: NoDefault ND; }; class NotAssignable { public: NotAssignable(NotAssignable &&Other) = default; NotAssignable(const NotAssignable &Other) = default; NotAssignable &operator=(NotAssignable &&Other) = default; // CHECK-MESSAGES: warning: move assignment operator is explicitly defaulted but implicitly deleted NotAssignable &operator=(const NotAssignable &Other) = default; // CHECK-MESSAGES: warning: copy assignment operator is explicitly defaulted but implicitly deleted private: const int I = 0; }; class Movable { public: Movable() = default; Movable(Movable &&Other) = default; Movable(const Movable &Other) = delete; Movable &operator=(Movable &&Other) = default; Movable &operator=(const Movable &Other) = delete; }; class NotCopyable { public: NotCopyable(NotCopyable &&Other) = default; NotCopyable(const NotCopyable &Other) = default; // CHECK-MESSAGES: warning: copy constructor is explicitly defaulted but implicitly deleted NotCopyable &operator=(NotCopyable &&Other) = default; NotCopyable &operator=(const NotCopyable &Other) = default; // CHECK-MESSAGES: warning: copy assignment operator is explicitly defaulted but implicitly deleted private: Movable M; }; template class Templated { public: // No warning here, it is a templated class. Templated() = default; Templated(Templated &&Other) = default; Templated(const Templated &Other) = default; Templated &operator=(Templated &&Other) = default; Templated &operator=(const Templated &Other) = default; class InnerTemplated { public: // This class is not in itself templated, but we still don't have warning. InnerTemplated() = default; InnerTemplated(InnerTemplated &&Other) = default; InnerTemplated(const InnerTemplated &Other) = default; InnerTemplated &operator=(InnerTemplated &&Other) = default; InnerTemplated &operator=(const InnerTemplated &Other) = default; private: T TVar; }; class InnerNotTemplated { public: // This one could technically have warnings, but currently doesn't. InnerNotTemplated() = default; InnerNotTemplated(InnerNotTemplated &&Other) = default; InnerNotTemplated(const InnerNotTemplated &Other) = default; InnerNotTemplated &operator=(InnerNotTemplated &&Other) = default; InnerNotTemplated &operator=(const InnerNotTemplated &Other) = default; private: int I; }; private: const T TVar{}; }; int FunctionWithInnerClass() { class InnerNotAssignable { public: InnerNotAssignable &operator=(InnerNotAssignable &&Other) = default; // CHECK-MESSAGES: warning: move assignment operator is explicitly defaulted but implicitly deleted private: const int I = 0; }; return 1; }; template int TemplateFunctionWithInnerClass() { class InnerNotAssignable { public: InnerNotAssignable &operator=(InnerNotAssignable &&Other) = default; private: const T TVar{}; }; return 1; }; void Foo() { Templated V1; Templated::InnerTemplated V2; Templated::InnerNotTemplated V3; TemplateFunctionWithInnerClass(); }