diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index d2330f8e4f46f..c5fbf4d9892ba 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -2065,7 +2065,9 @@ TypeInfo ASTContext::getTypeInfoImpl(const Type *T) const { Align = Target->getDoubleAlign(); break; case BuiltinType::LongDouble: - if (getLangOpts().OpenMP && getLangOpts().OpenMPIsDevice && + if (((getLangOpts().SYCL && getLangOpts().SYCLIsDevice) || + (getLangOpts().OpenMP && getLangOpts().OpenMPIsDevice)) && + AuxTarget != nullptr && (Target->getLongDoubleWidth() != AuxTarget->getLongDoubleWidth() || Target->getLongDoubleAlign() != AuxTarget->getLongDoubleAlign())) { Width = AuxTarget->getLongDoubleWidth(); diff --git a/clang/lib/Basic/Targets/SPIR.h b/clang/lib/Basic/Targets/SPIR.h index dcaabec665367..090ef3f5f37d8 100644 --- a/clang/lib/Basic/Targets/SPIR.h +++ b/clang/lib/Basic/Targets/SPIR.h @@ -209,8 +209,6 @@ class LLVM_LIBRARY_VISIBILITY MicrosoftX86_32SPIRTargetInfo MicrosoftX86_32SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) : WindowsX86_32SPIRTargetInfo(Triple, Opts) { - LongDoubleWidth = LongDoubleAlign = 64; - LongDoubleFormat = &llvm::APFloat::IEEEdouble(); assert(DataLayout->getPointerSizeInBits() == 32); } @@ -261,8 +259,6 @@ class LLVM_LIBRARY_VISIBILITY MicrosoftX86_64_SPIR64TargetInfo MicrosoftX86_64_SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) : WindowsX86_64_SPIR64TargetInfo(Triple, Opts) { - LongDoubleWidth = LongDoubleAlign = 64; - LongDoubleFormat = &llvm::APFloat::IEEEdouble(); assert(DataLayout->getPointerSizeInBits() == 64); } diff --git a/clang/test/SemaSYCL/check-long-double-size.cpp b/clang/test/SemaSYCL/check-long-double-size.cpp new file mode 100644 index 0000000000000..62ec21b36fcad --- /dev/null +++ b/clang/test/SemaSYCL/check-long-double-size.cpp @@ -0,0 +1,7 @@ +// RUN: %clang_cc1 -fsycl -fsycl-is-device -triple spir64-unknown-unknown-sycldevice -aux-triple x86_64-unknown-linux-gnu -fsyntax-only -DLONG_DOUBLE_SIZE=16 -verify %s +// RUN: %clang_cc1 -fsycl -fsycl-is-device -triple spir-unknown-unknown-sycldevice -aux-triple i386-pc-linux-gnu -fsyntax-only -DLONG_DOUBLE_SIZE=12 -verify %s +// RUN: %clang_cc1 -fsycl -fsycl-is-device -triple spir64-unknown-windows-sycldevice -aux-triple x86_64-pc-windows-msvc -fsyntax-only -DLONG_DOUBLE_SIZE=8 -verify %s +// RUN: %clang_cc1 -fsycl -fsycl-is-device -triple spir-unknown-windows-sycldevice -aux-triple i686-pc-windows-msvc -fsyntax-only -DLONG_DOUBLE_SIZE=8 -verify %s +// expected-no-diagnostics + +static_assert(sizeof(long double) == LONG_DOUBLE_SIZE, "wrong sizeof long double");