]> granicus.if.org Git - clang/commitdiff
Fix a code gen bug accessing 'isa' field via a message call
authorFariborz Jahanian <fjahanian@apple.com>
Fri, 5 Feb 2010 19:18:30 +0000 (19:18 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Fri, 5 Feb 2010 19:18:30 +0000 (19:18 +0000)
(Fixes radar 7609722).

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@95406 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGExprScalar.cpp
test/CodeGenObjC/id-isa-codegen.m

index f58d6e871bfba65947da540b4e720be2d467763e..cb3fb61cf3ff12743f82b519381c6cc192ad637a 100644 (file)
@@ -1880,14 +1880,23 @@ LValue CodeGenFunction::EmitObjCIsaExpr(const ObjCIsaExpr *E) {
   llvm::Value *V;
   // object->isa or (*object).isa
   // Generate code as for: *(Class*)object
+  // build Class* type
+  const llvm::Type *ClassPtrTy = ConvertType(E->getType());
+
   Expr *BaseExpr = E->getBase();
-  if (E->isArrow())
-    V = ScalarExprEmitter(*this).EmitLoadOfLValue(BaseExpr);
-  else
-    V  = EmitLValue(BaseExpr).getAddress();
+  if (BaseExpr->isLvalue(getContext()) != Expr::LV_Valid) {
+    V = CreateTempAlloca(ClassPtrTy, "resval");
+    llvm::Value *Src = EmitScalarExpr(BaseExpr);
+    Builder.CreateStore(Src, V);
+  }
+  else {
+      if (E->isArrow())
+        V = ScalarExprEmitter(*this).EmitLoadOfLValue(BaseExpr);
+      else
+        V  = EmitLValue(BaseExpr).getAddress();
+  }
   
   // build Class* type
-  const llvm::Type *ClassPtrTy = ConvertType(E->getType());
   ClassPtrTy = ClassPtrTy->getPointerTo();
   V = Builder.CreateBitCast(V, ClassPtrTy);
   LValue LV = LValue::MakeAddr(V, MakeQualifiers(E->getType()));
index 89e992209071e912d7f401323f9e85f603387d77..3179e11b7f399ef9bc5ee2c32d60971f1d87bb98 100644 (file)
@@ -34,3 +34,17 @@ Class Test(const void *inObject1) {
    return ((id)inObject1)->isa;
   return (id)0;
 }
+
+// rdar 7609722
+@interface Foo { 
+@public 
+  id isa; 
+} 
++(id)method;
+@end
+
+id Test2() {
+    if([Foo method]->isa)
+      return (*[Foo method]).isa;
+    return [Foo method]->isa;
+}