diff options
Diffstat (limited to 'clang-tools-extra/test/clang-tidy/readability-deleted-default.cpp')
-rw-r--r-- | clang-tools-extra/test/clang-tidy/readability-deleted-default.cpp | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/clang-tools-extra/test/clang-tidy/readability-deleted-default.cpp b/clang-tools-extra/test/clang-tidy/readability-deleted-default.cpp new file mode 100644 index 00000000000..28946b590ac --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/readability-deleted-default.cpp @@ -0,0 +1,127 @@ +// RUN: %check_clang_tidy %s readability-deleted-default %t + +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 <typename T> 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 <typename T> +int TemplateFunctionWithInnerClass() { + class InnerNotAssignable { + public: + InnerNotAssignable &operator=(InnerNotAssignable &&Other) = default; + private: + const T TVar{}; + }; + return 1; +}; + +void Foo() { + Templated<const int> V1; + Templated<int>::InnerTemplated V2; + Templated<float>::InnerNotTemplated V3; + TemplateFunctionWithInnerClass<int>(); +} |