blob: 8ad89f48a8aafc55e60a1b7f6cdc097480e90f52 [file] [log] [blame]
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);
});