Index: lib/CodeGen/CGCall.cpp =================================================================== --- lib/CodeGen/CGCall.cpp +++ lib/CodeGen/CGCall.cpp @@ -1479,7 +1479,8 @@ /***/ bool CodeGenModule::ReturnTypeUsesSRet(const CGFunctionInfo &FI) { - return FI.getReturnInfo().isIndirect(); + const auto &RI = FI.getReturnInfo(); + return RI.isIndirect() || (RI.isInAlloca() && RI.getInAllocaSRet()); } bool CodeGenModule::ReturnSlotInterferesWithArgs(const CGFunctionInfo &FI) { Index: test/CodeGenObjCXX/msabi-stret.mm =================================================================== --- /dev/null +++ test/CodeGenObjCXX/msabi-stret.mm @@ -0,0 +1,18 @@ +// RUN: %clang_cc1 -triple i686-unknown-windows-msvc -fobjc-runtime=ios-6.0 -Os -S -emit-llvm -o - %s -mdisable-fp-elim | FileCheck %s + +struct S { + S() = default; + S(const S &) {} +}; + +@interface I ++ (S)m:(S)s; +@end + +S f() { + return [I m:S()]; +} + +// CHECK: declare dllimport void @objc_msgSend_stret(i8*, i8*, ...) +// CHECK-NOT: declare dllimport void @objc_msgSend(i8*, i8*, ...) +