| // 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) {} |
| }; |