summaryrefslogtreecommitdiffstats
path: root/clang/test/Analysis/padding_inherit.cpp
diff options
context:
space:
mode:
authorAlexander Shaposhnikov <shal1t712@gmail.com>2018-10-30 01:20:37 +0000
committerAlexander Shaposhnikov <shal1t712@gmail.com>2018-10-30 01:20:37 +0000
commite2f073463e9522b3a7effe1481eeb10a24e8c649 (patch)
treea66c62d68c6ce68c01d14107be6e8aa1ae4ca241 /clang/test/Analysis/padding_inherit.cpp
parent7c180fa9153e743138c45e88114aab5d72b4dff5 (diff)
downloadbcm5719-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.cpp28
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;
+};
OpenPOWER on IntegriCloud