|  | // RUN: %check_clang_tidy %s bugprone-copy-constructor-init %t | 
|  |  | 
|  | class NonCopyable { | 
|  | public: | 
|  | NonCopyable() = default; | 
|  | NonCopyable(const NonCopyable &) = delete; | 
|  |  | 
|  | private: | 
|  | int a; | 
|  | }; | 
|  |  | 
|  | class NonCopyable2 { | 
|  | public: | 
|  | NonCopyable2() = default; | 
|  |  | 
|  | private: | 
|  | NonCopyable2(const NonCopyable2 &); | 
|  | int a; | 
|  | }; | 
|  |  | 
|  | class Copyable { | 
|  | public: | 
|  | Copyable() = default; | 
|  | Copyable(const Copyable &) = default; | 
|  |  | 
|  | private: | 
|  | int a; | 
|  | }; | 
|  |  | 
|  | class Copyable2 { | 
|  | public: | 
|  | Copyable2() = default; | 
|  | Copyable2(const Copyable2 &) = default; | 
|  |  | 
|  | private: | 
|  | int a; | 
|  | }; | 
|  |  | 
|  | class Copyable3 : public Copyable { | 
|  | public: | 
|  | Copyable3() = default; | 
|  | Copyable3(const Copyable3 &) = default; | 
|  | }; | 
|  |  | 
|  | template <class C> | 
|  | class Copyable4 { | 
|  | public: | 
|  | Copyable4() = default; | 
|  | Copyable4(const Copyable4 &) = default; | 
|  |  | 
|  | private: | 
|  | int a; | 
|  | }; | 
|  |  | 
|  | template <class T, class S> | 
|  | class Copyable5 { | 
|  | public: | 
|  | Copyable5() = default; | 
|  | Copyable5(const Copyable5 &) = default; | 
|  |  | 
|  | private: | 
|  | int a; | 
|  | }; | 
|  |  | 
|  | class EmptyCopyable { | 
|  | public: | 
|  | EmptyCopyable() = default; | 
|  | EmptyCopyable(const EmptyCopyable &) = default; | 
|  | }; | 
|  |  | 
|  | template <typename T> | 
|  | using CopyableAlias = Copyable5<T, int>; | 
|  |  | 
|  | typedef Copyable5<int, int> CopyableAlias2; | 
|  |  | 
|  | class X : public Copyable, public EmptyCopyable { | 
|  | X(const X &other) : Copyable(other) {} | 
|  | }; | 
|  |  | 
|  | class X2 : public Copyable2 { | 
|  | X2(const X2 &other) {} | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: calling a base constructor other than the copy constructor [bugprone-copy-constructor-init] | 
|  | // CHECK-FIXES: X2(const X2 &other)  : Copyable2(other) {} | 
|  | }; | 
|  |  | 
|  | class X2_A : public Copyable2 { | 
|  | X2_A(const X2_A &) {} | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: calling a base constructor | 
|  | // CHECK-FIXES: X2_A(const X2_A &) {} | 
|  | }; | 
|  |  | 
|  | class X3 : public Copyable, public Copyable2 { | 
|  | X3(const X3 &other) : Copyable(other) {} | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: calling a base constructor | 
|  | // CHECK-FIXES: X3(const X3 &other) : Copyable(other) {} | 
|  | }; | 
|  |  | 
|  | class X4 : public Copyable { | 
|  | X4(const X4 &other) : Copyable() {} | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: calling a base constructor | 
|  | // CHECK-FIXES: X4(const X4 &other) : Copyable(other) {} | 
|  | }; | 
|  |  | 
|  | class X5 : public Copyable3 { | 
|  | X5(const X5 &other) {} | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: calling a base constructor | 
|  | // CHECK-FIXES: X5(const X5 &other)  : Copyable3(other) {} | 
|  | }; | 
|  |  | 
|  | class X6 : public Copyable2, public Copyable3 { | 
|  | X6(const X6 &other) {} | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: calling a base constructor | 
|  | // CHECK-FIXES: X6(const X6 &other)  : Copyable2(other), Copyable3(other) {} | 
|  | }; | 
|  |  | 
|  | class X7 : public Copyable, public Copyable2 { | 
|  | X7(const X7 &other) : Copyable() {} | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: calling a base constructor | 
|  | // CHECK-FIXES: X7(const X7 &other) : Copyable(other) {} | 
|  | }; | 
|  |  | 
|  | class X8 : public Copyable4<int> { | 
|  | X8(const X8 &other) : Copyable4(other) {} | 
|  | }; | 
|  |  | 
|  | class X9 : public Copyable4<int> { | 
|  | X9(const X9 &other) : Copyable4() {} | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: calling a base constructor | 
|  | // CHECK-FIXES: X9(const X9 &other) : Copyable4(other) {} | 
|  | }; | 
|  |  | 
|  | class X10 : public Copyable4<int> { | 
|  | X10(const X10 &other) {} | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: calling a base constructor | 
|  | // CHECK-FIXES: X10(const X10 &other)  : Copyable4(other) {} | 
|  | }; | 
|  |  | 
|  | class X11 : public Copyable5<int, float> { | 
|  | X11(const X11 &other) {} | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: calling a base constructor | 
|  | // CHECK-FIXES: X11(const X11 &other)  : Copyable5(other) {} | 
|  | }; | 
|  |  | 
|  | class X12 : public CopyableAlias<float> { | 
|  | X12(const X12 &other) {} | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: calling a base constructor | 
|  | // CHECK-FIXES: X12(const X12 &other) {} | 
|  | }; | 
|  |  | 
|  | template <typename T> | 
|  | class X13 : T { | 
|  | X13(const X13 &other) {} | 
|  | }; | 
|  |  | 
|  | template class X13<EmptyCopyable>; | 
|  | template class X13<Copyable>; | 
|  |  | 
|  | #define FROMMACRO                \ | 
|  | class X14 : public Copyable2 { \ | 
|  | X14(const X14 &other) {}     \ | 
|  | }; | 
|  |  | 
|  | FROMMACRO | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: calling a base constructor | 
|  |  | 
|  | class X15 : public CopyableAlias2 { | 
|  | X15(const X15 &other) {} | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: calling a base constructor | 
|  | // CHECK-FIXES: X15(const X15 &other) {} | 
|  | }; | 
|  |  | 
|  | class X16 : public NonCopyable { | 
|  | X16(const X16 &other) {} | 
|  | }; | 
|  |  | 
|  | class X17 : public NonCopyable2 { | 
|  | X17(const X17 &other) {} | 
|  | }; | 
|  |  | 
|  | class X18 : private Copyable { | 
|  | X18(const X18 &other) {} | 
|  | // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: calling a base constructor | 
|  | // CHECK-FIXES: X18(const X18 &other)  : Copyable(other) {} | 
|  | }; | 
|  |  | 
|  | class X19 : private Copyable { | 
|  | X19(const X19 &other) : Copyable(other) {} | 
|  | }; |