summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2024-11-02 20:35:44 -0700
committerGitHub <noreply@github.com>2024-11-02 20:35:44 -0700
commit5f4980a16e0df12b9d91c2fca12d6c57473ab6c9 (patch)
tree598ebcdd34ee39b11533bf00c0e85faa7aa61a10
parentf4d5aa73fb72a483f04bb6b014e80192331504ea (diff)
Allow enum cases to be used in attribute arguments. (#5478)
-rw-r--r--source/slang/slang-check-decl.cpp2
-rw-r--r--source/slang/slang-check-expr.cpp6
-rw-r--r--tests/language-feature/enums/enum-in-binding.slang18
3 files changed, 26 insertions, 0 deletions
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<DerivativeRequirementDecl>())
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<EnumCaseDecl>())
{
+ 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<float> g_buffer;
+
+[numthreads(1,1,1)]
+void main()
+{
+ g_buffer[0] = 1.0f;
+} \ No newline at end of file