From: Devang Patel Date: Tue, 11 Dec 2007 21:33:16 +0000 (+0000) Subject: Match union field type when member expression is u->x X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=fe2419aac49879f08eddc8917171b943dbe571ad;p=clang 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 --- 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()); diff --git a/test/CodeGen/union.c b/test/CodeGen/union.c index 473293847c..4d32abdf54 100644 --- a/test/CodeGen/union.c +++ b/test/CodeGen/union.c @@ -1,6 +1,6 @@ // RUN: clang %s -emit-llvm -union { +union u_tag { int a; float b; } u; @@ -9,6 +9,10 @@ void f() { u.b = 11; } +float get_b(union u_tag *my_u) { + return my_u->b; +} + int f2( float __x ) { union{ float __f;