diff options
| author | Matt Beaumont-Gay <matthewbg@google.com> | 2011-11-29 22:43:53 +0000 |
|---|---|---|
| committer | Matt Beaumont-Gay <matthewbg@google.com> | 2011-11-29 22:43:53 +0000 |
| commit | c93b489138173d2ea3fc3d1f6f8a52e6b6dd200f (patch) | |
| tree | 43004e78ff8f2851aaa9e78b2d1d021b015158fc | |
| parent | 70db54f18d179da6fbc0fe2280aaf3688c722f19 (diff) | |
| download | bcm5719-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.cpp | 7 | ||||
| -rw-r--r-- | clang/test/SemaCXX/array-bounds.cpp | 17 |
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. } } |

