forked from OSchip/llvm-project
Match union field type when member expression is u->x
llvm-svn: 44879
This commit is contained in:
parent
d4e5fbacab
commit
b37b12d102
|
@ -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<PointerType>(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<llvm::PointerType>(BaseValue->getType());
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue