xref: /llvm-project/clang-tools-extra/test/clang-tidy/checkers/modernize/use-equals-delete.cpp (revision 208fa9acc0ffe5a460bcd504229c24a8d3f87180)
189a1d03eSRichard // RUN: %check_clang_tidy %s modernize-use-equals-delete %t
289a1d03eSRichard 
389a1d03eSRichard struct PositivePrivate {
489a1d03eSRichard private:
589a1d03eSRichard   PositivePrivate();
689a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use '= delete' to prohibit calling of a special member function [modernize-use-equals-delete]
789a1d03eSRichard   // CHECK-FIXES: PositivePrivate() = delete;
889a1d03eSRichard   PositivePrivate(const PositivePrivate &);
989a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use '= delete' to prohibit calling of a special member function [modernize-use-equals-delete]
1089a1d03eSRichard   // CHECK-FIXES: PositivePrivate(const PositivePrivate &) = delete;
1189a1d03eSRichard   PositivePrivate &operator=(const PositivePrivate &);
1289a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: use '= delete' to prohibit calling of a special member function [modernize-use-equals-delete]
1389a1d03eSRichard   // CHECK-FIXES: PositivePrivate &operator=(const PositivePrivate &) = delete;
1489a1d03eSRichard   PositivePrivate(PositivePrivate &&);
1589a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use '= delete' to prohibit calling of a special member function [modernize-use-equals-delete]
1689a1d03eSRichard   // CHECK-FIXES: PositivePrivate(PositivePrivate &&) = delete;
1789a1d03eSRichard   PositivePrivate &operator=(PositivePrivate &&);
1889a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: use '= delete' to prohibit calling of a special member function [modernize-use-equals-delete]
1989a1d03eSRichard   // CHECK-FIXES: PositivePrivate &operator=(PositivePrivate &&) = delete;
2089a1d03eSRichard   ~PositivePrivate();
2189a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use '= delete' to prohibit calling of a special member function [modernize-use-equals-delete]
2289a1d03eSRichard   // CHECK-FIXES: ~PositivePrivate() = delete;
2389a1d03eSRichard };
2489a1d03eSRichard 
2589a1d03eSRichard template<typename T>
2689a1d03eSRichard struct PositivePrivateTemplate {
2789a1d03eSRichard private:
2889a1d03eSRichard   PositivePrivateTemplate();
2989a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use '= delete' to prohibit calling of a special member function [modernize-use-equals-delete]
3089a1d03eSRichard   // CHECK-FIXES: PositivePrivateTemplate() = delete;
3189a1d03eSRichard   PositivePrivateTemplate(const PositivePrivateTemplate &);
3289a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use '= delete' to prohibit calling of a special member function [modernize-use-equals-delete]
3389a1d03eSRichard   // CHECK-FIXES: PositivePrivateTemplate(const PositivePrivateTemplate &) = delete;
3489a1d03eSRichard   PositivePrivateTemplate &operator=(const PositivePrivateTemplate &);
3589a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: use '= delete' to prohibit calling of a special member function [modernize-use-equals-delete]
3689a1d03eSRichard   // CHECK-FIXES: PositivePrivateTemplate &operator=(const PositivePrivateTemplate &) = delete;
3789a1d03eSRichard   PositivePrivateTemplate(PositivePrivateTemplate &&);
3889a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use '= delete' to prohibit calling of a special member function [modernize-use-equals-delete]
3989a1d03eSRichard   // CHECK-FIXES: PositivePrivateTemplate(PositivePrivateTemplate &&) = delete;
4089a1d03eSRichard   PositivePrivateTemplate &operator=(PositivePrivateTemplate &&);
4189a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: use '= delete' to prohibit calling of a special member function [modernize-use-equals-delete]
4289a1d03eSRichard   // CHECK-FIXES: PositivePrivateTemplate &operator=(PositivePrivateTemplate &&) = delete;
4389a1d03eSRichard   ~PositivePrivateTemplate();
4489a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use '= delete' to prohibit calling of a special member function [modernize-use-equals-delete]
4589a1d03eSRichard   // CHECK-FIXES: ~PositivePrivateTemplate() = delete;
4689a1d03eSRichard };
4789a1d03eSRichard 
4889a1d03eSRichard template struct PositivePrivateTemplate<int>;
4989a1d03eSRichard template struct PositivePrivateTemplate<char>;
5089a1d03eSRichard 
5189a1d03eSRichard struct NegativePublic {
5289a1d03eSRichard   NegativePublic(const NegativePublic &);
5389a1d03eSRichard };
5489a1d03eSRichard 
5589a1d03eSRichard struct NegativeProtected {
5689a1d03eSRichard protected:
5789a1d03eSRichard   NegativeProtected(const NegativeProtected &);
5889a1d03eSRichard };
5989a1d03eSRichard 
6089a1d03eSRichard struct PositiveInlineMember {
fooPositiveInlineMember6189a1d03eSRichard   int foo() { return 0; }
6289a1d03eSRichard 
6389a1d03eSRichard private:
6489a1d03eSRichard   PositiveInlineMember(const PositiveInlineMember &);
6589a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use '= delete' to prohibit calling of a special member function [modernize-use-equals-delete]
6689a1d03eSRichard   // CHECK-FIXES: PositiveInlineMember(const PositiveInlineMember &) = delete;
6789a1d03eSRichard };
6889a1d03eSRichard 
6989a1d03eSRichard struct PositiveOutOfLineMember {
7089a1d03eSRichard   int foo();
7189a1d03eSRichard 
7289a1d03eSRichard private:
7389a1d03eSRichard   PositiveOutOfLineMember(const PositiveOutOfLineMember &);
7489a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use '= delete' to prohibit calling of a special member function [modernize-use-equals-delete]
7589a1d03eSRichard   // CHECK-FIXES: PositiveOutOfLineMember(const PositiveOutOfLineMember &) = delete;
7689a1d03eSRichard };
7789a1d03eSRichard 
foo()7889a1d03eSRichard int PositiveOutOfLineMember::foo() { return 0; }
7989a1d03eSRichard 
8089a1d03eSRichard struct PositiveAbstractMember {
8189a1d03eSRichard   virtual int foo() = 0;
8289a1d03eSRichard 
8389a1d03eSRichard private:
8489a1d03eSRichard   PositiveAbstractMember(const PositiveAbstractMember &);
8589a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use '= delete' to prohibit calling of a special member function [modernize-use-equals-delete]
8689a1d03eSRichard   // CHECK-FIXES: PositiveAbstractMember(const PositiveAbstractMember &) = delete;
8789a1d03eSRichard };
8889a1d03eSRichard 
8989a1d03eSRichard struct NegativeMemberNotImpl {
9089a1d03eSRichard   int foo();
9189a1d03eSRichard 
9289a1d03eSRichard private:
9389a1d03eSRichard   NegativeMemberNotImpl(const NegativeMemberNotImpl &);
9489a1d03eSRichard };
9589a1d03eSRichard 
9689a1d03eSRichard struct NegativeStaticMemberNotImpl {
9789a1d03eSRichard   static int foo();
9889a1d03eSRichard 
9989a1d03eSRichard private:
10089a1d03eSRichard   NegativeStaticMemberNotImpl(const NegativeStaticMemberNotImpl &);
10189a1d03eSRichard };
10289a1d03eSRichard 
10389a1d03eSRichard struct NegativeInline {
10489a1d03eSRichard private:
NegativeInlineNegativeInline10589a1d03eSRichard   NegativeInline(const NegativeInline &) {}
10689a1d03eSRichard };
10789a1d03eSRichard 
10889a1d03eSRichard struct NegativeOutOfLine {
10989a1d03eSRichard private:
11089a1d03eSRichard   NegativeOutOfLine(const NegativeOutOfLine &);
11189a1d03eSRichard };
11289a1d03eSRichard 
NegativeOutOfLine(const NegativeOutOfLine &)11389a1d03eSRichard NegativeOutOfLine::NegativeOutOfLine(const NegativeOutOfLine &) {}
11489a1d03eSRichard 
11589a1d03eSRichard struct NegativeConstructNotImpl {
11689a1d03eSRichard   NegativeConstructNotImpl();
11789a1d03eSRichard 
11889a1d03eSRichard private:
11989a1d03eSRichard   NegativeConstructNotImpl(const NegativeConstructNotImpl &);
12089a1d03eSRichard };
12189a1d03eSRichard 
12289a1d03eSRichard struct PositiveDefaultedConstruct {
12389a1d03eSRichard   PositiveDefaultedConstruct() = default;
12489a1d03eSRichard 
12589a1d03eSRichard private:
12689a1d03eSRichard   PositiveDefaultedConstruct(const PositiveDefaultedConstruct &);
12789a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use '= delete' to prohibit calling of a special member function [modernize-use-equals-delete]
12889a1d03eSRichard   // CHECK-FIXES: PositiveDefaultedConstruct(const PositiveDefaultedConstruct &) = delete;
12989a1d03eSRichard };
13089a1d03eSRichard 
13189a1d03eSRichard struct PositiveDeletedConstruct {
13289a1d03eSRichard   PositiveDeletedConstruct() = delete;
13389a1d03eSRichard 
13489a1d03eSRichard private:
13589a1d03eSRichard   PositiveDeletedConstruct(const PositiveDeletedConstruct &);
13689a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use '= delete' to prohibit calling of a special member function [modernize-use-equals-delete]
13789a1d03eSRichard   // CHECK-FIXES: PositiveDeletedConstruct(const PositiveDeletedConstruct &) = delete;
13889a1d03eSRichard };
13989a1d03eSRichard 
14089a1d03eSRichard struct NegativeDefaulted {
14189a1d03eSRichard private:
14289a1d03eSRichard   NegativeDefaulted(const NegativeDefaulted &) = default;
14389a1d03eSRichard };
14489a1d03eSRichard 
14589a1d03eSRichard struct PrivateDeleted {
14689a1d03eSRichard private:
14789a1d03eSRichard   PrivateDeleted(const PrivateDeleted &) = delete;
14889a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: deleted member function should be public [modernize-use-equals-delete]
14989a1d03eSRichard };
15089a1d03eSRichard 
15189a1d03eSRichard struct ProtectedDeleted {
15289a1d03eSRichard protected:
15389a1d03eSRichard   ProtectedDeleted(const ProtectedDeleted &) = delete;
15489a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: deleted member function should be public [modernize-use-equals-delete]
15589a1d03eSRichard };
15689a1d03eSRichard 
15789a1d03eSRichard struct PublicDeleted {
15889a1d03eSRichard public:
15989a1d03eSRichard   PublicDeleted(const PublicDeleted &) = delete;
16089a1d03eSRichard };
16189a1d03eSRichard 
16289a1d03eSRichard #define M1                                                         \
16389a1d03eSRichard   struct PrivateDeletedMacro {                                     \
16489a1d03eSRichard   private:                                                         \
16589a1d03eSRichard     PrivateDeletedMacro(const PrivateDeletedMacro &) = delete;     \
16689a1d03eSRichard   };                                                               \
16789a1d03eSRichard   struct ProtectedDeletedMacro {                                   \
16889a1d03eSRichard   protected:                                                       \
16989a1d03eSRichard     ProtectedDeletedMacro(const ProtectedDeletedMacro &) = delete; \
17089a1d03eSRichard   }
17189a1d03eSRichard 
17289a1d03eSRichard M1;
17389a1d03eSRichard 
17489a1d03eSRichard #define DISALLOW_COPY_AND_ASSIGN(name) \
17589a1d03eSRichard   name(const name &) = delete;         \
17689a1d03eSRichard   void operator=(const name &) = delete
17789a1d03eSRichard 
17889a1d03eSRichard struct PrivateDeletedMacro2 {
17989a1d03eSRichard private:
18089a1d03eSRichard   DISALLOW_COPY_AND_ASSIGN(PrivateDeletedMacro2);
18189a1d03eSRichard };
18289a1d03eSRichard 
18389a1d03eSRichard struct ProtectedDeletedMacro2 {
18489a1d03eSRichard protected:
18589a1d03eSRichard   DISALLOW_COPY_AND_ASSIGN(ProtectedDeletedMacro2);
18689a1d03eSRichard };
18789a1d03eSRichard 
18889a1d03eSRichard // This resulted in a warning by default.
18989a1d03eSRichard #define MACRO(type) void operator=(type const &)
19089a1d03eSRichard class C {
19189a1d03eSRichard private:
19289a1d03eSRichard   MACRO(C);
19389a1d03eSRichard };
194*208fa9acSPiotr Zegar 
195*208fa9acSPiotr Zegar namespace PR33759 {
196*208fa9acSPiotr Zegar 
197*208fa9acSPiotr Zegar   class Number {
198*208fa9acSPiotr Zegar     private:
199*208fa9acSPiotr Zegar       Number();
200*208fa9acSPiotr Zegar       ~Number();
201*208fa9acSPiotr Zegar 
202*208fa9acSPiotr Zegar     public:
getNumber()203*208fa9acSPiotr Zegar       static Number& getNumber() {
204*208fa9acSPiotr Zegar         static Number number;
205*208fa9acSPiotr Zegar         return number;
206*208fa9acSPiotr Zegar       }
207*208fa9acSPiotr Zegar 
getIntValue()208*208fa9acSPiotr Zegar       int getIntValue() { return (int)someFloat; }
getFloatValue()209*208fa9acSPiotr Zegar       float getFloatValue() { return someFloat; }
210*208fa9acSPiotr Zegar     private:
211*208fa9acSPiotr Zegar       float someFloat;
212*208fa9acSPiotr Zegar   };
213*208fa9acSPiotr Zegar 
214*208fa9acSPiotr Zegar   class Number2 {
215*208fa9acSPiotr Zegar     private:
216*208fa9acSPiotr Zegar       Number2();
217*208fa9acSPiotr Zegar       ~Number2();
218*208fa9acSPiotr Zegar     public:
219*208fa9acSPiotr Zegar       static Number& getNumber();
220*208fa9acSPiotr Zegar   };
221*208fa9acSPiotr Zegar }
222