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()7889a1d03eSRichardint 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 &)11389a1d03eSRichardNegativeOutOfLine::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