From 735a4158d96dfbda71e0ecc275755fafe56a40f1 Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Fri, 21 Nov 2008 18:14:01 +0000 Subject: Fields of ivars of struct types are considered ivars themselves for gc API generation purposes. llvm-svn: 59828 --- clang/lib/CodeGen/CGExpr.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'clang/lib/CodeGen/CGExpr.cpp') diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index 21ac806c624..4f2bd4871b8 100644 --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/lib/CodeGen/CGExpr.cpp @@ -732,6 +732,7 @@ EmitExtVectorElementExpr(const ExtVectorElementExpr *E) { LValue CodeGenFunction::EmitMemberExpr(const MemberExpr *E) { bool isUnion = false; + bool isIvar = false; Expr *BaseExpr = E->getBase(); llvm::Value *BaseValue = NULL; unsigned CVRQualifiers=0; @@ -747,6 +748,8 @@ LValue CodeGenFunction::EmitMemberExpr(const MemberExpr *E) { } else { LValue BaseLV = EmitLValue(BaseExpr); + if (BaseLV.isObjCIvar()) + isIvar = true; // FIXME: this isn't right for bitfields. BaseValue = BaseLV.getAddress(); if (BaseExpr->getType()->isUnionType()) @@ -755,7 +758,9 @@ LValue CodeGenFunction::EmitMemberExpr(const MemberExpr *E) { } FieldDecl *Field = E->getMemberDecl(); - return EmitLValueForField(BaseValue, Field, isUnion, CVRQualifiers); + LValue MemExpLV = EmitLValueForField(BaseValue, Field, isUnion, CVRQualifiers); + LValue::SetObjCIvar(MemExpLV, isIvar); + return MemExpLV; } LValue CodeGenFunction::EmitLValueForField(llvm::Value* BaseValue, @@ -937,7 +942,7 @@ LValue CodeGenFunction::EmitLValueForIvar(llvm::Value *BaseValue, llvm::Value *V = Builder.CreateStructGEP(BaseValue, Index, "tmp"); LValue LV = LValue::MakeAddr(V, Ivar->getType().getCVRQualifiers()|CVRQualifiers); SetVarDeclObjCAttribute(getContext(), Ivar, Ivar->getType(), LV); - LValue::SetObjCIvar(LV); + LValue::SetObjCIvar(LV, true); return LV; } -- cgit v1.2.3