forked from OSchip/llvm-project
Fix PR9253, allowing attribute(aligned) to reduce the alignment of
a typedef. llvm-svn: 126059
This commit is contained in:
parent
ef200db4fd
commit
29eb47bd68
|
@ -882,7 +882,13 @@ ASTContext::getTypeInfo(const Type *T) const {
|
|||
const TypedefDecl *Typedef = cast<TypedefType>(T)->getDecl();
|
||||
std::pair<uint64_t, unsigned> Info
|
||||
= getTypeInfo(Typedef->getUnderlyingType().getTypePtr());
|
||||
Align = std::max(Typedef->getMaxAlignment(), Info.second);
|
||||
// If the typedef has an aligned attribute on it, it overrides any computed
|
||||
// alignment we have. This violates the GCC documentation (which says that
|
||||
// attribute(aligned) can only round up) but matches its implementation.
|
||||
if (unsigned AttrAlign = Typedef->getMaxAlignment())
|
||||
Align = AttrAlign;
|
||||
else
|
||||
Align = Info.second;
|
||||
Width = Info.first;
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -117,3 +117,18 @@ struct packed_fas2 {
|
|||
|
||||
extern int m1[sizeof(struct packed_fas2) == 1 ? 1 : -1];
|
||||
extern int m2[__alignof(struct packed_fas2) == 1 ? 1 : -1];
|
||||
|
||||
// Attribute aligned can round down typedefs. PR9253
|
||||
typedef long long __attribute__((aligned(1))) nt;
|
||||
|
||||
struct nS {
|
||||
char buf_nr;
|
||||
nt start_lba;
|
||||
};
|
||||
|
||||
extern int n1[sizeof(struct nS) == 9 ? 1 : -1];
|
||||
extern int n2[__alignof(struct nS) == 1 ? 1 : -1];
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue