| // 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, InMacro) |