diff options
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/CodeGen/CGCall.cpp | 3 | ||||
-rw-r--r-- | clang/test/CodeGenObjCXX/msabi-stret.mm | 18 |
2 files changed, 20 insertions, 1 deletions
diff --git a/clang/lib/CodeGen/CGCall.cpp b/clang/lib/CodeGen/CGCall.cpp index 1d346935de1..d1b07f86819 100644 --- a/clang/lib/CodeGen/CGCall.cpp +++ b/clang/lib/CodeGen/CGCall.cpp @@ -1479,7 +1479,8 @@ void ClangToLLVMArgMapping::construct(const ASTContext &Context, /***/ 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) { diff --git a/clang/test/CodeGenObjCXX/msabi-stret.mm b/clang/test/CodeGenObjCXX/msabi-stret.mm new file mode 100644 index 00000000000..765c23887ba --- /dev/null +++ b/clang/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*, ...) + |