From fe2419aac49879f08eddc8917171b943dbe571ad Mon Sep 17 00:00:00 2001 From: Devang Patel Date: Tue, 11 Dec 2007 21:33:16 +0000 Subject: Match union field type when member expression is u->x git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@44879 91177308-0d34-0410-b5e6-96231b3b80d8 --- CodeGen/CGExpr.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'CodeGen/CGExpr.cpp') diff --git a/CodeGen/CGExpr.cpp b/CodeGen/CGExpr.cpp index 5026c83433..ab5d05969e 100644 --- a/CodeGen/CGExpr.cpp +++ b/CodeGen/CGExpr.cpp @@ -387,16 +387,24 @@ EmitOCUVectorElementExpr(const OCUVectorElementExpr *E) { LValue CodeGenFunction::EmitMemberExpr(const MemberExpr *E) { + bool isUnion = false; Expr *BaseExpr = E->getBase(); llvm::Value *BaseValue = NULL; // If this is s.x, emit s as an lvalue. If it is s->x, emit s as a scalar. - if (E->isArrow()) + if (E->isArrow()) { BaseValue = EmitScalarExpr(BaseExpr); + const PointerType *PTy = + cast(BaseExpr->getType().getCanonicalType()); + if (PTy->getPointeeType()->isUnionType()) + isUnion = true; + } else { LValue BaseLV = EmitLValue(BaseExpr); // FIXME: this isn't right for bitfields. BaseValue = BaseLV.getAddress(); + if (BaseExpr->getType()->isUnionType()) + isUnion = true; } FieldDecl *Field = E->getMemberDecl(); @@ -409,7 +417,7 @@ LValue CodeGenFunction::EmitMemberExpr(const MemberExpr *E) { llvm::Value *V = Builder.CreateGEP(BaseValue,Idxs, Idxs + 2, "tmp"); // Match union field type. - if (BaseExpr->getType()->isUnionType()) { + if (isUnion) { const llvm::Type * FieldTy = ConvertType(Field->getType()); const llvm::PointerType * BaseTy = cast(BaseValue->getType()); -- cgit v1.2.3-70-g09d2