diff --git a/clang/lib/CodeGen/MicrosoftCXXABI.cpp b/clang/lib/CodeGen/MicrosoftCXXABI.cpp index 5fcb892f7fb87d..cae79099dd6bcf 100644 --- a/clang/lib/CodeGen/MicrosoftCXXABI.cpp +++ b/clang/lib/CodeGen/MicrosoftCXXABI.cpp @@ -825,7 +825,7 @@ MicrosoftCXXABI::getRecordArgABI(const CXXRecordDecl *RD) const { switch (CGM.getTarget().getTriple().getArch()) { default: // FIXME: Implement for other architectures. - return RAA_Default; + return RAA_Indirect; case llvm::Triple::thumb: // Pass things indirectly for now because it is simple. diff --git a/clang/test/CodeGenCXX/microsoft-abi-unknown-arch.cpp b/clang/test/CodeGenCXX/microsoft-abi-unknown-arch.cpp new file mode 100644 index 00000000000000..bb0364186eb40e --- /dev/null +++ b/clang/test/CodeGenCXX/microsoft-abi-unknown-arch.cpp @@ -0,0 +1,21 @@ +// RUN: %clang_cc1 -emit-llvm %s -o - -triple=ppc64-windows-msvc | FileCheck %s + +// The purpose of this test is to see that we do something reasonable for +// architectures where we haven't checked what MSVC does. + +struct A { + A() : a(42) {} + A(const A &o) : a(o.a) {} + ~A() {} + int a; +}; + +struct B { + A foo(A o); +}; + +A B::foo(A x) { + return x; +} + +// CHECK-LABEL: define void @"?foo@B@@QEAA?AUA@@U2@@Z"(%struct.B* %this, %struct.A* noalias sret align 4 %agg.result, %struct.A* %x)