summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorArielG-NV <159081215+ArielG-NV@users.noreply.github.com>2025-08-08 13:19:25 -0700
committerGitHub <noreply@github.com>2025-08-08 20:19:25 +0000
commit07f21ee31b5f427edb72d5578f713b3da3f3b96f (patch)
tree777df480b51f488a296bcf0c231afc3cfff2afdc /tests
parent719772c01a8ee8afa81cded249d6a51e33e17d8d (diff)
Error if super-type capabilities are a super-set of sub-type (#7452)
Fixes: #7410 Changes: 1. super-type capabilities must be a super-set of sub-type capabilities (and support the same shader stages/targets) * InheritanceDecl visits super-type to inherit it's capabilities; validate InheritanceDecl capabilities against sub-type * visit all container decl's with a default case * clean up functionDeclBase visitor * Simplify `diagnoseUndeclaredCapability` by moving logic into capability checking (more correct*) 3. added changed behavior to documentation 4. fixed some incorrect capabilities 5. **we do not** diagnose capability errors on interface requirement-to-implementation if both lack explicit capability requirements. This change is to work around a slangpy regression (test case for the failing situation is in `tests\language-feature\capability\capability-interface-extension-1.slang`), Note: maybe for slang-2026 we don't do this? 6. requirement & implementation must support the same shader stage/target. This was changed because otherwise we can have cases where `X` inherits from `Y`, but `Y` is only expected to be used in `glsl` whilst `X` is expected to be used in `hlsl | glsl` 7. removed `tests/language-feature/capability/capabilitySimplification3.slang` because it tests nothing special (redundant) Note: not using rebase due to separate branches depending on this PR --------- Co-authored-by: slangbot <186143334+slangbot@users.noreply.github.com>
Diffstat (limited to 'tests')
-rw-r--r--tests/diagnostics/discard-in-rt.slang4
-rw-r--r--tests/hlsl-intrinsic/wave-rotate/wave-rotate-clustered.slang4
-rw-r--r--tests/hlsl-intrinsic/wave-rotate/wave-rotate.slang8
-rw-r--r--tests/language-feature/capability/capability-inheritance-1.slang77
-rw-r--r--tests/language-feature/capability/capability-interface-requirement-1.slang56
-rw-r--r--tests/language-feature/capability/capability2.slang27
-rw-r--r--tests/language-feature/capability/capabilitySimplification1.slang30
-rw-r--r--tests/language-feature/capability/capabilitySimplification3.slang17
-rw-r--r--tests/language-feature/capability/explicit-shader-stage-2.slang2
9 files changed, 176 insertions, 49 deletions
diff --git a/tests/diagnostics/discard-in-rt.slang b/tests/diagnostics/discard-in-rt.slang
index 93c3d1038..4af4430a4 100644
--- a/tests/diagnostics/discard-in-rt.slang
+++ b/tests/diagnostics/discard-in-rt.slang
@@ -1,6 +1,6 @@
//TEST:SIMPLE(filecheck=CHECK): -target spirv
-// CHECK: 'closestHit' uses features that are not available in 'closesthit' stage.
+// CHECK: error 36117:{{.*}}'closestHit'{{.*}}'closesthit'
// CHECK: see using of 'discard'
struct PrimaryRayPayload{}
@@ -13,7 +13,7 @@ void closestHit(
discard;
}
-// CHECK: 'closestHit1' uses features that are not available in 'closesthit' stage
+// CHECK: error 36107:{{.*}}'closestHit1'{{.*}}'closesthit'{{.* }}'spirv'
// CHECK: see using of 'discard'
[shader("closesthit")]
void closestHit1(
diff --git a/tests/hlsl-intrinsic/wave-rotate/wave-rotate-clustered.slang b/tests/hlsl-intrinsic/wave-rotate/wave-rotate-clustered.slang
index a8ca2d66f..81601e9be 100644
--- a/tests/hlsl-intrinsic/wave-rotate/wave-rotate-clustered.slang
+++ b/tests/hlsl-intrinsic/wave-rotate/wave-rotate-clustered.slang
@@ -1,8 +1,8 @@
//TEST_CATEGORY(wave, compute)
//TEST:COMPARE_COMPUTE_EX(filecheck-buffer=CHECK):-vk -compute -shaderobj -emit-spirv-directly
-//TEST:COMPARE_COMPUTE_EX(filecheck-buffer=CHECK):-vk -compute -shaderobj -emit-spirv-via-glsl -Xslang... -capability GL_KHR_shader_subgroup_rotate -X.
+//TEST:COMPARE_COMPUTE_EX(filecheck-buffer=CHECK):-vk -compute -shaderobj -emit-spirv-via-glsl -profile sm_6_0 -Xslang... -capability GL_KHR_shader_subgroup_rotate -X.
//TEST:COMPARE_COMPUTE_EX(filecheck-buffer=CHECK):-vk -compute -shaderobj -emit-spirv-directly -xslang -DUSE_GLSL_SYNTAX -allow-glsl
-//TEST:COMPARE_COMPUTE_EX(filecheck-buffer=CHECK):-vk -compute -shaderobj -emit-spirv-via-glsl -allow-glsl -Xslang... -DUSE_GLSL_SYNTAX -capability GL_KHR_shader_subgroup_rotate -X.
+//TEST:COMPARE_COMPUTE_EX(filecheck-buffer=CHECK):-vk -compute -shaderobj -emit-spirv-via-glsl -profile sm_6_0 -allow-glsl -Xslang... -DUSE_GLSL_SYNTAX -capability GL_KHR_shader_subgroup_rotate -X.
#if defined(USE_GLSL_SYNTAX)
#define __clusteredRotate subgroupClusteredRotate
diff --git a/tests/hlsl-intrinsic/wave-rotate/wave-rotate.slang b/tests/hlsl-intrinsic/wave-rotate/wave-rotate.slang
index 5dc319254..353afbb35 100644
--- a/tests/hlsl-intrinsic/wave-rotate/wave-rotate.slang
+++ b/tests/hlsl-intrinsic/wave-rotate/wave-rotate.slang
@@ -1,11 +1,11 @@
-//TEST_CATEGORY(wave, compute)
-//TEST:COMPARE_COMPUTE_EX(filecheck-buffer=CHECK):-vk -compute -shaderobj -emit-spirv-directly
-//TEST:COMPARE_COMPUTE_EX(filecheck-buffer=CHECK):-vk -compute -shaderobj -emit-spirv-via-glsl -Xslang... -capability GL_KHR_shader_subgroup_rotate -X.
+// TEST_CATEGORY(wave, compute)
+// TEST:COMPARE_COMPUTE_EX(filecheck-buffer=CHECK):-vk -compute -shaderobj -emit-spirv-directly
+// TEST:COMPARE_COMPUTE_EX(filecheck-buffer=CHECK):-slang -compute -vk -shaderobj -emit-spirv-via-glsl -profile sm_6_0 -Xslang... -capability GL_KHR_shader_subgroup_rotate -X.
//TEST:COMPARE_COMPUTE_EX(filecheck-buffer=CHECK):-metal -compute -shaderobj -xslang -DMETAL
//TEST:COMPARE_COMPUTE_EX(filecheck-buffer=CHECK):-vk -compute -shaderobj -emit-spirv-directly -xslang -DUSE_GLSL_SYNTAX -allow-glsl
-//TEST:COMPARE_COMPUTE_EX(filecheck-buffer=CHECK):-vk -compute -shaderobj -emit-spirv-via-glsl -allow-glsl -Xslang... -DUSE_GLSL_SYNTAX -capability GL_KHR_shader_subgroup_rotate -X.
+//TEST:COMPARE_COMPUTE_EX(filecheck-buffer=CHECK):-slang -compute -vk -shaderobj -emit-spirv-via-glsl -allow-glsl -profile sm_6_0 -Xslang... -DUSE_GLSL_SYNTAX -capability GL_KHR_shader_subgroup_rotate -X.
//TEST:COMPARE_COMPUTE_EX(filecheck-buffer=CHECK):-metal -compute -shaderobj -xslang -DMETAL -xslang -DUSE_GLSL_SYNTAX -allow-glsl
diff --git a/tests/language-feature/capability/capability-inheritance-1.slang b/tests/language-feature/capability/capability-inheritance-1.slang
new file mode 100644
index 000000000..b8104b350
--- /dev/null
+++ b/tests/language-feature/capability/capability-inheritance-1.slang
@@ -0,0 +1,77 @@
+//TEST:SIMPLE(filecheck=CHECK): -target hlsl -entry computeMain -stage compute
+
+// Test if InheritanceDecl fail to conform to parent capabilities
+
+// mismatch of target abstract atoms
+[require(hlsl)]
+interface IFoo0
+{
+}
+[require(hlsl)]
+[require(spirv)]
+// CHECK-DAG: ([[# @LINE+1]]): error 36108{{.*}}spirv
+struct Foo0 : IFoo0
+{
+}
+
+// mismatch of target abstract atoms
+[require(hlsl)]
+[require(spirv)]
+interface IFoo1
+{
+}
+[require(hlsl)]
+// CHECK-DAG: ([[# @LINE+1]]): error 36118{{.*}}spirv
+struct Foo1 : IFoo1
+{
+}
+
+// subtype is superset
+[require(sm_4_0)]
+interface IFoo2
+{
+}
+[require(sm_5_0)]
+// CHECK-DAG: ([[# @LINE+1]]): error 36104{{.*}}sm_5_0
+struct Foo2 : IFoo2
+{
+}
+
+// subtype is subset, no error
+[require(sm_5_0)]
+interface IFoo3
+{
+}
+[require(sm_4_0)]
+struct Foo3 : IFoo3
+{
+}
+
+// mismatch of stage abstract atoms
+[require(hlsl, compute)]
+interface IFoo4
+{
+}
+[require(hlsl, fragment)]
+// CHECK-DAG: ([[# @LINE+1]]): error 36118{{.*}}compute
+struct Foo4 : IFoo4
+{
+}
+
+// mismatch of stage abstract atoms
+[require(fragment)]
+[require(vertex)]
+interface IFoo5
+{
+}
+[require(fragment)]
+// CHECK-DAG: ([[# @LINE+1]]): error 36118{{.*}}vertex
+struct Foo5 : IFoo5
+{
+}
+
+[require(hlsl)]
+[numthreads(1,1,1)]
+void computeMain()
+{
+}
diff --git a/tests/language-feature/capability/capability-interface-requirement-1.slang b/tests/language-feature/capability/capability-interface-requirement-1.slang
new file mode 100644
index 000000000..687ea51c9
--- /dev/null
+++ b/tests/language-feature/capability/capability-interface-requirement-1.slang
@@ -0,0 +1,56 @@
+//TEST:SIMPLE(filecheck=CHECK): -target hlsl -entry computeMain -stage compute
+
+// Test for requirment/implementation conformance given mismatch
+
+public interface IAtomicAddable_Error1
+{
+ [require(sm_5_0, glsl)]
+ [require(sm_5_0, hlsl)]
+ public void atomicAdd(RWByteAddressBuffer buf, uint addr, int64_t value);
+}
+public struct AtomicAddable_Error1 : IAtomicAddable_Error1
+{
+ [require(sm_5_0, glsl)]
+ // CHECK: ([[# @LINE+1]]): error 36118: {{.*}}hlsl
+ public void atomicAdd(RWByteAddressBuffer buf, uint addr, int64_t value) { }
+}
+
+// ([[# @LINE-9]]): note: see declaration of 'atomicAdd'
+
+public interface IAtomicAddable_Error2
+{
+ [require(sm_5_0, glsl)]
+ public void atomicAdd(RWByteAddressBuffer buf, uint addr, int64_t value);
+}
+public struct AtomicAddable_Error2 : IAtomicAddable_Error2
+{
+ [require(sm_5_0, glsl)]
+ [require(sm_5_0, hlsl)]
+ // CHECK: ([[# @LINE+1]]): error 36108: {{.*}}hlsl
+ public void atomicAdd(RWByteAddressBuffer buf, uint addr, int64_t value) { }
+}
+
+// ([[# @LINE-9]]): note: see declaration of 'atomicAdd'
+
+// Test that we do not error (should be implicitly inferring capabilities)
+// CHECK-NOT: error
+
+public interface IAtomicAddable3
+{
+ public void atomicAdd(RWByteAddressBuffer buf, uint addr, int value);
+}
+
+public struct AtomicAddable_Error4 : IAtomicAddable3
+{
+ public void atomicAdd(RWByteAddressBuffer buf, uint addr, int value) { buf.InterlockedAdd(addr, value); }
+}
+
+public struct AtomicAddable_Error5 : IAtomicAddable3
+{
+ public void atomicAdd(RWByteAddressBuffer buf, uint addr, int value) { buf.InterlockedAddI64(addr, value); }
+}
+
+[numthreads(1,1,1)]
+void computeMain()
+{
+}
diff --git a/tests/language-feature/capability/capability2.slang b/tests/language-feature/capability/capability2.slang
index 6125c21d3..354b87dd5 100644
--- a/tests/language-feature/capability/capability2.slang
+++ b/tests/language-feature/capability/capability2.slang
@@ -12,6 +12,11 @@ interface IFoo
void method2();
}
+interface IFoo2
+{
+ void method3();
+}
+
[require(spvGroupNonUniformArithmetic)]
void useNonUniformArithmetic()
{}
@@ -39,20 +44,32 @@ struct Impl1 : IFoo
}
}
-struct Impl2 : IFoo
+struct Impl2 : IFoo, IFoo2
{
- // CHECK: error 36104: {{.*}}spvGroupNonUniformArithmetic
+ // error here because explicit requirement is on `method1`
+ // CHECK: error 36104:{{.*}}spvGroupNonUniformArithmetic
void method1()
{
- useRayQueryKHR(); // OK.
- useNonUniformArithmetic(); // error.
+ useRayQueryKHR();
+ useNonUniformArithmetic();
}
+ // error here because capabilities are explicitly tagged on
+ // the requirement parent `IFoo`
// CHECK: error 36104: {{.*}}spvGroupNonUniformArithmetic
void method2()
{
useAtomicFloat16();
- useNonUniformArithmetic(); // error.
+ useNonUniformArithmetic();
+ }
+
+ // do not error here because capabilities are not explicitly tagged
+ // on the requirement parent `IFoo2` or requirment method
+ // CHECK-NOT: error
+ void method3()
+ {
+ useAtomicFloat16();
+ useNonUniformArithmetic();
}
}
diff --git a/tests/language-feature/capability/capabilitySimplification1.slang b/tests/language-feature/capability/capabilitySimplification1.slang
index 440ac1ced..0e6303412 100644
--- a/tests/language-feature/capability/capabilitySimplification1.slang
+++ b/tests/language-feature/capability/capabilitySimplification1.slang
@@ -1,24 +1,13 @@
//TEST:SIMPLE(filecheck=CHECK): -target glsl -entry computeMain -stage compute -profile sm_5_0
//TEST:SIMPLE(filecheck=CHECK_IGNORE_CAPS): -target glsl -emit-spirv-directly -entry computeMain -stage compute -profile sm_5_0 -ignore-capabilities
-
// CHECK_IGNORE_CAPS-NOT: error 36107
-// CHECK: error 36107
-// CHECK-SAME: entrypoint 'computeMain' uses features that are not available in 'compute' stage for 'glsl' target.
-// CHECK: capabilitySimplification1.slang(21): note: see using of 'WaveMultiPrefixCountBits'
-// CHECK-NOT: see using of 'WaveMultiPrefixCountBits'
-// CHECK: {{.*}}.meta.slang({{.*}}): note: see definition of 'WaveMultiPrefixCountBits'
-// CHECK: {{.*}}.meta.slang({{.*}}): note: see declaration of 'require'
-
-void nestedSafeCall()
-{
- AllMemoryBarrier();
-}
-
-void nestedBadCall()
+[numthreads(1, 1, 1)]
+// CHECK: ([[# @LINE+1]]): error 36107: {{.*}}computeMain{{.*}}compute{{.*}}glsl
+void computeMain()
{
- WaveMultiPrefixCountBits(true, 0);
+ nestedCall();
}
void nestedCall()
@@ -27,8 +16,13 @@ void nestedCall()
nestedBadCall();
}
-[numthreads(1,1,1)]
-void computeMain()
+void nestedSafeCall()
{
- nestedCall();
+ AllMemoryBarrier();
}
+
+void nestedBadCall()
+{
+ // CHECK: ([[# @LINE+1]]): note: see using of 'WaveMultiPrefixCountBits'
+ WaveMultiPrefixCountBits(true, 0);
+} \ No newline at end of file
diff --git a/tests/language-feature/capability/capabilitySimplification3.slang b/tests/language-feature/capability/capabilitySimplification3.slang
deleted file mode 100644
index 150f926a9..000000000
--- a/tests/language-feature/capability/capabilitySimplification3.slang
+++ /dev/null
@@ -1,17 +0,0 @@
-//TEST:SIMPLE(filecheck=CHECK): -target glsl -entry computeMain -stage compute -profile sm_5_0
-//TEST:SIMPLE(filecheck=CHECK_IGNORE_CAPS): -target glsl -emit-spirv-directly -entry computeMain -stage compute -profile sm_5_0 -ignore-capabilities
-
-
-// CHECK_IGNORE_CAPS-NOT: error 36107
-
-// CHECK: error 36107: entrypoint 'computeMain' uses features that are not available in 'compute' stage for 'glsl' target.
-// CHECK: capabilitySimplification3.slang(16): note: see using of 'WaveMultiPrefixCountBits'
-// CHECK-NOT: see using of 'WaveMultiPrefixCountBits'
-// CHECK: {{.*}}.meta.slang({{.*}}): note: see definition of 'WaveMultiPrefixCountBits'
-// CHECK: {{.*}}.meta.slang({{.*}}): note: see declaration of 'require'
-
-[numthreads(1,1,1)]
-void computeMain()
-{
- WaveMultiPrefixCountBits(true, 0);
-}
diff --git a/tests/language-feature/capability/explicit-shader-stage-2.slang b/tests/language-feature/capability/explicit-shader-stage-2.slang
index a01cff7c2..8ef3e158c 100644
--- a/tests/language-feature/capability/explicit-shader-stage-2.slang
+++ b/tests/language-feature/capability/explicit-shader-stage-2.slang
@@ -1,7 +1,7 @@
//TEST:SIMPLE(filecheck=CHECK): -target hlsl -entry main -allow-glsl -profile sm_5_0
//TEST:SIMPLE(filecheck=CHECK_IGNORE_CAPS): -target hlsl -entry main -allow-glsl -profile sm_5_0 -ignore-capabilities
-//CHECK: error 36107: entrypoint 'main' uses features that are not available in 'fragment' stage for 'hlsl' target.
+// CHECK: error 36107: entrypoint 'main' uses features that are not available in 'fragment' stage for 'hlsl'
//CHECK_IGNORE_CAPS-NOT: error 36100
[shader("fragment")]
float4 main()