]> granicus.if.org Git - clang/commitdiff
Codegen. support for ObjCIsaExpr AST which until now
authorFariborz Jahanian <fjahanian@apple.com>
Wed, 9 Dec 2009 19:05:56 +0000 (19:05 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Wed, 9 Dec 2009 19:05:56 +0000 (19:05 +0000)
was not needed (fixes radar 7453430).

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

lib/CodeGen/CGExprScalar.cpp
lib/Sema/SemaExpr.cpp
test/CodeGenObjC/id-isa-codegen.m [new file with mode: 0644]

index f19aa273d9f011977898ab4212a3e8d8da9003f5..9ac8b4d8b3cd6699bc4fde1ddd464c9664b40e99 100644 (file)
@@ -167,6 +167,25 @@ public:
     return CGF.EmitObjCMessageExpr(E).getScalarVal();
   }
 
+  Value *VisitObjCIsaExpr(ObjCIsaExpr *E) {
+    Value *V;
+    // object->isa or (*object).isa
+    // Generate code as for: *(Class*)object
+    Expr *BaseExpr = E->getBase();
+    if (E->isArrow())
+      V  = 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, CGF.MakeQualifiers(E->getType()));
+    V = CGF.EmitLoadOfLValue(LV, E->getType()).getScalarVal();
+    return V;
+  }
+
   Value *VisitArraySubscriptExpr(ArraySubscriptExpr *E);
   Value *VisitShuffleVectorExpr(ShuffleVectorExpr *E);
   Value *VisitMemberExpr(MemberExpr *E);
index b284f83074cc2cab810270a1c96499c42a1537d2..99afbaf605c912abbaad15cb607263af0373b123 100644 (file)
@@ -2528,8 +2528,8 @@ Sema::LookupMemberExpr(LookupResult &R, Expr *&BaseExpr,
           BaseType->getAs<ObjCObjectPointerType>()) {
         if (OPT->getPointeeType()->isSpecificBuiltinType(BuiltinType::ObjCId) &&
             MemberName.getAsIdentifierInfo()->isStr("isa"))
-          return Owned(new (Context) ObjCIsaExpr(BaseExpr, false, MemberLoc,
-                                                 Context.getObjCIdType()));
+          return Owned(new (Context) ObjCIsaExpr(BaseExpr, true, MemberLoc,
+                                                 Context.getObjCClassType()));
       }
     }
     // We have an 'id' type. Rather than fall through, we check if this
@@ -2888,7 +2888,7 @@ Sema::LookupMemberExpr(LookupResult &R, Expr *&BaseExpr,
       BaseType->isSpecificBuiltinType(BuiltinType::ObjCId) &&
       MemberName.getAsIdentifierInfo()->isStr("isa"))
     return Owned(new (Context) ObjCIsaExpr(BaseExpr, false, MemberLoc,
-                                           Context.getObjCIdType()));
+                                           Context.getObjCClassType()));
 
   // Handle 'field access' to vectors, such as 'V.xx'.
   if (BaseType->isExtVectorType()) {
diff --git a/test/CodeGenObjC/id-isa-codegen.m b/test/CodeGenObjC/id-isa-codegen.m
new file mode 100644 (file)
index 0000000..a9ab425
--- /dev/null
@@ -0,0 +1,24 @@
+// RUN: clang-cc -emit-llvm -o %t %s
+
+typedef struct objc_class *Class;
+
+typedef struct objc_object {
+    Class isa;
+} *id;
+
+@interface I
++ (Class) class;
+- (void)meth : (id)object;
++ (unsigned char) isSubclassOfClass:(Class)aClass ;
+@end
+
+@implementation I
++ (Class) class {return 0;}
++ (unsigned char) isSubclassOfClass:(Class)aClass {return 0;}
+- (void)meth : (id)object {
+    [object->isa isSubclassOfClass:[I class]];
+
+    [(*object).isa isSubclassOfClass:[I class]];
+}
+@end
+