diff options
author | Alexander Shaposhnikov <shal1t712@gmail.com> | 2018-10-30 01:20:37 +0000 |
---|---|---|
committer | Alexander Shaposhnikov <shal1t712@gmail.com> | 2018-10-30 01:20:37 +0000 |
commit | e2f073463e9522b3a7effe1481eeb10a24e8c649 (patch) | |
tree | a66c62d68c6ce68c01d14107be6e8aa1ae4ca241 /clang/test/Analysis/padding_inherit.cpp | |
parent | 7c180fa9153e743138c45e88114aab5d72b4dff5 (diff) | |
download | bcm5719-llvm-e2f073463e9522b3a7effe1481eeb10a24e8c649.tar.gz bcm5719-llvm-e2f073463e9522b3a7effe1481eeb10a24e8c649.zip |
[analyzer] Allow padding checker to traverse simple class hierarchies
The existing padding checker skips classes that have any base classes.
This patch allows the checker to traverse very simple cases:
classes that have no fields and have exactly one base class.
This is important mostly in the case of array declarations.
Patch by Max Bernstein!
Test plan: make check-all
Differential revision: https://reviews.llvm.org/D53206
llvm-svn: 345558
Diffstat (limited to 'clang/test/Analysis/padding_inherit.cpp')
-rw-r--r-- | clang/test/Analysis/padding_inherit.cpp | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/clang/test/Analysis/padding_inherit.cpp b/clang/test/Analysis/padding_inherit.cpp new file mode 100644 index 00000000000..2222c990a1d --- /dev/null +++ b/clang/test/Analysis/padding_inherit.cpp @@ -0,0 +1,28 @@ +// RUN: %clang_analyze_cc1 -std=c++14 -analyzer-checker=optin.performance -analyzer-config optin.performance.Padding:AllowedPad=20 -verify %s + +// A class that has no fields and one base class should visit that base class +// instead. Note that despite having excess padding of 2, this is flagged +// because of its usage in an array of 100 elements below (`ais'). +// TODO: Add a note to the bug report with BugReport::addNote() to mention the +// variable using the class and also mention what class is inherting from what. +// expected-warning@+1{{Excessive padding in 'struct FakeIntSandwich'}} +struct FakeIntSandwich { + char c1; + int i; + char c2; +}; + +struct AnotherIntSandwich : FakeIntSandwich { // no-warning +}; + +// But we don't yet support multiple base classes. +struct IntSandwich {}; +struct TooManyBaseClasses : FakeIntSandwich, IntSandwich { // no-warning +}; + +AnotherIntSandwich ais[100]; + +struct Empty {}; +struct DoubleEmpty : Empty { // no-warning + Empty e; +}; |