diff options
-rw-r--r-- | lib/CodeGen/CGExpr.cpp | 19 | ||||
-rw-r--r-- | test/CodeGen/union.c | 3 |
2 files changed, 12 insertions, 10 deletions
diff --git a/lib/CodeGen/CGExpr.cpp b/lib/CodeGen/CGExpr.cpp index d715b45229..f657d8f288 100644 --- a/lib/CodeGen/CGExpr.cpp +++ b/lib/CodeGen/CGExpr.cpp @@ -557,9 +557,7 @@ LValue CodeGenFunction::EmitLValueForField(llvm::Value* BaseValue, llvm::Value *V; unsigned idx = CGM.getTypes().getLLVMFieldNo(Field); - if (!Field->isBitField()) { - V = Builder.CreateStructGEP(BaseValue, idx, "tmp"); - } else { + if (Field->isBitField()) { // FIXME: CodeGenTypes should expose a method to get the appropriate // type for FieldTy (the appropriate type is ABI-dependent). unsigned EltTySize = @@ -574,8 +572,15 @@ LValue CodeGenFunction::EmitLValueForField(llvm::Value* BaseValue, V = Builder.CreateGEP(BaseValue, llvm::ConstantInt::get(llvm::Type::Int32Ty, idx), "tmp"); + + CodeGenTypes::BitFieldInfo bitFieldInfo = + CGM.getTypes().getBitFieldInfo(Field); + return LValue::MakeBitfield(V, bitFieldInfo.Begin, bitFieldInfo.Size, + Field->getType()->isSignedIntegerType()); } + V = Builder.CreateStructGEP(BaseValue, idx, "tmp"); + // Match union field type. if (isUnion) { const llvm::Type * FieldTy = ConvertType(Field->getType()); @@ -587,13 +592,7 @@ LValue CodeGenFunction::EmitLValueForField(llvm::Value* BaseValue, "tmp"); } - if (!Field->isBitField()) - return LValue::MakeAddr(V); - - CodeGenTypes::BitFieldInfo bitFieldInfo = - CGM.getTypes().getBitFieldInfo(Field); - return LValue::MakeBitfield(V, bitFieldInfo.Begin, bitFieldInfo.Size, - Field->getType()->isSignedIntegerType()); + return LValue::MakeAddr(V); } LValue CodeGenFunction::EmitCompoundLiteralLValue(const CompoundLiteralExpr* E) { diff --git a/test/CodeGen/union.c b/test/CodeGen/union.c index 1e4346d471..616cf56ece 100644 --- a/test/CodeGen/union.c +++ b/test/CodeGen/union.c @@ -36,3 +36,6 @@ typedef union{ } q; int qfunc() {q buf; unsigned char* x = buf.x;} +union RR {_Bool a : 1;} RRU; +int RRF(void) {return RRU.a;} + |