Packed unions should be packed. Fixes an assert Daniel reported.

llvm-svn: 80808
This commit is contained in:
Anders Carlsson 2009-09-02 17:51:33 +00:00
parent 7bd37b47c8
commit 09a3774cd3
2 changed files with 17 additions and 2 deletions

View File

@ -28,14 +28,13 @@ using namespace CodeGen;
void CGRecordLayoutBuilder::Layout(const RecordDecl *D) { void CGRecordLayoutBuilder::Layout(const RecordDecl *D) {
Alignment = Types.getContext().getASTRecordLayout(D).getAlignment() / 8; Alignment = Types.getContext().getASTRecordLayout(D).getAlignment() / 8;
Packed = D->hasAttr<PackedAttr>();
if (D->isUnion()) { if (D->isUnion()) {
LayoutUnion(D); LayoutUnion(D);
return; return;
} }
Packed = D->hasAttr<PackedAttr>();
if (LayoutFields(D)) if (LayoutFields(D))
return; return;

View File

@ -0,0 +1,16 @@
// RUN: clang-cc -triple x86_64-apple-darwin10 -emit-llvm %s -o %t &&
// RUN: grep "struct._attrs = type <{ i32, i8 }>" %t &&
typedef struct _attrs {
unsigned file_attributes;
unsigned char filename_length;
} __attribute__((__packed__)) attrs;
// RUN: grep "union._attr_union = type <{ i32, i8 }>" %t
typedef union _attr_union {
attrs file_attrs;
unsigned owner_id;
} __attribute__((__packed__)) attr_union;
attr_union u;