diff options
Diffstat (limited to 'clang-tools-extra/test/clang-tidy/modernize-use-equals-default.cpp')
-rw-r--r-- | clang-tools-extra/test/clang-tidy/modernize-use-equals-default.cpp | 209 |
1 files changed, 209 insertions, 0 deletions
diff --git a/clang-tools-extra/test/clang-tidy/modernize-use-equals-default.cpp b/clang-tools-extra/test/clang-tidy/modernize-use-equals-default.cpp new file mode 100644 index 00000000000..4892e58287d --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/modernize-use-equals-default.cpp @@ -0,0 +1,209 @@ +// RUN: %check_clang_tidy %s modernize-use-equals-default %t -- -- -std=c++11 -fno-delayed-template-parsing -fexceptions + +// Out of line definition. +class OL { +public: + OL(); + ~OL(); +}; + +OL::OL() {} +// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use '= default' to define a trivial default constructor [modernize-use-equals-default] +// CHECK-FIXES: OL::OL() = default; +OL::~OL() {} +// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use '= default' to define a trivial destructor [modernize-use-equals-default] +// CHECK-FIXES: OL::~OL() = default; + +// Inline definitions. +class IL { +public: + IL() {} + // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use '= default' + // CHECK-FIXES: IL() = default; + ~IL() {} + // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use '= default' + // CHECK-FIXES: ~IL() = default; +}; + +// Non-empty body. +void f(); +class NE { +public: + NE() { f(); } + ~NE() { f(); } +}; + +// Initializer or arguments. +class IA { +public: + // Constructor with initializer. + IA() : Field(5) {} + // Constructor with arguments. + IA(int Arg1, int Arg2) {} + int Field; +}; + +// Default member initializer +class DMI { +public: + DMI() {} + // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use '= default' + // CHECK-FIXES: DMI() = default; + int Field = 5; +}; + +// Class member +class CM { +public: + CM() {} + // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use '= default' + // CHECK-FIXES: CM() = default; + OL o; +}; + +// Private constructor/destructor. +class Priv { + Priv() {} + // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use '= default' + // CHECK-FIXES: Priv() = default; + ~Priv() {} + // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use '= default' + // CHECK-FIXES: ~Priv() = default; +}; + +// struct. +struct ST { + ST() {} + // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use '= default' + // CHECK-FIXES: ST() = default; + ~ST() {} + // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use '= default' + // CHECK-FIXES: ST() = default; +}; + +// Deleted constructor/destructor. +class Del { +public: + Del() = delete; + ~Del() = delete; +}; + +// Do not remove other keywords. +class KW { +public: + explicit KW() {} + // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: use '= default' + // CHECK-FIXES: explicit KW() = default; + virtual ~KW() {} + // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: use '= default' + // CHECK-FIXES: virtual ~KW() = default; +}; + +// Nested class. +struct N { + struct NN { + NN() {} + // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use '= default' + // CHECK-FIXES: NN() = default; + ~NN() {} + // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use '= default' + // CHECK-FIXES: ~NN() = default; + }; + int Int; +}; + +// Class template. +template <class T> +class Temp { +public: + Temp() {} + // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use '= default' + // CHECK-FIXES: Temp() = default; + ~Temp() {} + // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use '= default' + // CHECK-FIXES: ~Temp() = default; +}; + +// Class template out of line with explicit instantiation. +template <class T> +class TempODef { +public: + TempODef(); + ~TempODef(); +}; + +template <class T> +TempODef<T>::TempODef() {} +// CHECK-MESSAGES: :[[@LINE-1]]:14: warning: use '= default' +// CHECK-FIXES: TempODef<T>::TempODef() = default; +template <class T> +TempODef<T>::~TempODef() {} +// CHECK-MESSAGES: :[[@LINE-1]]:14: warning: use '= default' +// CHECK-FIXES: TempODef<T>::~TempODef() = default; + +template class TempODef<int>; +template class TempODef<double>; + +// Non user-provided constructor/destructor. +struct Imp { + int Int; +}; +void g() { + Imp *PtrImp = new Imp(); + PtrImp->~Imp(); + delete PtrImp; +} + +// Already using default. +struct IDef { + IDef() = default; + ~IDef() = default; +}; +struct ODef { + ODef(); + ~ODef(); +}; +ODef::ODef() = default; +ODef::~ODef() = default; + +// Delegating constructor and overriden destructor. +struct DC : KW { + DC() : KW() {} + ~DC() override {} + // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use '= default' + // CHECK-FIXES: ~DC() override = default; +}; + +struct Comments { + Comments() { + // Don't erase comments inside the body. + } + // CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use '= default' + ~Comments() { + // Don't erase comments inside the body. + } + // CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use '= default' +}; + +// Try-catch. +struct ITC { + ITC() try {} catch(...) {} + ~ITC() try {} catch(...) {} +}; + +struct OTC { + OTC(); + ~OTC(); +}; +OTC::OTC() try {} catch(...) {} +OTC::~OTC() try {} catch(...) {} + +#define STRUCT_WITH_DEFAULT(_base, _type) \ + struct _type { \ + _type() {} \ + _base value; \ + }; + +STRUCT_WITH_DEFAULT(unsigned char, Hex8Default) +// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use '= default' to define a trivial default constructor +// CHECK-MESSAGES: :[[@LINE-6]]:13: note: |