summaryrefslogtreecommitdiffstats
path: root/dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/decl/compound_statement.spec.ts
diff options
context:
space:
mode:
Diffstat (limited to 'dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/decl/compound_statement.spec.ts')
-rw-r--r--dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/decl/compound_statement.spec.ts98
1 files changed, 98 insertions, 0 deletions
diff --git a/dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/decl/compound_statement.spec.ts b/dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/decl/compound_statement.spec.ts
new file mode 100644
index 0000000000..8ad89f48a8
--- /dev/null
+++ b/dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/decl/compound_statement.spec.ts
@@ -0,0 +1,98 @@
+export const description = `
+Validation tests for declarations in compound statements.
+`;
+
+import { makeTestGroup } from '../../../../common/framework/test_group.js';
+import { keysOf } from '../../../../common/util/data_tables.js';
+import { ShaderValidationTest } from '../shader_validation_test.js';
+
+export const g = makeTestGroup(ShaderValidationTest);
+
+// 9.1 Compound Statements
+// When a declaration is one of those statements, its identifier is in scope from
+// the start of the next statement until the end of the compound statement.
+//
+// Enumerating cases: Consider a declaration X inside a compound statement.
+// The X declaration should be tested with potential uses and potentially
+// conflicting declarations in positions [a, b, c, d, e], in the following:
+// a { b; X; c; { d; } } e;
+
+const kConflictTests = {
+ a: {
+ src: 'let x = 1; { let x = 1; }',
+ pass: true,
+ },
+ bc: {
+ src: '{let x = 1; let x = 1; }',
+ pass: false,
+ },
+ d: {
+ src: '{let x = 1; { let x = 1; }}',
+ pass: true,
+ },
+ e: {
+ src: '{let x = 1; } let x = 1;',
+ pass: true,
+ },
+};
+
+g.test('decl_conflict')
+ .desc(
+ 'Test a potentially conflicting declaration relative to a declaration in a compound statement'
+ )
+ .params(u => u.combine('case', keysOf(kConflictTests)))
+ .fn(t => {
+ const wgsl = `
+@vertex fn vtx() -> @builtin(position) vec4f {
+ ${kConflictTests[t.params.case].src}
+ return vec4f(1);
+}`;
+ t.expectCompileResult(kConflictTests[t.params.case].pass, wgsl);
+ });
+
+const kUseTests = {
+ a: {
+ src: 'let y = x; { let x = 1; }',
+ pass: false, // not visible
+ },
+ b: {
+ src: '{ let y = x; let x = 1; }',
+ pass: false, // not visible
+ },
+ self: {
+ src: '{ let x = (x);}',
+ pass: false, // not visible
+ },
+ c_yes: {
+ src: '{ const x = 1; const_assert x == 1; }',
+ pass: true,
+ },
+ c_no: {
+ src: '{ const x = 1; const_assert x == 2; }',
+ pass: false,
+ },
+ d_yes: {
+ src: '{ const x = 1; { const_assert x == 1; }}',
+ pass: true,
+ },
+ d_no: {
+ src: '{ const x = 1; { const_assert x == 2; }}',
+ pass: false,
+ },
+ e: {
+ src: '{ const x = 1; } let y = x;',
+ pass: false, // not visible
+ },
+};
+
+g.test('decl_use')
+ .desc('Test a use of a declaration in a compound statement')
+ .params(u => u.combine('case', keysOf(kUseTests)))
+ .fn(t => {
+ const wgsl = `
+@vertex fn vtx() -> @builtin(position) vec4f {
+ ${kUseTests[t.params.case].src}
+ return vec4f(1);
+}`;
+ t.expectCompileResult(kUseTests[t.params.case].pass, wgsl);
+ });