187 lines · cpp
1// RUN: %check_clang_tidy %s bugprone-copy-constructor-init %t2 3class NonCopyable {4public:5 NonCopyable() = default;6 NonCopyable(const NonCopyable &) = delete;7 8private:9 int a;10};11 12class NonCopyable2 {13public:14 NonCopyable2() = default;15 16private:17 NonCopyable2(const NonCopyable2 &);18 int a;19};20 21class Copyable {22public:23 Copyable() = default;24 Copyable(const Copyable &) = default;25 26private:27 int a;28};29 30class Copyable2 {31public:32 Copyable2() = default;33 Copyable2(const Copyable2 &) = default;34 35private:36 int a;37};38 39class Copyable3 : public Copyable {40public:41 Copyable3() = default;42 Copyable3(const Copyable3 &) = default;43};44 45template <class C>46class Copyable4 {47public:48 Copyable4() = default;49 Copyable4(const Copyable4 &) = default;50 51private:52 int a;53};54 55template <class T, class S>56class Copyable5 {57public:58 Copyable5() = default;59 Copyable5(const Copyable5 &) = default;60 61private:62 int a;63};64 65class EmptyCopyable {66public:67 EmptyCopyable() = default;68 EmptyCopyable(const EmptyCopyable &) = default;69};70 71template <typename T>72using CopyableAlias = Copyable5<T, int>;73 74typedef Copyable5<int, int> CopyableAlias2;75 76class X : public Copyable, public EmptyCopyable {77 X(const X &other) : Copyable(other) {}78};79 80class X2 : public Copyable2 {81 X2(const X2 &other) {}82 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: calling a base constructor other than the copy constructor [bugprone-copy-constructor-init]83 // CHECK-FIXES: X2(const X2 &other) : Copyable2(other) {}84};85 86class X2_A : public Copyable2 {87 X2_A(const X2_A &) {}88 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: calling a base constructor89 // CHECK-FIXES: X2_A(const X2_A &) {}90};91 92class X3 : public Copyable, public Copyable2 {93 X3(const X3 &other) : Copyable(other) {}94 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: calling a base constructor95 // CHECK-FIXES: X3(const X3 &other) : Copyable(other) {}96};97 98class X4 : public Copyable {99 X4(const X4 &other) : Copyable() {}100 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: calling a base constructor101 // CHECK-FIXES: X4(const X4 &other) : Copyable(other) {}102};103 104class X5 : public Copyable3 {105 X5(const X5 &other) {}106 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: calling a base constructor107 // CHECK-FIXES: X5(const X5 &other) : Copyable3(other) {}108};109 110class X6 : public Copyable2, public Copyable3 {111 X6(const X6 &other) {}112 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: calling a base constructor113 // CHECK-FIXES: X6(const X6 &other) : Copyable2(other), Copyable3(other) {}114};115 116class X7 : public Copyable, public Copyable2 {117 X7(const X7 &other) : Copyable() {}118 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: calling a base constructor119 // CHECK-FIXES: X7(const X7 &other) : Copyable(other) {}120};121 122class X8 : public Copyable4<int> {123 X8(const X8 &other) : Copyable4(other) {}124};125 126class X9 : public Copyable4<int> {127 X9(const X9 &other) : Copyable4() {}128 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: calling a base constructor129 // CHECK-FIXES: X9(const X9 &other) : Copyable4(other) {}130};131 132class X10 : public Copyable4<int> {133 X10(const X10 &other) {}134 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: calling a base constructor135 // CHECK-FIXES: X10(const X10 &other) : Copyable4(other) {}136};137 138class X11 : public Copyable5<int, float> {139 X11(const X11 &other) {}140 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: calling a base constructor141 // CHECK-FIXES: X11(const X11 &other) : Copyable5(other) {}142};143 144class X12 : public CopyableAlias<float> {145 X12(const X12 &other) {}146 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: calling a base constructor147};148 149template <typename T>150class X13 : T {151 X13(const X13 &other) {}152};153 154template class X13<EmptyCopyable>;155template class X13<Copyable>;156 157#define FROMMACRO \158 class X14 : public Copyable2 { \159 X14(const X14 &other) {} \160 };161 162FROMMACRO163// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: calling a base constructor164 165class X15 : public CopyableAlias2 {166 X15(const X15 &other) {}167 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: calling a base constructor168};169 170class X16 : public NonCopyable {171 X16(const X16 &other) {}172};173 174class X17 : public NonCopyable2 {175 X17(const X17 &other) {}176};177 178class X18 : private Copyable {179 X18(const X18 &other) {}180 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: calling a base constructor181 // CHECK-FIXES: X18(const X18 &other) : Copyable(other) {}182};183 184class X19 : private Copyable {185 X19(const X19 &other) : Copyable(other) {}186};187