summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2024-10-20 09:28:13 -0700
committerGitHub <noreply@github.com>2024-10-20 09:28:13 -0700
commit307315a7305e76529837fd1cdb677f534d5f539b (patch)
treeba39e96ba2e9b3d62d1213aab2f1cc54febe451a /tests
parent9936178dd3efb026bfa142512a2bf061d7a75ab5 (diff)
Properly check switch case. (#5341)
Diffstat (limited to 'tests')
-rw-r--r--tests/bugs/gh-5321.slang17
-rw-r--r--tests/diagnostics/constexpr-error.slang5
-rw-r--r--tests/diagnostics/constexpr-error.slang.expected20
-rw-r--r--tests/language-feature/enums/enum-cast.slang22
-rw-r--r--tests/language-feature/enums/enum-switch-2.slang30
-rw-r--r--tests/language-feature/enums/enum-switch.slang31
-rw-r--r--tests/language-feature/single-arg-ctor-call.slang19
7 files changed, 123 insertions, 21 deletions
diff --git a/tests/bugs/gh-5321.slang b/tests/bugs/gh-5321.slang
new file mode 100644
index 000000000..6bb1de1a7
--- /dev/null
+++ b/tests/bugs/gh-5321.slang
@@ -0,0 +1,17 @@
+//TEST:SIMPLE(filecheck=CHECK): -target spirv
+
+// CHECK: error {{.*}} compile-time constant
+
+uniform uint FillType_Solid = 0u;
+
+[shader("compute")]
+float cs(uniform uint x)
+ : SV_Target
+{
+ switch (x)
+ {
+ case FillType_Solid:
+ return 0.0;
+ }
+ return 0.0;
+} \ No newline at end of file
diff --git a/tests/diagnostics/constexpr-error.slang b/tests/diagnostics/constexpr-error.slang
index a5b98264b..0a4744b71 100644
--- a/tests/diagnostics/constexpr-error.slang
+++ b/tests/diagnostics/constexpr-error.slang
@@ -1,4 +1,4 @@
-//DIAGNOSTIC_TEST:SIMPLE:
+//DIAGNOSTIC_TEST:SIMPLE(filecheck=CHECK):
// Failure to pass compile-time-constant data
// where it is expected.
@@ -24,6 +24,7 @@ float4 main() : SV_Target
result += t.Sample(s, uv, int2(0,0));
// Error: data passed through cbuffer isn't compile-time constant
+ // CHECK: ([[# @LINE+1]]): error 40006:
result += t.Sample(s, uv, offset);
// Error: data computed via conditional isn't compile-time cosntant
@@ -32,10 +33,12 @@ float4 main() : SV_Target
{
ii = 1;
}
+ // CHECK: ([[# @LINE+1]]): error 40006:
result += t.Sample(s, uv, int2(ii));
// Error: data computed in loop isn't compile-time constant
// (and loop isn't unroll-able)
+ // CHECK: ([[# @LINE+1]]): error 40006:
for(uint jj = 0; jj < uv.y; jj++)
{
result += t.Sample(s, uv, int2(jj));
diff --git a/tests/diagnostics/constexpr-error.slang.expected b/tests/diagnostics/constexpr-error.slang.expected
deleted file mode 100644
index 6f124fe34..000000000
--- a/tests/diagnostics/constexpr-error.slang.expected
+++ /dev/null
@@ -1,20 +0,0 @@
-result code = -1
-standard error = {
-tests/diagnostics/constexpr-error.slang(27): error 40006: expected a compile-time constant
- result += t.Sample(s, uv, offset);
- ^~~~~~
-tests/diagnostics/constexpr-error.slang(35): error 40006: expected a compile-time constant
- result += t.Sample(s, uv, int2(ii));
- ^
-tests/diagnostics/constexpr-error.slang(39): error 40006: expected a compile-time constant
- for(uint jj = 0; jj < uv.y; jj++)
- ^~
-tests/diagnostics/constexpr-error.slang(41): error 40006: expected a compile-time constant
- result += t.Sample(s, uv, int2(jj));
- ^
-tests/diagnostics/constexpr-error.slang(39): error 40006: expected a compile-time constant
- for(uint jj = 0; jj < uv.y; jj++)
- ^~
-}
-standard output = {
-}
diff --git a/tests/language-feature/enums/enum-cast.slang b/tests/language-feature/enums/enum-cast.slang
new file mode 100644
index 000000000..fe82c5a5c
--- /dev/null
+++ b/tests/language-feature/enums/enum-cast.slang
@@ -0,0 +1,22 @@
+//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -shaderobj
+
+enum MyFlags
+{
+ A,B,C
+}
+
+bool test(MyFlags f1)
+{
+ return f1 == MyFlags(uint(1));
+}
+
+//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name=outputBuffer
+RWStructuredBuffer<int> outputBuffer;
+
+[numthreads(1, 1, 1)]
+void computeMain(int3 dispatchThreadID: SV_DispatchThreadID)
+{
+ int outVal = test(MyFlags.B) ? 1 : 0;
+ // CHECK: 1
+ outputBuffer[0] = outVal;
+}
diff --git a/tests/language-feature/enums/enum-switch-2.slang b/tests/language-feature/enums/enum-switch-2.slang
new file mode 100644
index 000000000..f5266f35d
--- /dev/null
+++ b/tests/language-feature/enums/enum-switch-2.slang
@@ -0,0 +1,30 @@
+//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=CHECK):-slang -compute -shaderobj -output-using-type
+//TEST(compute, vulkan):COMPARE_COMPUTE_EX(filecheck-buffer=CHECK):-vk -compute -shaderobj -output-using-type
+
+enum class E : uint32_t
+{
+ A,
+ B,
+ C
+}
+
+//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name=outputBuffer
+RWStructuredBuffer<uint> outputBuffer;
+
+[NumThreads(1,1,1)]
+void computeMain(int i : SV_DispatchThreadID)
+{
+ switch (i)
+ {
+ case int(E::A):
+ outputBuffer[0] = 1;
+ break;
+ case int(E::B):
+ outputBuffer[0] = 2;
+ break;
+ case int(E::C):
+ outputBuffer[0] = 3;
+ break;
+ }
+ // CHECK: 1
+}
diff --git a/tests/language-feature/enums/enum-switch.slang b/tests/language-feature/enums/enum-switch.slang
new file mode 100644
index 000000000..600c2e31e
--- /dev/null
+++ b/tests/language-feature/enums/enum-switch.slang
@@ -0,0 +1,31 @@
+//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=CHECK):-slang -compute -shaderobj -output-using-type
+//TEST(compute, vulkan):COMPARE_COMPUTE_EX(filecheck-buffer=CHECK):-vk -compute -shaderobj -output-using-type
+
+enum class E : uint32_t
+{
+ A,
+ B,
+ C
+}
+
+//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name=outputBuffer
+RWStructuredBuffer<uint> outputBuffer;
+
+[NumThreads(1,1,1)]
+void computeMain(int i : SV_DispatchThreadID)
+{
+ E e = E(i);
+ switch (e)
+ {
+ case E::A:
+ outputBuffer[0] = 1;
+ break;
+ case E::B:
+ outputBuffer[0] = 2;
+ break;
+ case E::C:
+ outputBuffer[0] = 3;
+ break;
+ }
+ // CHECK: 1
+} \ No newline at end of file
diff --git a/tests/language-feature/single-arg-ctor-call.slang b/tests/language-feature/single-arg-ctor-call.slang
new file mode 100644
index 000000000..a4c55c2ed
--- /dev/null
+++ b/tests/language-feature/single-arg-ctor-call.slang
@@ -0,0 +1,19 @@
+//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -shaderobj
+//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -vk -shaderobj
+
+struct SSS
+{
+ float3 v;
+ __init(float3 a) { v= a; }
+}
+
+//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name=outputBuffer
+RWStructuredBuffer<int> outputBuffer;
+
+[numthreads(1, 1, 1)]
+void computeMain(int3 dispatchThreadID: SV_DispatchThreadID)
+{
+ SSS s = SSS(0);
+ // CHECK: 1
+ outputBuffer[0] = int(s.v.x + 1);
+}