Author: Steven Perron Date: 2025-06-18T19:30:43-04:00 New Revision: 5f69d680e2cc94dcb30a7f29e8144725530a6da4
URL: https://github.com/llvm/llvm-project/commit/5f69d680e2cc94dcb30a7f29e8144725530a6da4 DIFF: https://github.com/llvm/llvm-project/commit/5f69d680e2cc94dcb30a7f29e8144725530a6da4.diff LOG: Revert "[HLSL][SPIRV] Add vk::constant_id attribute." (#144812) Reverts llvm/llvm-project#143544 Added: clang/test/CodeGenHLSL/inline-spirv/SpirvType.alignment.hlsl clang/test/CodeGenHLSL/inline-spirv/SpirvType.hlsl Modified: clang/include/clang/Basic/Attr.td clang/include/clang/Basic/AttrDocs.td clang/include/clang/Basic/Builtins.td clang/include/clang/Basic/DiagnosticSemaKinds.td clang/include/clang/Sema/SemaHLSL.h clang/lib/CodeGen/CGHLSLBuiltins.cpp clang/lib/CodeGen/CodeGenFunction.h clang/lib/Sema/SemaDecl.cpp clang/lib/Sema/SemaDeclAttr.cpp clang/lib/Sema/SemaHLSL.cpp Removed: clang/test/AST/HLSL/vk.spec-constant.usage.hlsl clang/test/CodeGenHLSL/vk-features/SpirvType.alignment.hlsl clang/test/CodeGenHLSL/vk-features/SpirvType.hlsl clang/test/CodeGenHLSL/vk-features/vk.spec-constant.hlsl clang/test/SemaHLSL/vk.spec-constant.error.hlsl ################################################################################ diff --git a/clang/include/clang/Basic/Attr.td b/clang/include/clang/Basic/Attr.td index 27fea7dea0a5e..f113cd2ba2fbf 100644 --- a/clang/include/clang/Basic/Attr.td +++ b/clang/include/clang/Basic/Attr.td @@ -5023,14 +5023,6 @@ def HLSLVkExtBuiltinInput : InheritableAttr { let Documentation = [HLSLVkExtBuiltinInputDocs]; } -def HLSLVkConstantId : InheritableAttr { - let Spellings = [CXX11<"vk", "constant_id">]; - let Args = [IntArgument<"Id">]; - let Subjects = SubjectList<[ExternalGlobalVar]>; - let LangOpts = [HLSL]; - let Documentation = [VkConstantIdDocs]; -} - def RandomizeLayout : InheritableAttr { let Spellings = [GCC<"randomize_layout">]; let Subjects = SubjectList<[Record]>; diff --git a/clang/include/clang/Basic/AttrDocs.td b/clang/include/clang/Basic/AttrDocs.td index 43442f177ab7b..6051e1fc45111 100644 --- a/clang/include/clang/Basic/AttrDocs.td +++ b/clang/include/clang/Basic/AttrDocs.td @@ -8252,21 +8252,6 @@ and https://microsoft.github.io/hlsl-specs/proposals/0013-wave-size-range.html }]; } -def VkConstantIdDocs : Documentation { - let Category = DocCatFunction; - let Content = [{ -The ``vk::constant_id`` attribute specifies the id for a SPIR-V specialization -constant. The attribute applies to const global scalar variables. The variable must be initialized with a C++11 constexpr. -In SPIR-V, the -variable will be replaced with an `OpSpecConstant` with the given id. -The syntax is: - -.. code-block:: text - - ``[[vk::constant_id(<Id>)]] const T Name = <Init>`` -}]; -} - def RootSignatureDocs : Documentation { let Category = DocCatFunction; let Content = [{ diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td index d65b3a5d2f447..68cd3d790e78a 100644 --- a/clang/include/clang/Basic/Builtins.td +++ b/clang/include/clang/Basic/Builtins.td @@ -5065,19 +5065,6 @@ def HLSLGroupMemoryBarrierWithGroupSync: LangBuiltin<"HLSL_LANG"> { let Prototype = "void()"; } -class HLSLScalarTemplate - : Template<["bool", "char", "short", "int", "long long int", - "unsigned short", "unsigned int", "unsigned long long int", - "__fp16", "float", "double"], - ["_bool", "_char", "_short", "_int", "_longlong", "_ushort", - "_uint", "_ulonglong", "_half", "_float", "_double"]>; - -def HLSLGetSpirvSpecConstant : LangBuiltin<"HLSL_LANG">, HLSLScalarTemplate { - let Spellings = ["__builtin_get_spirv_spec_constant"]; - let Attributes = [NoThrow, Const, Pure]; - let Prototype = "T(unsigned int, T)"; -} - // Builtins for XRay. def XRayCustomEvent : Builtin { let Spellings = ["__xray_customevent"]; diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 34b798a09c216..979ff60b73b75 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -12927,10 +12927,6 @@ def err_spirv_enum_not_int : Error< def err_spirv_enum_not_valid : Error< "invalid value for %select{storage class}0 argument">; -def err_specialization_const - : Error<"variable with 'vk::constant_id' attribute must be a const " - "int/float/enum/bool and be initialized with a literal">; - // errors of expect.with.probability def err_probability_not_constant_float : Error< "probability argument to __builtin_expect_with_probability must be constant " diff --git a/clang/include/clang/Sema/SemaHLSL.h b/clang/include/clang/Sema/SemaHLSL.h index 97091792ba236..33c4b8d1568bf 100644 --- a/clang/include/clang/Sema/SemaHLSL.h +++ b/clang/include/clang/Sema/SemaHLSL.h @@ -98,8 +98,6 @@ class SemaHLSL : public SemaBase { HLSLWaveSizeAttr *mergeWaveSizeAttr(Decl *D, const AttributeCommonInfo &AL, int Min, int Max, int Preferred, int SpelledArgsCount); - HLSLVkConstantIdAttr * - mergeVkConstantIdAttr(Decl *D, const AttributeCommonInfo &AL, int Id); HLSLShaderAttr *mergeShaderAttr(Decl *D, const AttributeCommonInfo &AL, llvm::Triple::EnvironmentType ShaderType); HLSLParamModifierAttr * @@ -137,7 +135,6 @@ class SemaHLSL : public SemaBase { void handleRootSignatureAttr(Decl *D, const ParsedAttr &AL); void handleNumThreadsAttr(Decl *D, const ParsedAttr &AL); void handleWaveSizeAttr(Decl *D, const ParsedAttr &AL); - void handleVkConstantIdAttr(Decl *D, const ParsedAttr &AL); void handleSV_DispatchThreadIDAttr(Decl *D, const ParsedAttr &AL); void handleSV_GroupThreadIDAttr(Decl *D, const ParsedAttr &AL); void handleSV_GroupIDAttr(Decl *D, const ParsedAttr &AL); @@ -174,7 +171,7 @@ class SemaHLSL : public SemaBase { QualType getInoutParameterType(QualType Ty); bool transformInitList(const InitializedEntity &Entity, InitListExpr *Init); - bool handleInitialization(VarDecl *VDecl, Expr *&Init); + void deduceAddressSpace(VarDecl *Decl); private: diff --git a/clang/lib/CodeGen/CGHLSLBuiltins.cpp b/clang/lib/CodeGen/CGHLSLBuiltins.cpp index cbc5ef9cb0d5f..ccf45c0c6ff1d 100644 --- a/clang/lib/CodeGen/CGHLSLBuiltins.cpp +++ b/clang/lib/CodeGen/CGHLSLBuiltins.cpp @@ -12,7 +12,6 @@ #include "CGBuiltin.h" #include "CGHLSLRuntime.h" -#include "CodeGenFunction.h" using namespace clang; using namespace CodeGen; @@ -215,43 +214,6 @@ static Intrinsic::ID getWaveActiveMaxIntrinsic(llvm::Triple::ArchType Arch, } } -// Returns the mangled name for a builtin function that the SPIR-V backend -// will expand into a spec Constant. -static std::string getSpecConstantFunctionName(clang::QualType SpecConstantType, - ASTContext &Context) { - // The parameter types for our conceptual intrinsic function. - QualType ClangParamTypes[] = {Context.IntTy, SpecConstantType}; - - // Create a temporary FunctionDecl for the builtin fuction. It won't be - // added to the AST. - FunctionProtoType::ExtProtoInfo EPI; - QualType FnType = - Context.getFunctionType(SpecConstantType, ClangParamTypes, EPI); - DeclarationName FuncName = &Context.Idents.get("__spirv_SpecConstant"); - FunctionDecl *FnDeclForMangling = FunctionDecl::Create( - Context, Context.getTranslationUnitDecl(), SourceLocation(), - SourceLocation(), FuncName, FnType, /*TSI=*/nullptr, SC_Extern); - - // Attach the created parameter declarations to the function declaration. - SmallVector<ParmVarDecl *, 2> ParamDecls; - for (QualType ParamType : ClangParamTypes) { - ParmVarDecl *PD = ParmVarDecl::Create( - Context, FnDeclForMangling, SourceLocation(), SourceLocation(), - /*IdentifierInfo*/ nullptr, ParamType, /*TSI*/ nullptr, SC_None, - /*DefaultArg*/ nullptr); - ParamDecls.push_back(PD); - } - FnDeclForMangling->setParams(ParamDecls); - - // Get the mangled name. - std::string Name; - llvm::raw_string_ostream MangledNameStream(Name); - MangleContext *Mangler = Context.createMangleContext(); - Mangler->mangleName(FnDeclForMangling, MangledNameStream); - MangledNameStream.flush(); - return Name; -} - Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID, const CallExpr *E, ReturnValueSlot ReturnValue) { @@ -811,42 +773,6 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID, return EmitRuntimeCall( Intrinsic::getOrInsertDeclaration(&CGM.getModule(), ID)); } - case Builtin::BI__builtin_get_spirv_spec_constant_bool: - case Builtin::BI__builtin_get_spirv_spec_constant_short: - case Builtin::BI__builtin_get_spirv_spec_constant_ushort: - case Builtin::BI__builtin_get_spirv_spec_constant_int: - case Builtin::BI__builtin_get_spirv_spec_constant_uint: - case Builtin::BI__builtin_get_spirv_spec_constant_longlong: - case Builtin::BI__builtin_get_spirv_spec_constant_ulonglong: - case Builtin::BI__builtin_get_spirv_spec_constant_half: - case Builtin::BI__builtin_get_spirv_spec_constant_float: - case Builtin::BI__builtin_get_spirv_spec_constant_double: { - llvm::Function *SpecConstantFn = getSpecConstantFunction(E->getType()); - llvm::Value *SpecId = EmitScalarExpr(E->getArg(0)); - llvm::Value *DefaultVal = EmitScalarExpr(E->getArg(1)); - llvm::Value *Args[] = {SpecId, DefaultVal}; - return Builder.CreateCall(SpecConstantFn, Args); - } } return nullptr; } - -llvm::Function *clang::CodeGen::CodeGenFunction::getSpecConstantFunction( - const clang::QualType &SpecConstantType) { - - // Find or create the declaration for the function. - llvm::Module *M = &CGM.getModule(); - std::string MangledName = - getSpecConstantFunctionName(SpecConstantType, getContext()); - llvm::Function *SpecConstantFn = M->getFunction(MangledName); - - if (!SpecConstantFn) { - llvm::Type *IntType = ConvertType(getContext().IntTy); - llvm::Type *RetTy = ConvertType(SpecConstantType); - llvm::Type *ArgTypes[] = {IntType, RetTy}; - llvm::FunctionType *FnTy = llvm::FunctionType::get(RetTy, ArgTypes, false); - SpecConstantFn = llvm::Function::Create( - FnTy, llvm::GlobalValue::ExternalLinkage, MangledName, M); - } - return SpecConstantFn; -} diff --git a/clang/lib/CodeGen/CodeGenFunction.h b/clang/lib/CodeGen/CodeGenFunction.h index 59f14b3e35fd0..a5ab9df01dba9 100644 --- a/clang/lib/CodeGen/CodeGenFunction.h +++ b/clang/lib/CodeGen/CodeGenFunction.h @@ -4850,12 +4850,6 @@ class CodeGenFunction : public CodeGenTypeCache { llvm::Value *EmitAMDGPUBuiltinExpr(unsigned BuiltinID, const CallExpr *E); llvm::Value *EmitHLSLBuiltinExpr(unsigned BuiltinID, const CallExpr *E, ReturnValueSlot ReturnValue); - - // Returns a builtin function that the SPIR-V backend will expand into a spec - // constant. - llvm::Function * - getSpecConstantFunction(const clang::QualType &SpecConstantType); - llvm::Value *EmitDirectXBuiltinExpr(unsigned BuiltinID, const CallExpr *E); llvm::Value *EmitSPIRVBuiltinExpr(unsigned BuiltinID, const CallExpr *E); llvm::Value *EmitScalarOrConstFoldImmArg(unsigned ICEArguments, unsigned Idx, diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index e1cccf068b5aa..1bf72e5bb7b9d 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -2890,8 +2890,6 @@ static bool mergeDeclAttribute(Sema &S, NamedDecl *D, NewAttr = S.HLSL().mergeWaveSizeAttr(D, *WS, WS->getMin(), WS->getMax(), WS->getPreferred(), WS->getSpelledArgsCount()); - else if (const auto *CI = dyn_cast<HLSLVkConstantIdAttr>(Attr)) - NewAttr = S.HLSL().mergeVkConstantIdAttr(D, *CI, CI->getId()); else if (const auto *SA = dyn_cast<HLSLShaderAttr>(Attr)) NewAttr = S.HLSL().mergeShaderAttr(D, *SA, SA->getType()); else if (isa<SuppressAttr>(Attr)) @@ -13759,10 +13757,6 @@ void Sema::AddInitializerToDecl(Decl *RealDecl, Expr *Init, bool DirectInit) { return; } - if (getLangOpts().HLSL) - if (!HLSL().handleInitialization(VDecl, Init)) - return; - // Get the decls type and save a reference for later, since // CheckInitializerTypes may change it. QualType DclT = VDecl->getType(), SavT = DclT; @@ -14185,13 +14179,6 @@ void Sema::ActOnUninitializedDecl(Decl *RealDecl) { } } - // HLSL variable with the `vk::constant_id` attribute must be initialized. - if (!Var->isInvalidDecl() && Var->hasAttr<HLSLVkConstantIdAttr>()) { - Diag(Var->getLocation(), diag::err_specialization_const); - Var->setInvalidDecl(); - return; - } - if (!Var->isInvalidDecl() && RealDecl->hasAttr<LoaderUninitializedAttr>()) { if (Var->getStorageClass() == SC_Extern) { Diag(Var->getLocation(), diag::err_loader_uninitialized_extern_decl) diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp index eba29e609cb05..1c2fa80e782d4 100644 --- a/clang/lib/Sema/SemaDeclAttr.cpp +++ b/clang/lib/Sema/SemaDeclAttr.cpp @@ -7590,9 +7590,6 @@ ProcessDeclAttribute(Sema &S, Scope *scope, Decl *D, const ParsedAttr &AL, case ParsedAttr::AT_HLSLVkExtBuiltinInput: S.HLSL().handleVkExtBuiltinInputAttr(D, AL); break; - case ParsedAttr::AT_HLSLVkConstantId: - S.HLSL().handleVkConstantIdAttr(D, AL); - break; case ParsedAttr::AT_HLSLSV_GroupThreadID: S.HLSL().handleSV_GroupThreadIDAttr(D, AL); break; diff --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp index 9b43ee00810b2..b55f4fd786b58 100644 --- a/clang/lib/Sema/SemaHLSL.cpp +++ b/clang/lib/Sema/SemaHLSL.cpp @@ -119,40 +119,6 @@ static ResourceClass getResourceClass(RegisterType RT) { llvm_unreachable("unexpected RegisterType value"); } -static Builtin::ID getSpecConstBuiltinId(QualType Type) { - const auto *BT = dyn_cast<BuiltinType>(Type); - if (!BT) { - if (!Type->isEnumeralType()) - return Builtin::NotBuiltin; - return Builtin::BI__builtin_get_spirv_spec_constant_int; - } - - switch (BT->getKind()) { - case BuiltinType::Bool: - return Builtin::BI__builtin_get_spirv_spec_constant_bool; - case BuiltinType::Short: - return Builtin::BI__builtin_get_spirv_spec_constant_short; - case BuiltinType::Int: - return Builtin::BI__builtin_get_spirv_spec_constant_int; - case BuiltinType::LongLong: - return Builtin::BI__builtin_get_spirv_spec_constant_longlong; - case BuiltinType::UShort: - return Builtin::BI__builtin_get_spirv_spec_constant_ushort; - case BuiltinType::UInt: - return Builtin::BI__builtin_get_spirv_spec_constant_uint; - case BuiltinType::ULongLong: - return Builtin::BI__builtin_get_spirv_spec_constant_ulonglong; - case BuiltinType::Half: - return Builtin::BI__builtin_get_spirv_spec_constant_half; - case BuiltinType::Float: - return Builtin::BI__builtin_get_spirv_spec_constant_float; - case BuiltinType::Double: - return Builtin::BI__builtin_get_spirv_spec_constant_double; - default: - return Builtin::NotBuiltin; - } -} - DeclBindingInfo *ResourceBindings::addDeclBindingInfo(const VarDecl *VD, ResourceClass ResClass) { assert(getDeclBindingInfo(VD, ResClass) == nullptr && @@ -641,41 +607,6 @@ HLSLWaveSizeAttr *SemaHLSL::mergeWaveSizeAttr(Decl *D, return Result; } -HLSLVkConstantIdAttr * -SemaHLSL::mergeVkConstantIdAttr(Decl *D, const AttributeCommonInfo &AL, - int Id) { - - auto &TargetInfo = getASTContext().getTargetInfo(); - if (TargetInfo.getTriple().getArch() != llvm::Triple::spirv) { - Diag(AL.getLoc(), diag::warn_attribute_ignored) << AL; - return nullptr; - } - - auto *VD = cast<VarDecl>(D); - - if (getSpecConstBuiltinId(VD->getType()) == Builtin::NotBuiltin) { - Diag(VD->getLocation(), diag::err_specialization_const); - return nullptr; - } - - if (!VD->getType().isConstQualified()) { - Diag(VD->getLocation(), diag::err_specialization_const); - return nullptr; - } - - if (HLSLVkConstantIdAttr *CI = D->getAttr<HLSLVkConstantIdAttr>()) { - if (CI->getId() != Id) { - Diag(CI->getLocation(), diag::err_hlsl_attribute_param_mismatch) << AL; - Diag(AL.getLoc(), diag::note_conflicting_attribute); - } - return nullptr; - } - - HLSLVkConstantIdAttr *Result = - ::new (getASTContext()) HLSLVkConstantIdAttr(getASTContext(), AL, Id); - return Result; -} - HLSLShaderAttr * SemaHLSL::mergeShaderAttr(Decl *D, const AttributeCommonInfo &AL, llvm::Triple::EnvironmentType ShaderType) { @@ -1226,15 +1157,6 @@ void SemaHLSL::handleVkExtBuiltinInputAttr(Decl *D, const ParsedAttr &AL) { HLSLVkExtBuiltinInputAttr(getASTContext(), AL, ID)); } -void SemaHLSL::handleVkConstantIdAttr(Decl *D, const ParsedAttr &AL) { - uint32_t Id; - if (!SemaRef.checkUInt32Argument(AL, AL.getArgAsExpr(0), Id)) - return; - HLSLVkConstantIdAttr *NewAttr = mergeVkConstantIdAttr(D, AL, Id); - if (NewAttr) - D->addAttr(NewAttr); -} - bool SemaHLSL::diagnoseInputIDType(QualType T, const ParsedAttr &AL) { const auto *VT = T->getAs<VectorType>(); @@ -3284,7 +3206,6 @@ static bool IsDefaultBufferConstantDecl(VarDecl *VD) { return VD->getDeclContext()->isTranslationUnit() && QT.getAddressSpace() == LangAS::Default && VD->getStorageClass() != SC_Static && - !VD->hasAttr<HLSLVkConstantIdAttr>() && !isInvalidConstantBufferLeafElementType(QT.getTypePtr()); } @@ -3352,8 +3273,7 @@ void SemaHLSL::ActOnVariableDeclarator(VarDecl *VD) { const Type *VarType = VD->getType().getTypePtr(); while (VarType->isArrayType()) VarType = VarType->getArrayElementTypeNoTypeQual(); - if (VarType->isHLSLResourceRecord() || - VD->hasAttr<HLSLVkConstantIdAttr>()) { + if (VarType->isHLSLResourceRecord()) { // Make the variable for resources static. The global externally visible // storage is accessed through the handle, which is a member. The variable // itself is not externally visible. @@ -3776,41 +3696,3 @@ bool SemaHLSL::transformInitList(const InitializedEntity &Entity, Init->updateInit(Ctx, I, NewInit->getInit(I)); return true; } - -bool SemaHLSL::handleInitialization(VarDecl *VDecl, Expr *&Init) { - const HLSLVkConstantIdAttr *ConstIdAttr = - VDecl->getAttr<HLSLVkConstantIdAttr>(); - if (!ConstIdAttr) - return true; - - ASTContext &Context = SemaRef.getASTContext(); - - APValue InitValue; - if (!Init->isCXX11ConstantExpr(Context, &InitValue)) { - Diag(VDecl->getLocation(), diag::err_specialization_const); - VDecl->setInvalidDecl(); - return false; - } - - Builtin::ID BID = getSpecConstBuiltinId(VDecl->getType()); - - // Argument 1: The ID from the attribute - int ConstantID = ConstIdAttr->getId(); - llvm::APInt IDVal(Context.getIntWidth(Context.IntTy), ConstantID); - Expr *IdExpr = IntegerLiteral::Create(Context, IDVal, Context.IntTy, - ConstIdAttr->getLocation()); - - SmallVector<Expr *, 2> Args = {IdExpr, Init}; - Expr *C = SemaRef.BuildBuiltinCallExpr(Init->getExprLoc(), BID, Args); - if (C->getType()->getCanonicalTypeUnqualified() != - VDecl->getType()->getCanonicalTypeUnqualified()) { - C = SemaRef - .BuildCStyleCastExpr(SourceLocation(), - Context.getTrivialTypeSourceInfo( - Init->getType(), Init->getExprLoc()), - SourceLocation(), C) - .get(); - } - Init = C; - return true; -} diff --git a/clang/test/AST/HLSL/vk.spec-constant.usage.hlsl b/clang/test/AST/HLSL/vk.spec-constant.usage.hlsl deleted file mode 100644 index c0955c1ea7b43..0000000000000 --- a/clang/test/AST/HLSL/vk.spec-constant.usage.hlsl +++ /dev/null @@ -1,130 +0,0 @@ -// RUN: %clang_cc1 -finclude-default-header -triple spirv-unknown-vulkan-compute -x hlsl -ast-dump -o - %s | FileCheck %s - -// CHECK: VarDecl {{.*}} bool_const 'const hlsl_private bool' static cinit -// CHECK-NEXT: CallExpr {{.*}} 'bool' -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'bool (*)(unsigned int, bool) noexcept' <FunctionToPointerDecay> -// CHECK-NEXT: DeclRefExpr {{.*}} 'bool (unsigned int, bool) noexcept' lvalue Function {{.*}} '__builtin_get_spirv_spec_constant_bool' 'bool (unsigned int, bool) noexcept' -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'unsigned int' <IntegralCast> -// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 1 -// CHECK-NEXT: CXXBoolLiteralExpr {{.*}} 'bool' true -[[vk::constant_id(1)]] -const bool bool_const = true; - -// CHECK: VarDecl {{.*}} short_const 'const hlsl_private short' static cinit -// CHECK-NEXT: CallExpr {{.*}} 'short' -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'short (*)(unsigned int, short) noexcept' <FunctionToPointerDecay> -// CHECK-NEXT: DeclRefExpr {{.*}} 'short (unsigned int, short) noexcept' lvalue Function {{.*}} '__builtin_get_spirv_spec_constant_short' 'short (unsigned int, short) noexcept' -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'unsigned int' <IntegralCast> -// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 2 -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'short' <IntegralCast> -// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 4 -[[vk::constant_id(2)]] -const short short_const = 4; - -// CHECK: VarDecl {{.*}} int_const 'const hlsl_private int' static cinit -// CHECK-NEXT: CallExpr {{.*}} 'int' -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'int (*)(unsigned int, int) noexcept' <FunctionToPointerDecay> -// CHECK-NEXT: DeclRefExpr {{.*}} 'int (unsigned int, int) noexcept' lvalue Function {{.*}} '__builtin_get_spirv_spec_constant_int' 'int (unsigned int, int) noexcept' -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'unsigned int' <IntegralCast> -// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 3 -// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5 -[[vk::constant_id(3)]] -const int int_const = 5; - -// CHECK: VarDecl {{.*}} long_const 'const hlsl_private long long' static cinit -// CHECK-NEXT: CallExpr {{.*}} 'long long' -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'long long (*)(unsigned int, long long) noexcept' <FunctionToPointerDecay> -// CHECK-NEXT: DeclRefExpr {{.*}} 'long long (unsigned int, long long) noexcept' lvalue Function {{.*}} '__builtin_get_spirv_spec_constant_longlong' 'long long (unsigned int, long long) noexcept' -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'unsigned int' <IntegralCast> -// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 4 -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'long long' <IntegralCast> -// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 8 -[[vk::constant_id(4)]] -const long long long_const = 8; - -// CHECK: VarDecl {{.*}} ushort_const 'const hlsl_private unsigned short' static cinit -// CHECK-NEXT: CallExpr {{.*}} 'unsigned short' -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'unsigned short (*)(unsigned int, unsigned short) noexcept' <FunctionToPointerDecay> -// CHECK-NEXT: DeclRefExpr {{.*}} 'unsigned short (unsigned int, unsigned short) noexcept' lvalue Function {{.*}} '__builtin_get_spirv_spec_constant_ushort' 'unsigned short (unsigned int, unsigned short) noexcept' -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'unsigned int' <IntegralCast> -// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5 -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'unsigned short' <IntegralCast> -// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 10 -[[vk::constant_id(5)]] -const unsigned short ushort_const = 10; - -// CHECK: VarDecl {{.*}} uint_const 'const hlsl_private unsigned int' static cinit -// CHECK-NEXT: CallExpr {{.*}} 'unsigned int' -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'unsigned int (*)(unsigned int, unsigned int) noexcept' <FunctionToPointerDecay> -// CHECK-NEXT: DeclRefExpr {{.*}} 'unsigned int (unsigned int, unsigned int) noexcept' lvalue Function {{.*}} '__builtin_get_spirv_spec_constant_uint' 'unsigned int (unsigned int, unsigned int) noexcept' -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'unsigned int' <IntegralCast> -// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 6 -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'unsigned int' <IntegralCast> -// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 12 -[[vk::constant_id(6)]] -const unsigned int uint_const = 12; - - -// CHECK: VarDecl {{.*}} ulong_const 'const hlsl_private unsigned long long' static cinit -// CHECK-NEXT: CallExpr {{.*}} 'unsigned long long' -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'unsigned long long (*)(unsigned int, unsigned long long) noexcept' <FunctionToPointerDecay> -// CHECK-NEXT: DeclRefExpr {{.*}} 'unsigned long long (unsigned int, unsigned long long) noexcept' lvalue Function {{.*}} '__builtin_get_spirv_spec_constant_ulonglong' 'unsigned long long (unsigned int, unsigned long long) noexcept' -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'unsigned int' <IntegralCast> -// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 7 -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'unsigned long long' <IntegralCast> -// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 25 -[[vk::constant_id(7)]] -const unsigned long long ulong_const = 25; - -// CHECK: VarDecl {{.*}} half_const 'const hlsl_private half' static cinit -// CHECK-NEXT: CallExpr {{.*}} 'half' -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'half (*)(unsigned int, half) noexcept' <FunctionToPointerDecay> -// CHECK-NEXT: DeclRefExpr {{.*}} 'half (unsigned int, half) noexcept' lvalue Function {{.*}} '__builtin_get_spirv_spec_constant_half' 'half (unsigned int, half) noexcept' -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'unsigned int' <IntegralCast> -// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 8 -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'half' <FloatingCast> -// CHECK-NEXT: FloatingLiteral {{.*}} 'float' 4.040000e+01 -[[vk::constant_id(8)]] -const half half_const = 40.4; - -// CHECK: VarDecl {{.*}} float_const 'const hlsl_private float' static cinit -// CHECK-NEXT: CallExpr {{.*}} 'float' -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'float (*)(unsigned int, float) noexcept' <FunctionToPointerDecay> -// CHECK-NEXT: DeclRefExpr {{.*}} 'float (unsigned int, float) noexcept' lvalue Function {{.*}} '__builtin_get_spirv_spec_constant_float' 'float (unsigned int, float) noexcept' -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'unsigned int' <IntegralCast> -// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 8 -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'float' <IntegralToFloating> -// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 50 -[[vk::constant_id(8)]] -const float float_const = 50; - -// CHECK: VarDecl {{.*}} double_const 'const hlsl_private double' static cinit -// CHECK-NEXT: CallExpr {{.*}} 'double' -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'double (*)(unsigned int, double) noexcept' <FunctionToPointerDecay> -// CHECK-NEXT: DeclRefExpr {{.*}} 'double (unsigned int, double) noexcept' lvalue Function {{.*}} '__builtin_get_spirv_spec_constant_double' 'double (unsigned int, double) noexcept' -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'unsigned int' <IntegralCast> -// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 9 -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'double' <IntegralToFloating> -// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 100 -[[vk::constant_id(9)]] -const double double_const = 100; - -// CHECK: VarDecl {{.*}} enum_const 'const hlsl_private E' static cinit -// CHECK-NEXT: CStyleCastExpr {{.*}} 'E' <IntegralCast> -// CHECK-NEXT: CallExpr {{.*}} 'int' -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'int (*)(unsigned int, int) noexcept' <FunctionToPointerDecay> -// CHECK-NEXT: DeclRefExpr {{.*}} 'int (unsigned int, int) noexcept' lvalue Function {{.*}} '__builtin_get_spirv_spec_constant_int' 'int (unsigned int, int) noexcept' -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'unsigned int' <IntegralCast> -// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 10 -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'int' <IntegralCast> -// CHECK-NEXT: DeclRefExpr {{.*}} 'E' EnumConstant {{.*}} 'e2' 'E' -enum E { - e0 = 10, - e1 = 20, - e2 = 30 -}; - -[[vk::constant_id(10)]] -const E enum_const = e2; - -// CHECK-NOT: CXXRecordDecl {{.*}} implicit struct __cblayout_$Globals definition diff --git a/clang/test/CodeGenHLSL/vk-features/SpirvType.alignment.hlsl b/clang/test/CodeGenHLSL/inline-spirv/SpirvType.alignment.hlsl similarity index 100% rename from clang/test/CodeGenHLSL/vk-features/SpirvType.alignment.hlsl rename to clang/test/CodeGenHLSL/inline-spirv/SpirvType.alignment.hlsl diff --git a/clang/test/CodeGenHLSL/vk-features/SpirvType.hlsl b/clang/test/CodeGenHLSL/inline-spirv/SpirvType.hlsl similarity index 100% rename from clang/test/CodeGenHLSL/vk-features/SpirvType.hlsl rename to clang/test/CodeGenHLSL/inline-spirv/SpirvType.hlsl diff --git a/clang/test/CodeGenHLSL/vk-features/vk.spec-constant.hlsl b/clang/test/CodeGenHLSL/vk-features/vk.spec-constant.hlsl deleted file mode 100644 index cbc1fa61eae2b..0000000000000 --- a/clang/test/CodeGenHLSL/vk-features/vk.spec-constant.hlsl +++ /dev/null @@ -1,210 +0,0 @@ -// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --check-globals all --include-generated-funcs --version 5 -// RUN: %clang_cc1 -finclude-default-header -x hlsl -triple \ -// RUN: spirv-unknown-vulkan-compute %s -emit-llvm -disable-llvm-passes \ -// RUN: -o - | FileCheck %s - -[[vk::constant_id(1)]] -const bool bool_const = true; - -[[vk::constant_id(1)]] -const short short_const = 4; - -[[vk::constant_id(3)]] -const int int_const = 5; - -[[vk::constant_id(4)]] -const long long long_const = 8; - -[[vk::constant_id(5)]] -const unsigned short ushort_const = 10; - -[[vk::constant_id(6)]] -const unsigned int uint_const = 12; - -[[vk::constant_id(7)]] -const unsigned long long ulong_const = 25; - -[[vk::constant_id(8)]] -const half half_const = 40.4; - -[[vk::constant_id(8)]] -const float float_const = 50.5; - -[[vk::constant_id(9)]] -const double double_const = 100.2; - -enum E { - e0 = 10, - e1 = 20, - e2 = 30 -}; - -[[vk::constant_id(10)]] -const E enum_const = e2; - -[numthreads(1,1,1)] -void main() { - bool b = bool_const; - short s = short_const; - int i = int_const; - long long l = long_const; - unsigned short us = ushort_const; - unsigned int ui = uint_const; - unsigned long long ul = ulong_const; - half h = half_const; - float f = float_const; - double d = double_const; - E e = enum_const; -} -//. -// CHECK: @_ZL10bool_const = internal addrspace(10) global i32 0, align 4 -// CHECK: @_ZL11short_const = internal addrspace(10) global i16 0, align 2 -// CHECK: @_ZL9int_const = internal addrspace(10) global i32 0, align 4 -// CHECK: @_ZL10long_const = internal addrspace(10) global i64 0, align 8 -// CHECK: @_ZL12ushort_const = internal addrspace(10) global i16 0, align 2 -// CHECK: @_ZL10uint_const = internal addrspace(10) global i32 0, align 4 -// CHECK: @_ZL11ulong_const = internal addrspace(10) global i64 0, align 8 -// CHECK: @_ZL10half_const = internal addrspace(10) global float 0.000000e+00, align 4 -// CHECK: @_ZL11float_const = internal addrspace(10) global float 0.000000e+00, align 4 -// CHECK: @_ZL12double_const = internal addrspace(10) global double 0.000000e+00, align 8 -// CHECK: @_ZL10enum_const = internal addrspace(10) global i32 0, align 4 -//. -// CHECK-LABEL: define internal spir_func void @_Z4mainv( -// CHECK-SAME: ) #[[ATTR0:[0-9]+]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: [[TMP0:%.*]] = call token @llvm.experimental.convergence.entry() -// CHECK-NEXT: [[B:%.*]] = alloca i32, align 4 -// CHECK-NEXT: [[S:%.*]] = alloca i16, align 2 -// CHECK-NEXT: [[I:%.*]] = alloca i32, align 4 -// CHECK-NEXT: [[L:%.*]] = alloca i64, align 8 -// CHECK-NEXT: [[US:%.*]] = alloca i16, align 2 -// CHECK-NEXT: [[UI:%.*]] = alloca i32, align 4 -// CHECK-NEXT: [[UL:%.*]] = alloca i64, align 8 -// CHECK-NEXT: [[H:%.*]] = alloca float, align 4 -// CHECK-NEXT: [[F:%.*]] = alloca float, align 4 -// CHECK-NEXT: [[D:%.*]] = alloca double, align 8 -// CHECK-NEXT: [[E:%.*]] = alloca i32, align 4 -// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(10) @_ZL10bool_const, align 4 -// CHECK-NEXT: [[LOADEDV:%.*]] = trunc i32 [[TMP1]] to i1 -// CHECK-NEXT: [[STOREDV:%.*]] = zext i1 [[LOADEDV]] to i32 -// CHECK-NEXT: store i32 [[STOREDV]], ptr [[B]], align 4 -// CHECK-NEXT: [[TMP2:%.*]] = load i16, ptr addrspace(10) @_ZL11short_const, align 2 -// CHECK-NEXT: store i16 [[TMP2]], ptr [[S]], align 2 -// CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr addrspace(10) @_ZL9int_const, align 4 -// CHECK-NEXT: store i32 [[TMP3]], ptr [[I]], align 4 -// CHECK-NEXT: [[TMP4:%.*]] = load i64, ptr addrspace(10) @_ZL10long_const, align 8 -// CHECK-NEXT: store i64 [[TMP4]], ptr [[L]], align 8 -// CHECK-NEXT: [[TMP5:%.*]] = load i16, ptr addrspace(10) @_ZL12ushort_const, align 2 -// CHECK-NEXT: store i16 [[TMP5]], ptr [[US]], align 2 -// CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr addrspace(10) @_ZL10uint_const, align 4 -// CHECK-NEXT: store i32 [[TMP6]], ptr [[UI]], align 4 -// CHECK-NEXT: [[TMP7:%.*]] = load i64, ptr addrspace(10) @_ZL11ulong_const, align 8 -// CHECK-NEXT: store i64 [[TMP7]], ptr [[UL]], align 8 -// CHECK-NEXT: [[TMP8:%.*]] = load float, ptr addrspace(10) @_ZL10half_const, align 4 -// CHECK-NEXT: store float [[TMP8]], ptr [[H]], align 4 -// CHECK-NEXT: [[TMP9:%.*]] = load float, ptr addrspace(10) @_ZL11float_const, align 4 -// CHECK-NEXT: store float [[TMP9]], ptr [[F]], align 4 -// CHECK-NEXT: [[TMP10:%.*]] = load double, ptr addrspace(10) @_ZL12double_const, align 8 -// CHECK-NEXT: store double [[TMP10]], ptr [[D]], align 8 -// CHECK-NEXT: [[TMP11:%.*]] = load i32, ptr addrspace(10) @_ZL10enum_const, align 4 -// CHECK-NEXT: store i32 [[TMP11]], ptr [[E]], align 4 -// CHECK-NEXT: ret void -// -// CHECK-LABEL: define internal spir_func void @__cxx_global_var_init( -// CHECK-SAME: ) #[[ATTR3:[0-9]+]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: [[TMP0:%.*]] = call token @llvm.experimental.convergence.entry() -// CHECK-NEXT: [[TMP1:%.*]] = call i1 @_Z20__spirv_SpecConstantib(i32 1, i1 true) -// CHECK-NEXT: [[STOREDV:%.*]] = zext i1 [[TMP1]] to i32 -// CHECK-NEXT: store i32 [[STOREDV]], ptr addrspace(10) @_ZL10bool_const, align 4 -// CHECK-NEXT: ret void -// -// -// CHECK-LABEL: define internal spir_func void @__cxx_global_var_init.1( -// CHECK-SAME: ) #[[ATTR3]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: [[TMP0:%.*]] = call token @llvm.experimental.convergence.entry() -// CHECK-NEXT: [[TMP1:%.*]] = call i16 @_Z20__spirv_SpecConstantis(i32 1, i16 4) -// CHECK-NEXT: store i16 [[TMP1]], ptr addrspace(10) @_ZL11short_const, align 2 -// CHECK-NEXT: ret void -// -// -// CHECK-LABEL: define internal spir_func void @__cxx_global_var_init.2( -// CHECK-SAME: ) #[[ATTR3]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: [[TMP0:%.*]] = call token @llvm.experimental.convergence.entry() -// CHECK-NEXT: [[TMP1:%.*]] = call i32 @_Z20__spirv_SpecConstantii(i32 3, i32 5) -// CHECK-NEXT: store i32 [[TMP1]], ptr addrspace(10) @_ZL9int_const, align 4 -// CHECK-NEXT: ret void -// -// -// CHECK-LABEL: define internal spir_func void @__cxx_global_var_init.3( -// CHECK-SAME: ) #[[ATTR3]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: [[TMP0:%.*]] = call token @llvm.experimental.convergence.entry() -// CHECK-NEXT: [[TMP1:%.*]] = call i64 @_Z20__spirv_SpecConstantix(i32 4, i64 8) -// CHECK-NEXT: store i64 [[TMP1]], ptr addrspace(10) @_ZL10long_const, align 8 -// CHECK-NEXT: ret void -// -// -// CHECK-LABEL: define internal spir_func void @__cxx_global_var_init.4( -// CHECK-SAME: ) #[[ATTR3]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: [[TMP0:%.*]] = call token @llvm.experimental.convergence.entry() -// CHECK-NEXT: [[TMP1:%.*]] = call i16 @_Z20__spirv_SpecConstantit(i32 5, i16 10) -// CHECK-NEXT: store i16 [[TMP1]], ptr addrspace(10) @_ZL12ushort_const, align 2 -// CHECK-NEXT: ret void -// -// -// CHECK-LABEL: define internal spir_func void @__cxx_global_var_init.5( -// CHECK-SAME: ) #[[ATTR3]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: [[TMP0:%.*]] = call token @llvm.experimental.convergence.entry() -// CHECK-NEXT: [[TMP1:%.*]] = call i32 @_Z20__spirv_SpecConstantij(i32 6, i32 12) -// CHECK-NEXT: store i32 [[TMP1]], ptr addrspace(10) @_ZL10uint_const, align 4 -// CHECK-NEXT: ret void -// -// -// CHECK-LABEL: define internal spir_func void @__cxx_global_var_init.6( -// CHECK-SAME: ) #[[ATTR3]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: [[TMP0:%.*]] = call token @llvm.experimental.convergence.entry() -// CHECK-NEXT: [[TMP1:%.*]] = call i64 @_Z20__spirv_SpecConstantiy(i32 7, i64 25) -// CHECK-NEXT: store i64 [[TMP1]], ptr addrspace(10) @_ZL11ulong_const, align 8 -// CHECK-NEXT: ret void -// -// -// CHECK-LABEL: define internal spir_func void @__cxx_global_var_init.7( -// CHECK-SAME: ) #[[ATTR3]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: [[TMP0:%.*]] = call token @llvm.experimental.convergence.entry() -// CHECK-NEXT: [[TMP1:%.*]] = call reassoc nnan ninf nsz arcp afn float @_Z20__spirv_SpecConstantiDh(i32 8, float 0x4044333340000000) -// CHECK-NEXT: store float [[TMP1]], ptr addrspace(10) @_ZL10half_const, align 4 -// CHECK-NEXT: ret void -// -// -// CHECK-LABEL: define internal spir_func void @__cxx_global_var_init.8( -// CHECK-SAME: ) #[[ATTR3]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: [[TMP0:%.*]] = call token @llvm.experimental.convergence.entry() -// CHECK-NEXT: [[TMP1:%.*]] = call reassoc nnan ninf nsz arcp afn float @_Z20__spirv_SpecConstantif(i32 8, float 5.050000e+01) -// CHECK-NEXT: store float [[TMP1]], ptr addrspace(10) @_ZL11float_const, align 4 -// CHECK-NEXT: ret void -// -// -// CHECK-LABEL: define internal spir_func void @__cxx_global_var_init.9( -// CHECK-SAME: ) #[[ATTR3]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: [[TMP0:%.*]] = call token @llvm.experimental.convergence.entry() -// CHECK-NEXT: [[TMP1:%.*]] = call reassoc nnan ninf nsz arcp afn double @_Z20__spirv_SpecConstantid(i32 9, double 0x40590CCCC0000000) -// CHECK-NEXT: store double [[TMP1]], ptr addrspace(10) @_ZL12double_const, align 8 -// CHECK-NEXT: ret void -// -// -// CHECK-LABEL: define internal spir_func void @__cxx_global_var_init.10( -// CHECK-SAME: ) #[[ATTR3]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: [[TMP0:%.*]] = call token @llvm.experimental.convergence.entry() -// CHECK-NEXT: [[TMP1:%.*]] = call i32 @_Z20__spirv_SpecConstantii(i32 10, i32 30) -// CHECK-NEXT: store i32 [[TMP1]], ptr addrspace(10) @_ZL10enum_const, align 4 -// CHECK-NEXT: ret void diff --git a/clang/test/SemaHLSL/vk.spec-constant.error.hlsl b/clang/test/SemaHLSL/vk.spec-constant.error.hlsl deleted file mode 100644 index 24873d272a540..0000000000000 --- a/clang/test/SemaHLSL/vk.spec-constant.error.hlsl +++ /dev/null @@ -1,37 +0,0 @@ -// RUN: %clang_cc1 -finclude-default-header -triple spirv-pc-vulkan1.3-compute -verify %s -// RUN: %clang_cc1 -finclude-default-header -triple dxil-pc-shadermodel6.8-compute -verify %s - -#ifndef __spirv__ -// expected-warning@+2{{'constant_id' attribute ignored}} -#endif -[[vk::constant_id(0)]] -const bool sc0 = true; - -#ifdef __spirv__ -// expected-error@+2{{variable with 'vk::constant_id' attribute must be a const int/float/enum/bool and be initialized with a literal}} -[[vk::constant_id(1)]] -const bool sc1 = sc0; // error - -// expected-warning@+1{{'constant_id' attribute only applies to external global variables}} -[[vk::constant_id(2)]] -static const bool sc2 = false; // error - -// expected-error@+2{{variable with 'vk::constant_id' attribute must be a const int/float/enum/bool and be initialized with a literal}} -[[vk::constant_id(3)]] -const bool sc3; // error - -// expected-error@+2{{variable with 'vk::constant_id' attribute must be a const int/float/enum/bool and be initialized with a literal}} -[[vk::constant_id(4)]] -bool sc4 = false; // error - -// expected-error@+2{{variable with 'vk::constant_id' attribute must be a const int/float/enum/bool and be initialized with a literal}} -[[vk::constant_id(5)]] -const int2 sc5 = {0,0}; // error - -[numthreads(1,1,1)] -void main() { - // expected-warning@+1{{'constant_id' attribute only applies to external global variables}} - [[vk::constant_id(6)]] - const bool sc6 = false; // error -} -#endif _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits