From: Daniel Dunbar Date: Wed, 22 Apr 2009 08:50:59 +0000 (+0000) Subject: Simplify. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ae287239879386b9abf6da50a67bbb7fe81897f1;p=clang Simplify. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69793 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CodeGenTypes.cpp b/lib/CodeGen/CodeGenTypes.cpp index 24f4885970..f8d6436cc4 100644 --- a/lib/CodeGen/CodeGenTypes.cpp +++ b/lib/CodeGen/CodeGenTypes.cpp @@ -464,11 +464,20 @@ const llvm::Type *CodeGenTypes::ConvertTagDeclType(const TagDecl *TD) { const llvm::Type *ResultType; const RecordDecl *RD = cast(TD); - if (TD->isStruct() || TD->isClass()) { + + // There isn't any extra information for empty structures/unions. + if (RD->field_empty(getContext())) { + ResultType = llvm::StructType::get(std::vector()); + } else { // Layout fields. RecordOrganizer RO(*this, *RD); - RO.layoutStructFields(Context.getASTRecordLayout(RD)); + if (TD->isStruct() || TD->isClass()) + RO.layoutStructFields(Context.getASTRecordLayout(RD)); + else { + assert(TD->isUnion() && "unknown tag decl kind!"); + RO.layoutUnionFields(Context.getASTRecordLayout(RD)); + } // Get llvm::StructType. const Type *Key = @@ -476,27 +485,6 @@ const llvm::Type *CodeGenTypes::ConvertTagDeclType(const TagDecl *TD) { CGRecordLayouts[Key] = new CGRecordLayout(RO.getLLVMType(), RO.getPaddingFields()); ResultType = RO.getLLVMType(); - - } else if (TD->isUnion()) { - // Just use the largest element of the union, breaking ties with the - // highest aligned member. - if (!RD->field_empty(getContext())) { - RecordOrganizer RO(*this, *RD); - - RO.layoutUnionFields(Context.getASTRecordLayout(RD)); - - // Get llvm::StructType. - const Type *Key = - Context.getTagDeclType(const_cast(TD)).getTypePtr(); - CGRecordLayouts[Key] = new CGRecordLayout(RO.getLLVMType(), - RO.getPaddingFields()); - ResultType = RO.getLLVMType(); - } else { - ResultType = llvm::StructType::get(std::vector()); - } - } else { - assert(0 && "FIXME: Unknown tag decl kind!"); - abort(); } // Refine our Opaque type to ResultType. This can invalidate ResultType, so