summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2009-12-15 21:34:52 +0000
committerFariborz Jahanian <fjahanian@apple.com>2009-12-15 21:34:52 +0000
commit2b9fc83db5c892044f86a160a66f9709b8e44ff6 (patch)
tree8df90bc8fabcbf63fe26467ad6e64ad7651e72c6
parent6e997b2993d77e125f658908246eede2a69f9bff (diff)
downloadbcm5719-llvm-2b9fc83db5c892044f86a160a66f9709b8e44ff6.tar.gz
bcm5719-llvm-2b9fc83db5c892044f86a160a66f9709b8e44ff6.zip
Fixes a code gen bug related to accessing a now
non-existing 'isa' field of a non-existing struct type all related to legacy type definition for 'id' which we have dropped in clang in favor of a built-in type. (fixes radar 7470820). llvm-svn: 91455
-rw-r--r--clang/lib/CodeGen/CGExpr.cpp1
-rw-r--r--clang/lib/Sema/SemaExpr.cpp4
-rw-r--r--clang/test/CodeGenObjC/id-isa-codegen.m9
3 files changed, 13 insertions, 1 deletions
diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp
index 8e1413386af..c5a89e032b2 100644
--- a/clang/lib/CodeGen/CGExpr.cpp
+++ b/clang/lib/CodeGen/CGExpr.cpp
@@ -1389,6 +1389,7 @@ LValue CodeGenFunction::EmitCastLValue(const CastExpr *E) {
case CastExpr::CK_NoOp:
case CastExpr::CK_ConstructorConversion:
case CastExpr::CK_UserDefinedConversion:
+ case CastExpr::CK_AnyPointerToObjCPointerCast:
return EmitLValue(E->getSubExpr());
case CastExpr::CK_DerivedToBase: {
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index cda27cf6871..65c95b36aa0 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -3584,7 +3584,9 @@ static CastExpr::CastKind getScalarCastKind(ASTContext &Context,
if (SrcTy->hasPointerRepresentation()) {
if (DestTy->hasPointerRepresentation())
- return CastExpr::CK_BitCast;
+ return DestTy->isObjCObjectPointerType() ?
+ CastExpr::CK_AnyPointerToObjCPointerCast :
+ CastExpr::CK_BitCast;
if (DestTy->isIntegerType())
return CastExpr::CK_PointerToIntegral;
}
diff --git a/clang/test/CodeGenObjC/id-isa-codegen.m b/clang/test/CodeGenObjC/id-isa-codegen.m
index dc0bac3000e..89e99220907 100644
--- a/clang/test/CodeGenObjC/id-isa-codegen.m
+++ b/clang/test/CodeGenObjC/id-isa-codegen.m
@@ -25,3 +25,12 @@ typedef struct objc_object {
}
@end
+
+// rdar 7470820
+static Class MyClass;
+
+Class Test(const void *inObject1) {
+ if(((id)inObject1)->isa == MyClass)
+ return ((id)inObject1)->isa;
+ return (id)0;
+}
OpenPOWER on IntegriCloud