summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Lorenz <arphaman@gmail.com>2016-10-05 09:27:48 +0000
committerAlex Lorenz <arphaman@gmail.com>2016-10-05 09:27:48 +0000
commit014181e7f41cdad4a7c6e593360fc610cce1d210 (patch)
treebdf75ef8b8923625a0b25e4a9d15c614538a72ce
parent602e625622c1da7510c65b1d2744e8f20504d435 (diff)
downloadbcm5719-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.cpp7
-rw-r--r--clang/test/Sema/address-packed.c35
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)'}}
+}
OpenPOWER on IntegriCloud