summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatt Beaumont-Gay <matthewbg@google.com>2011-11-29 22:43:53 +0000
committerMatt Beaumont-Gay <matthewbg@google.com>2011-11-29 22:43:53 +0000
commitc93b489138173d2ea3fc3d1f6f8a52e6b6dd200f (patch)
tree43004e78ff8f2851aaa9e78b2d1d021b015158fc
parent70db54f18d179da6fbc0fe2280aaf3688c722f19 (diff)
downloadbcm5719-llvm-c93b489138173d2ea3fc3d1f6f8a52e6b6dd200f.tar.gz
bcm5719-llvm-c93b489138173d2ea3fc3d1f6f8a52e6b6dd200f.zip
Suppress -Warray-bounds for classes (not just structs) where the last field is
a 1-length character array. llvm-svn: 145445
-rw-r--r--clang/lib/Sema/SemaChecking.cpp7
-rw-r--r--clang/test/SemaCXX/array-bounds.cpp17
2 files changed, 18 insertions, 6 deletions
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp
index 9dd03133b99..ec36963ed61 100644
--- a/clang/lib/Sema/SemaChecking.cpp
+++ b/clang/lib/Sema/SemaChecking.cpp
@@ -4202,8 +4202,11 @@ static bool IsTailPaddedMemberArray(Sema &S, llvm::APInt Size,
return false;
const RecordDecl *RD = dyn_cast<RecordDecl>(FD->getDeclContext());
- if (!RD || !RD->isStruct())
- return false;
+ if (!RD) return false;
+ if (RD->isUnion()) return false;
+ if (const CXXRecordDecl *CRD = dyn_cast<CXXRecordDecl>(RD)) {
+ if (!CRD->isStandardLayout()) return false;
+ }
// See if this is the last field decl in the record.
const Decl *D = FD;
diff --git a/clang/test/SemaCXX/array-bounds.cpp b/clang/test/SemaCXX/array-bounds.cpp
index 48788f67d74..c1b37011727 100644
--- a/clang/test/SemaCXX/array-bounds.cpp
+++ b/clang/test/SemaCXX/array-bounds.cpp
@@ -190,10 +190,19 @@ namespace tailpad {
int x;
char c2[1];
};
-
- char bar(struct foo *F) {
- return F->c1[3]; // expected-warning {{array index 3 is past the end of the array (which contains 1 element)}}
- return F->c2[3]; // no warning, foo could have tail padding allocated.
+
+ class baz {
+ public:
+ char c1[1]; // expected-note {{declared here}}
+ int x;
+ char c2[1];
+ };
+
+ char bar(struct foo *F, baz *B) {
+ return F->c1[3] + // expected-warning {{array index 3 is past the end of the array (which contains 1 element)}}
+ F->c2[3] + // no warning, foo could have tail padding allocated.
+ B->c1[3] + // expected-warning {{array index 3 is past the end of the array (which contains 1 element)}}
+ B->c2[3]; // no warning, baz could have tail padding allocated.
}
}
OpenPOWER on IntegriCloud