diff options
author | Malcolm Parsons <malcolm.parsons@gmail.com> | 2016-10-20 16:08:03 +0000 |
---|---|---|
committer | Malcolm Parsons <malcolm.parsons@gmail.com> | 2016-10-20 16:08:03 +0000 |
commit | 5c24a1148d8e489608ddf34e0b60bbaab348438a (patch) | |
tree | dfb0c07a52c1c413c3e3c63b5956e821e2b9b849 /clang-tools-extra/test/clang-tidy/readability-redundant-member-init.cpp | |
parent | 039983b915a130df66e3d4bd1f0705519386f09c (diff) | |
download | bcm5719-llvm-5c24a1148d8e489608ddf34e0b60bbaab348438a.tar.gz bcm5719-llvm-5c24a1148d8e489608ddf34e0b60bbaab348438a.zip |
[clang-tidy] Add check 'readability-redundant-member-init'
Summary: The check emits a warning if a member-initializer calls the member's default constructor with no arguments.
Reviewers: sbenza, alexfh, aaron.ballman
Subscribers: modocache, mgorny, Eugene.Zelenko, etienneb, Prazek, hokein, cfe-commits, beanz
Differential Revision: https://reviews.llvm.org/D24339
llvm-svn: 284742
Diffstat (limited to 'clang-tools-extra/test/clang-tidy/readability-redundant-member-init.cpp')
-rw-r--r-- | clang-tools-extra/test/clang-tidy/readability-redundant-member-init.cpp | 181 |
1 files changed, 181 insertions, 0 deletions
diff --git a/clang-tools-extra/test/clang-tidy/readability-redundant-member-init.cpp b/clang-tools-extra/test/clang-tidy/readability-redundant-member-init.cpp new file mode 100644 index 00000000000..70a21552706 --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/readability-redundant-member-init.cpp @@ -0,0 +1,181 @@ +// RUN: %check_clang_tidy %s readability-redundant-member-init %t + +struct S { + S() = default; + S(int i) : i(i) {} + int i = 1; +}; + +struct T { + T(int i = 1) : i(i) {} + int i; +}; + +struct U { + int i; +}; + +union V { + int i; + double f; +}; + +// Initializer calls default constructor +struct F1 { + F1() : f() {} + // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: initializer for member 'f' is redundant + // CHECK-FIXES: F1() {} + S f; +}; + +// Initializer calls default constructor with default argument +struct F2 { + F2() : f() {} + // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: initializer for member 'f' is redundant + // CHECK-FIXES: F2() {} + T f; +}; + +// Multiple redundant initializers for same constructor +struct F3 { + F3() : f(), g(1), h() {} + // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: initializer for member 'f' is redundant + // CHECK-MESSAGES: :[[@LINE-2]]:21: warning: initializer for member 'h' is redundant + // CHECK-FIXES: F3() : g(1) {} + S f, g, h; +}; + +// Templated class independent type +template <class V> +struct F4 { + F4() : f() {} + // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: initializer for member 'f' is redundant + // CHECK-FIXES: F4() {} + S f; +}; +F4<int> f4i; +F4<S> f4s; + +// Base class +struct F5 : S { + F5() : S() {} + // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: initializer for base class 'S' is redundant + // CHECK-FIXES: F5() {} +}; + +// Constructor call requires cleanup +struct Cleanup { + ~Cleanup() {} +}; + +struct UsesCleanup { + UsesCleanup(const Cleanup &c = Cleanup()) {} +}; + +struct F6 { + F6() : uc() {} + // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: initializer for member 'uc' is redundant + // CHECK-FIXES: F6() {} + UsesCleanup uc; +}; + +// Multiple inheritance +struct F7 : S, T { + F7() : S(), T() {} + // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: initializer for base class 'S' is redundant + // CHECK-MESSAGES: :[[@LINE-2]]:15: warning: initializer for base class 'T' is redundant + // CHECK-FIXES: F7() {} +}; + +// Initializer not written +struct NF1 { + NF1() {} + S f; +}; + +// Initializer doesn't call default constructor +struct NF2 { + NF2() : f(1) {} + S f; +}; + +// Initializer calls default constructor without using default argument +struct NF3 { + NF3() : f(1) {} + T f; +}; + +// Initializer calls default constructor without using default argument +struct NF4 { + NF4() : f(2) {} + T f; +}; + +// Initializer is zero-initialization +struct NF5 { + NF5() : i() {} + int i; +}; + +// Initializer is direct-initialization +struct NF6 { + NF6() : i(1) {} + int i; +}; + +// Initializer is aggregate initialization of struct +struct NF7 { + NF7() : f{} {} + U f; +}; + +// Initializer is zero-initialization of struct +struct NF7b { + NF7b() : f() {} + U f; +}; + +// Initializer is aggregate initialization of array +struct NF8 { + NF8() : f{} {} + int f[2]; +}; + +struct NF9 { + NF9() : f{} {} + S f[2]; +}; + +// Initializing member of union +union NF10 { + NF10() : s() {} + int i; + S s; +}; + +// Templated class dependent type +template <class V> +struct NF11 { + NF11() : f() {} + V f; +}; +NF11<int> nf11i; +NF11<S> nf11s; + +// Delegating constructor +class NF12 { + NF12() = default; + NF12(int) : NF12() {} +}; + +// Const member +struct NF13 { + NF13() : f() {} + const S f; +}; + +// Union member +struct NF14 { + NF14() : f() {} + V f; +}; |