forked from OSchip/llvm-project
[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
This commit is contained in:
parent
602e625622
commit
014181e7f4
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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)'}}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue