diff options
author | Alex Lorenz <arphaman@gmail.com> | 2016-10-05 09:27:48 +0000 |
---|---|---|
committer | Alex Lorenz <arphaman@gmail.com> | 2016-10-05 09:27:48 +0000 |
commit | 014181e7f41cdad4a7c6e593360fc610cce1d210 (patch) | |
tree | bdf75ef8b8923625a0b25e4a9d15c614538a72ce | |
parent | 602e625622c1da7510c65b1d2744e8f20504d435 (diff) | |
download | bcm5719-llvm-014181e7f41cdad4a7c6e593360fc610cce1d210.tar.gz bcm5719-llvm-014181e7f41cdad4a7c6e593360fc610cce1d210.zip |
[Sema] Packed member warning: Use the typedef name for anonymous structures
This commit improves the packed member warning by showing the name of the
anonymous structure/union when it was defined within a typedef declaration.
rdar://28498901
Differential Revision: https://reviews.llvm.org/D25106
llvm-svn: 283304
-rw-r--r-- | clang/lib/Sema/SemaChecking.cpp | 7 | ||||
-rw-r--r-- | clang/test/Sema/address-packed.c | 35 |
2 files changed, 41 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index 416be739a8c..013120a8bd1 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -11372,8 +11372,13 @@ void Sema::AddPotentialMisalignedMembers(Expr *E, RecordDecl *RD, ValueDecl *MD, void Sema::DiagnoseMisalignedMembers() { for (MisalignedMember &m : MisalignedMembers) { + const NamedDecl *ND = m.RD; + if (ND->getName().empty()) { + if (const TypedefNameDecl *TD = m.RD->getTypedefNameForAnonDecl()) + ND = TD; + } Diag(m.E->getLocStart(), diag::warn_taking_address_of_packed_member) - << m.MD << m.RD << m.E->getSourceRange(); + << m.MD << ND << m.E->getSourceRange(); } MisalignedMembers.clear(); } diff --git a/clang/test/Sema/address-packed.c b/clang/test/Sema/address-packed.c index bfc0b2f74a1..972d88baa79 100644 --- a/clang/test/Sema/address-packed.c +++ b/clang/test/Sema/address-packed.c @@ -161,3 +161,38 @@ struct AlignedTo2Bis* g7(struct AlignedTo2 *s) { return (struct AlignedTo2Bis*)&s->x; // no-warning } + +typedef struct { + char c; + int x; +} __attribute__((packed)) TypedefStructArguable; + +typedef union { + char c; + int x; +} __attribute((packed)) TypedefUnionArguable; + +typedef TypedefStructArguable TypedefStructArguableTheSecond; + +int *typedef1(TypedefStructArguable *s) { + return &s->x; // expected-warning {{packed member 'x' of class or structure 'TypedefStructArguable'}} +} + +int *typedef2(TypedefStructArguableTheSecond *s) { + return &s->x; // expected-warning {{packed member 'x' of class or structure 'TypedefStructArguable'}} +} + +int *typedef3(TypedefUnionArguable *s) { + return &s->x; // expected-warning {{packed member 'x' of class or structure 'TypedefUnionArguable'}} +} + +struct S6 { + union { + char c; + int x; + } __attribute__((packed)); +}; + +int *anonymousInnerUnion(struct S6 *s) { + return &s->x; // expected-warning {{packed member 'x' of class or structure 'S6::(anonymous)'}} +} |