|
@@ -30,7 +30,7 @@ typedef llvm::PointerIntPair<llvm::Value*,1,bool> TryEmitResult;
|
|
|
static TryEmitResult
|
|
|
tryEmitARCRetainScalarExpr(CodeGenFunction &CGF, const Expr *e);
|
|
|
static RValue AdjustRelatedResultType(CodeGenFunction &CGF,
|
|
|
- const Expr *E,
|
|
|
+ QualType ET,
|
|
|
const ObjCMethodDecl *Method,
|
|
|
RValue Result);
|
|
|
|
|
@@ -202,20 +202,20 @@ llvm::Value *CodeGenFunction::EmitObjCProtocolExpr(const ObjCProtocolExpr *E) {
|
|
|
/// \brief Adjust the type of the result of an Objective-C message send
|
|
|
/// expression when the method has a related result type.
|
|
|
static RValue AdjustRelatedResultType(CodeGenFunction &CGF,
|
|
|
- const Expr *E,
|
|
|
+ QualType ExpT,
|
|
|
const ObjCMethodDecl *Method,
|
|
|
RValue Result) {
|
|
|
if (!Method)
|
|
|
return Result;
|
|
|
|
|
|
if (!Method->hasRelatedResultType() ||
|
|
|
- CGF.getContext().hasSameType(E->getType(), Method->getResultType()) ||
|
|
|
+ CGF.getContext().hasSameType(ExpT, Method->getResultType()) ||
|
|
|
!Result.isScalar())
|
|
|
return Result;
|
|
|
|
|
|
// We have applied a related result type. Cast the rvalue appropriately.
|
|
|
return RValue::get(CGF.Builder.CreateBitCast(Result.getScalarVal(),
|
|
|
- CGF.ConvertType(E->getType())));
|
|
|
+ CGF.ConvertType(ExpT)));
|
|
|
}
|
|
|
|
|
|
/// Decide whether to extend the lifetime of the receiver of a
|
|
@@ -401,7 +401,7 @@ RValue CodeGenFunction::EmitObjCMessageExpr(const ObjCMessageExpr *E,
|
|
|
Builder.CreateStore(newSelf, selfAddr);
|
|
|
}
|
|
|
|
|
|
- return AdjustRelatedResultType(*this, E, method, result);
|
|
|
+ return AdjustRelatedResultType(*this, E->getType(), method, result);
|
|
|
}
|
|
|
|
|
|
namespace {
|
|
@@ -710,7 +710,7 @@ void CodeGenFunction::GenerateObjCGetter(ObjCImplementationDecl *IMP,
|
|
|
assert(OMD && "Invalid call to generate getter (empty method)");
|
|
|
StartObjCMethod(OMD, IMP->getClassInterface(), OMD->getLocStart());
|
|
|
|
|
|
- generateObjCGetterBody(IMP, PID, AtomicHelperFn);
|
|
|
+ generateObjCGetterBody(IMP, PID, OMD, AtomicHelperFn);
|
|
|
|
|
|
FinishFunction();
|
|
|
}
|
|
@@ -772,6 +772,7 @@ static void emitCPPObjectAtomicGetterCall(CodeGenFunction &CGF,
|
|
|
void
|
|
|
CodeGenFunction::generateObjCGetterBody(const ObjCImplementationDecl *classImpl,
|
|
|
const ObjCPropertyImplDecl *propImpl,
|
|
|
+ const ObjCMethodDecl *GetterMethodDecl,
|
|
|
llvm::Constant *AtomicHelperFn) {
|
|
|
// If there's a non-trivial 'get' expression, we just have to emit that.
|
|
|
if (!hasTrivialGetExpr(propImpl)) {
|
|
@@ -905,6 +906,8 @@ CodeGenFunction::generateObjCGetterBody(const ObjCImplementationDecl *classImpl,
|
|
|
}
|
|
|
|
|
|
value = Builder.CreateBitCast(value, ConvertType(propType));
|
|
|
+ value = Builder.CreateBitCast(value,
|
|
|
+ ConvertType(GetterMethodDecl->getResultType()));
|
|
|
}
|
|
|
|
|
|
EmitReturnOfRValue(RValue::get(value), propType);
|