From 5f4980a16e0df12b9d91c2fca12d6c57473ab6c9 Mon Sep 17 00:00:00 2001 From: Yong He Date: Sat, 2 Nov 2024 20:35:44 -0700 Subject: Allow enum cases to be used in attribute arguments. (#5478) --- source/slang/slang-check-decl.cpp | 2 ++ source/slang/slang-check-expr.cpp | 6 ++++++ tests/language-feature/enums/enum-in-binding.slang | 18 ++++++++++++++++++ 3 files changed, 26 insertions(+) create mode 100644 tests/language-feature/enums/enum-in-binding.slang diff --git a/source/slang/slang-check-decl.cpp b/source/slang/slang-check-decl.cpp index ba91bbefa..4293db5ee 100644 --- a/source/slang/slang-check-decl.cpp +++ b/source/slang/slang-check-decl.cpp @@ -6602,6 +6602,7 @@ bool SemanticsVisitor::checkInterfaceConformance( { if (!isAssociatedTypeDecl(requiredMemberDecl.getDecl())) continue; + ensureDecl(requiredMemberDecl, DeclCheckState::ReadyForReference); auto requiredMemberDeclRef = m_astBuilder->getLookupDeclRef( subTypeConformsToSuperInterfaceWitness, requiredMemberDecl.getDecl()); @@ -6623,6 +6624,7 @@ bool SemanticsVisitor::checkInterfaceConformance( continue; if (requiredMemberDecl.as()) continue; + ensureDecl(requiredMemberDecl, DeclCheckState::ReadyForReference); auto requiredMemberDeclRef = m_astBuilder->getLookupDeclRef( subTypeConformsToSuperInterfaceWitness, requiredMemberDecl.getDecl()); diff --git a/source/slang/slang-check-expr.cpp b/source/slang/slang-check-expr.cpp index 8c170698b..47eb6be45 100644 --- a/source/slang/slang-check-expr.cpp +++ b/source/slang/slang-check-expr.cpp @@ -2038,6 +2038,12 @@ IntVal* SemanticsVisitor::tryConstantFoldExpr( } else if (auto enumRef = declRef.as()) { + auto enumTypeDecl = enumRef.getParent().getDecl(); + if (enumTypeDecl && !enumTypeDecl->checkState.isBeingChecked()) + { + ensureDecl(enumRef.getParent(), DeclCheckState::DefinitionChecked); + } + // The cases in an `enum` declaration can also be used as constant expressions, if (auto tagExpr = getTagExpr(m_astBuilder, enumRef)) { diff --git a/tests/language-feature/enums/enum-in-binding.slang b/tests/language-feature/enums/enum-in-binding.slang new file mode 100644 index 000000000..b7dc364dd --- /dev/null +++ b/tests/language-feature/enums/enum-in-binding.slang @@ -0,0 +1,18 @@ +//TEST:SIMPLE(filecheck=CHECK): -target spirv + +// CHECK: OpDecorate %g_buffer Binding 2 + +enum class E { + A, + B, + C +} + +[vk::binding(E.C)] +RWStructuredBuffer g_buffer; + +[numthreads(1,1,1)] +void main() +{ + g_buffer[0] = 1.0f; +} \ No newline at end of file -- cgit v1.2.3