| 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); |
| }); |