diff options
| author | Fariborz Jahanian <fjahanian@apple.com> | 2009-12-15 21:34:52 +0000 |
|---|---|---|
| committer | Fariborz Jahanian <fjahanian@apple.com> | 2009-12-15 21:34:52 +0000 |
| commit | 2b9fc83db5c892044f86a160a66f9709b8e44ff6 (patch) | |
| tree | 8df90bc8fabcbf63fe26467ad6e64ad7651e72c6 | |
| parent | 6e997b2993d77e125f658908246eede2a69f9bff (diff) | |
| download | bcm5719-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.cpp | 1 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 4 | ||||
| -rw-r--r-- | clang/test/CodeGenObjC/id-isa-codegen.m | 9 |
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; +} |

