diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp index e19ac30ce8c2b..1175a94df27b4 100644 --- a/clang/lib/Sema/SemaDeclAttr.cpp +++ b/clang/lib/Sema/SemaDeclAttr.cpp @@ -5544,12 +5544,12 @@ bool Sema::CheckCallingConvAttr(const ParsedAttr &Attrs, CallingConv &CC, } TargetInfo::CallingConvCheckResult A = TargetInfo::CCCR_OK; + auto *Aux = Context.getAuxTargetInfo(); // CUDA functions may have host and/or device attributes which indicate // their targeted execution environment, therefore the calling convention // of functions in CUDA should be checked against the target deduced based // on their host/device attributes. if (LangOpts.CUDA) { - auto *Aux = Context.getAuxTargetInfo(); assert(FD || CFT != CUDAFunctionTarget::InvalidTarget); auto CudaTarget = FD ? CUDA().IdentifyTarget(FD) : CFT; bool CheckHost = false, CheckDevice = false; @@ -5574,6 +5574,12 @@ bool Sema::CheckCallingConvAttr(const ParsedAttr &Attrs, CallingConv &CC, A = HostTI->checkCallingConvention(CC); if (A == TargetInfo::CCCR_OK && CheckDevice && DeviceTI) A = DeviceTI->checkCallingConvention(CC); + } else if (LangOpts.SYCLIsDevice && (Aux && Aux->getTriple().isOSWindows()) && + TI.getTriple().isAMDGPU() && + getSourceManager().isInSystemHeader(Attrs.getScopeLoc())) { + A = TI.checkCallingConvention(CC); + if (A != TargetInfo::CCCR_OK) + A = Aux->checkCallingConvention(CC); } else { A = TI.checkCallingConvention(CC); } diff --git a/clang/test/SemaSYCL/Inputs/vectorcall.hpp b/clang/test/SemaSYCL/Inputs/vectorcall.hpp new file mode 100644 index 0000000000000..566a48dd24c30 --- /dev/null +++ b/clang/test/SemaSYCL/Inputs/vectorcall.hpp @@ -0,0 +1,18 @@ + +template struct A{}; + +template struct A { static constexpr int value = 0; }; +template struct A { static constexpr int value = 1; }; + +template constexpr int A_v = A::value; + +struct B +{ + void f() noexcept {} + void __vectorcall g() noexcept {} +}; + +int main() +{ + return A_v + A_v; +} diff --git a/clang/test/SemaSYCL/sycl-cconv-win.cpp b/clang/test/SemaSYCL/sycl-cconv-win.cpp new file mode 100644 index 0000000000000..f0c22a2ed3921 --- /dev/null +++ b/clang/test/SemaSYCL/sycl-cconv-win.cpp @@ -0,0 +1,5 @@ +// RUN: %clang_cc1 -isystem %S/Inputs/ -fsycl-is-device -triple amdgcn-amd-hsa -aux-triple x86_64-pc-windows-msvc -fsyntax-only -verify %s + +// expected-no-diagnostics + +#include