arphaman created this revision. arphaman added reviewers: aaron.ballman, rogfer01. arphaman added a subscriber: cfe-commits. arphaman set the repository for this revision to rL LLVM.
This patch improves the packed member warning by showing the name of the anonymous structure/union when it was defined with a typedef, e.g. the code below: typedef struct { char c; int x; } __attribute__((packed)) Foo; int *foo(Foo *f) { return &f->x; } Would now produce the following warning: taking address of packed member 'x' of class or structure 'Foo' may result in an unaligned pointer value Repository: rL LLVM https://reviews.llvm.org/D25106 Files: Sema/SemaChecking.cpp Sema/address-packed.c Index: Sema/address-packed.c =================================================================== --- Sema/address-packed.c +++ Sema/address-packed.c @@ -161,3 +161,27 @@ { 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'}} +} Index: Sema/SemaChecking.cpp =================================================================== --- Sema/SemaChecking.cpp +++ Sema/SemaChecking.cpp @@ -11279,8 +11279,13 @@ void Sema::DiagnoseMisalignedMembers() { for (MisalignedMember &m : MisalignedMembers) { + const NamedDecl *ND = m.RD; + if (ND->getName().empty()) { + if (const auto *TypedefDecl = m.RD->getTypedefNameForAnonDecl()) + ND = TypedefDecl; + } 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(); }
Index: Sema/address-packed.c =================================================================== --- Sema/address-packed.c +++ Sema/address-packed.c @@ -161,3 +161,27 @@ { 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'}} +} Index: Sema/SemaChecking.cpp =================================================================== --- Sema/SemaChecking.cpp +++ Sema/SemaChecking.cpp @@ -11279,8 +11279,13 @@ void Sema::DiagnoseMisalignedMembers() { for (MisalignedMember &m : MisalignedMembers) { + const NamedDecl *ND = m.RD; + if (ND->getName().empty()) { + if (const auto *TypedefDecl = m.RD->getTypedefNameForAnonDecl()) + ND = TypedefDecl; + } 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(); }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits