xref: /llvm-project/clang-tools-extra/test/clang-tidy/checkers/bugprone/undelegated-constructor.cpp (revision 89a1d03e2b379e325daa5249411e414bbd995b5e)
1*89a1d03eSRichard // RUN: %check_clang_tidy %s bugprone-undelegated-constructor %t
2*89a1d03eSRichard 
3*89a1d03eSRichard struct Ctor;
4*89a1d03eSRichard Ctor foo();
5*89a1d03eSRichard 
6*89a1d03eSRichard struct Ctor {
7*89a1d03eSRichard   Ctor();
8*89a1d03eSRichard   Ctor(int);
9*89a1d03eSRichard   Ctor(int, int);
CtorCtor10*89a1d03eSRichard   Ctor(Ctor *i) {
11*89a1d03eSRichard     Ctor();
12*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: did you intend to call a delegated constructor? A temporary object is created here instead [bugprone-undelegated-constructor]
13*89a1d03eSRichard     Ctor(0);
14*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: did you intend to call a delegated constructor?
15*89a1d03eSRichard     Ctor(1, 2);
16*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: did you intend to call a delegated constructor?
17*89a1d03eSRichard     foo();
18*89a1d03eSRichard   }
19*89a1d03eSRichard };
20*89a1d03eSRichard 
Ctor()21*89a1d03eSRichard Ctor::Ctor() {
22*89a1d03eSRichard   Ctor(1);
23*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: did you intend to call a delegated constructor?
24*89a1d03eSRichard }
25*89a1d03eSRichard 
Ctor(int i)26*89a1d03eSRichard Ctor::Ctor(int i) : Ctor(i, 1) {} // properly delegated.
27*89a1d03eSRichard 
28*89a1d03eSRichard struct Dtor {
29*89a1d03eSRichard   Dtor();
30*89a1d03eSRichard   Dtor(int);
31*89a1d03eSRichard   Dtor(int, int);
DtorDtor32*89a1d03eSRichard   Dtor(Ctor *i) {
33*89a1d03eSRichard     Dtor();
34*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: did you intend to call a delegated constructor?
35*89a1d03eSRichard     Dtor(0);
36*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: did you intend to call a delegated constructor?
37*89a1d03eSRichard     Dtor(1, 2);
38*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: did you intend to call a delegated constructor?
39*89a1d03eSRichard   }
40*89a1d03eSRichard   ~Dtor();
41*89a1d03eSRichard };
42*89a1d03eSRichard 
43*89a1d03eSRichard struct Base {};
44*89a1d03eSRichard struct Derived : public Base {
DerivedDerived45*89a1d03eSRichard   Derived() { Base(); }
46*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: did you intend to call a delegated constructor?
47*89a1d03eSRichard };
48*89a1d03eSRichard 
49*89a1d03eSRichard template <typename T>
50*89a1d03eSRichard struct TDerived : public Base {
TDerivedTDerived51*89a1d03eSRichard   TDerived() { Base(); }
52*89a1d03eSRichard };
53*89a1d03eSRichard 
54*89a1d03eSRichard TDerived<int> t;
55