blob: 79dc862cfbdcf0324eb7659afeafb77bdee02e5c [file] [log] [blame]
Angel Garcia Gomez184864a2015-11-02 10:54:50 +00001// RUN: %check_clang_tidy %s modernize-use-default %t -- -- -std=c++11 -fno-delayed-template-parsing -fexceptions
Angel Garcia Gomez8dedeb02015-10-21 12:58:15 +00002
Angel Garcia Gomezf2bc2f02015-11-02 10:34:19 +00003// Out of line definition.
4class OL {
Angel Garcia Gomez8dedeb02015-10-21 12:58:15 +00005public:
Angel Garcia Gomezf2bc2f02015-11-02 10:34:19 +00006 OL();
7 ~OL();
Angel Garcia Gomez8dedeb02015-10-21 12:58:15 +00008};
9
Angel Garcia Gomezf2bc2f02015-11-02 10:34:19 +000010OL::OL() {}
Angel Garcia Gomez8dedeb02015-10-21 12:58:15 +000011// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use '= default' to define a trivial default constructor [modernize-use-default]
Angel Garcia Gomezf2bc2f02015-11-02 10:34:19 +000012// CHECK-FIXES: OL::OL() = default;
13OL::~OL() {}
Angel Garcia Gomez8dedeb02015-10-21 12:58:15 +000014// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use '= default' to define a trivial destructor [modernize-use-default]
Angel Garcia Gomezf2bc2f02015-11-02 10:34:19 +000015// CHECK-FIXES: OL::~OL() = default;
Angel Garcia Gomez8dedeb02015-10-21 12:58:15 +000016
17// Inline definitions.
Angel Garcia Gomezf2bc2f02015-11-02 10:34:19 +000018class IL {
Angel Garcia Gomez8dedeb02015-10-21 12:58:15 +000019public:
Angel Garcia Gomezf2bc2f02015-11-02 10:34:19 +000020 IL() {}
Angel Garcia Gomez8dedeb02015-10-21 12:58:15 +000021 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use '= default'
Angel Garcia Gomezf2bc2f02015-11-02 10:34:19 +000022 // CHECK-FIXES: IL() = default;
23 ~IL() {}
Angel Garcia Gomez8dedeb02015-10-21 12:58:15 +000024 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use '= default'
Angel Garcia Gomezf2bc2f02015-11-02 10:34:19 +000025 // CHECK-FIXES: ~IL() = default;
Angel Garcia Gomez8dedeb02015-10-21 12:58:15 +000026};
27
Angel Garcia Gomezf2bc2f02015-11-02 10:34:19 +000028// Non-empty body.
Angel Garcia Gomez8dedeb02015-10-21 12:58:15 +000029void f();
Angel Garcia Gomezf2bc2f02015-11-02 10:34:19 +000030class NE {
Angel Garcia Gomez8dedeb02015-10-21 12:58:15 +000031public:
Angel Garcia Gomezf2bc2f02015-11-02 10:34:19 +000032 NE() { f(); }
33 ~NE() { f(); }
Angel Garcia Gomez8dedeb02015-10-21 12:58:15 +000034};
35
Angel Garcia Gomezf2bc2f02015-11-02 10:34:19 +000036// Initializer or arguments.
37class IA {
Angel Garcia Gomez8dedeb02015-10-21 12:58:15 +000038public:
39 // Constructor with initializer.
Angel Garcia Gomezf2bc2f02015-11-02 10:34:19 +000040 IA() : Field(5) {}
Angel Garcia Gomez8dedeb02015-10-21 12:58:15 +000041 // Constructor with arguments.
Angel Garcia Gomezf2bc2f02015-11-02 10:34:19 +000042 IA(int Arg1, int Arg2) {}
Angel Garcia Gomez8dedeb02015-10-21 12:58:15 +000043 int Field;
44};
45
46// Private constructor/destructor.
Angel Garcia Gomezf2bc2f02015-11-02 10:34:19 +000047class Priv {
48 Priv() {}
Angel Garcia Gomez8dedeb02015-10-21 12:58:15 +000049 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use '= default'
Angel Garcia Gomezf2bc2f02015-11-02 10:34:19 +000050 // CHECK-FIXES: Priv() = default;
51 ~Priv() {}
Angel Garcia Gomez8dedeb02015-10-21 12:58:15 +000052 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use '= default'
Angel Garcia Gomezf2bc2f02015-11-02 10:34:19 +000053 // CHECK-FIXES: ~Priv() = default;
Angel Garcia Gomez8dedeb02015-10-21 12:58:15 +000054};
55
56// struct.
Angel Garcia Gomezf2bc2f02015-11-02 10:34:19 +000057struct ST {
58 ST() {}
Angel Garcia Gomez8dedeb02015-10-21 12:58:15 +000059 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use '= default'
Angel Garcia Gomezf2bc2f02015-11-02 10:34:19 +000060 // CHECK-FIXES: ST() = default;
61 ~ST() {}
Angel Garcia Gomez8dedeb02015-10-21 12:58:15 +000062 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use '= default'
Angel Garcia Gomezf2bc2f02015-11-02 10:34:19 +000063 // CHECK-FIXES: ST() = default;
Angel Garcia Gomez8dedeb02015-10-21 12:58:15 +000064};
65
66// Deleted constructor/destructor.
Angel Garcia Gomezf2bc2f02015-11-02 10:34:19 +000067class Del {
Angel Garcia Gomez8dedeb02015-10-21 12:58:15 +000068public:
Angel Garcia Gomezf2bc2f02015-11-02 10:34:19 +000069 Del() = delete;
70 ~Del() = delete;
Angel Garcia Gomez8dedeb02015-10-21 12:58:15 +000071};
72
73// Do not remove other keywords.
Angel Garcia Gomezf2bc2f02015-11-02 10:34:19 +000074class KW {
Angel Garcia Gomez8dedeb02015-10-21 12:58:15 +000075public:
Angel Garcia Gomezf2bc2f02015-11-02 10:34:19 +000076 explicit KW() {}
Angel Garcia Gomez8dedeb02015-10-21 12:58:15 +000077 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use '= default'
Angel Garcia Gomezf2bc2f02015-11-02 10:34:19 +000078 // CHECK-FIXES: explicit KW() = default;
79 virtual ~KW() {}
Angel Garcia Gomez8dedeb02015-10-21 12:58:15 +000080 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use '= default'
Angel Garcia Gomezf2bc2f02015-11-02 10:34:19 +000081 // CHECK-FIXES: virtual ~KW() = default;
Angel Garcia Gomez8dedeb02015-10-21 12:58:15 +000082};
83
84// Nested class.
Angel Garcia Gomezf2bc2f02015-11-02 10:34:19 +000085struct N {
86 struct NN {
87 NN() {}
Angel Garcia Gomez8dedeb02015-10-21 12:58:15 +000088 // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use '= default'
Angel Garcia Gomezf2bc2f02015-11-02 10:34:19 +000089 // CHECK-FIXES: NN() = default;
90 ~NN() {}
Angel Garcia Gomez8dedeb02015-10-21 12:58:15 +000091 // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use '= default'
Angel Garcia Gomezf2bc2f02015-11-02 10:34:19 +000092 // CHECK-FIXES: ~NN() = default;
Angel Garcia Gomez8dedeb02015-10-21 12:58:15 +000093 };
94 int Int;
95};
96
97// Class template.
98template <class T>
Angel Garcia Gomezf2bc2f02015-11-02 10:34:19 +000099class Temp {
Angel Garcia Gomez8dedeb02015-10-21 12:58:15 +0000100public:
Angel Garcia Gomezf2bc2f02015-11-02 10:34:19 +0000101 Temp() {}
Angel Garcia Gomez8dedeb02015-10-21 12:58:15 +0000102 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use '= default'
Angel Garcia Gomezf2bc2f02015-11-02 10:34:19 +0000103 // CHECK-FIXES: Temp() = default;
104 ~Temp() {}
Angel Garcia Gomez8dedeb02015-10-21 12:58:15 +0000105 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use '= default'
Angel Garcia Gomezf2bc2f02015-11-02 10:34:19 +0000106 // CHECK-FIXES: ~Temp() = default;
Angel Garcia Gomez8dedeb02015-10-21 12:58:15 +0000107};
108
109// Non user-provided constructor/destructor.
Angel Garcia Gomezf2bc2f02015-11-02 10:34:19 +0000110struct Imp {
Angel Garcia Gomez8dedeb02015-10-21 12:58:15 +0000111 int Int;
112};
113void g() {
Angel Garcia Gomezf2bc2f02015-11-02 10:34:19 +0000114 Imp *PtrImp = new Imp();
115 PtrImp->~Imp();
116 delete PtrImp;
Angel Garcia Gomez8dedeb02015-10-21 12:58:15 +0000117}
118
119// Already using default.
Angel Garcia Gomezf2bc2f02015-11-02 10:34:19 +0000120struct IDef {
121 IDef() = default;
122 ~IDef() = default;
Angel Garcia Gomez8dedeb02015-10-21 12:58:15 +0000123};
Angel Garcia Gomezf2bc2f02015-11-02 10:34:19 +0000124struct ODef {
125 ODef();
126 ~ODef();
Angel Garcia Gomez8dedeb02015-10-21 12:58:15 +0000127};
Angel Garcia Gomezf2bc2f02015-11-02 10:34:19 +0000128ODef::ODef() = default;
129ODef::~ODef() = default;
Angel Garcia Gomez8dedeb02015-10-21 12:58:15 +0000130
131// Delegating constructor and overriden destructor.
Angel Garcia Gomezf2bc2f02015-11-02 10:34:19 +0000132struct DC : KW {
133 DC() : KW() {}
134 ~DC() override {}
Angel Garcia Gomez8dedeb02015-10-21 12:58:15 +0000135 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use '= default'
Angel Garcia Gomezf2bc2f02015-11-02 10:34:19 +0000136 // CHECK-FIXES: ~DC() override = default;
Angel Garcia Gomez8dedeb02015-10-21 12:58:15 +0000137};
Angel Garcia Gomezf2bc2f02015-11-02 10:34:19 +0000138
139struct Comments {
140 Comments() {
141 // Don't erase comments inside the body.
142 }
143 ~Comments() {
144 // Don't erase comments inside the body.
145 }
146};
147
148// Try-catch.
149struct ITC {
150 ITC() try {} catch(...) {}
151 ~ITC() try {} catch(...) {}
152};
153
154struct OTC {
155 OTC();
156 ~OTC();
157};
158OTC::OTC() try {} catch(...) {}
159OTC::~OTC() try {} catch(...) {}