| export const description = `Validation tests for continue`; |
| |
| 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); |
| |
| const kTests = { |
| continue: { |
| src: 'continue;', |
| pass: false, |
| }, |
| compound_continue: { |
| src: '{ continue; }', |
| pass: false, |
| }, |
| loop_continue: { |
| src: 'loop { if false { break; } continue; }', |
| pass: true, |
| }, |
| while_continue: { |
| src: 'while true { continue; }', |
| pass: true, |
| }, |
| for_continue: { |
| src: 'for (;true;) { continue; }', |
| pass: true, |
| }, |
| continuing_continue: { |
| src: 'loop { continuing { continue; } }', |
| pass: false, |
| }, |
| continuing_nested_loop_continue: { |
| src: 'loop { if false { break; } continuing { loop { if false { break; } continue; } } }', |
| pass: true, |
| }, |
| if_continue: { |
| src: 'if true { continue; }', |
| pass: false, |
| }, |
| nested_if_continue: { |
| src: 'while true { if true { continue; } }', |
| pass: true, |
| }, |
| switch_case_continue: { |
| src: 'switch(1) { default: { continue; } }', |
| pass: false, |
| }, |
| nested_switch_case_continue: { |
| src: 'while true { switch(1) { default: { continue; } } }', |
| pass: true, |
| }, |
| return_continue: { |
| src: 'return continue;', |
| pass: false, |
| }, |
| loop_continue_after_decl_used_in_continuing: { |
| src: 'loop { let cond = false; continue; continuing { break if cond; } }', |
| pass: true, |
| }, |
| loop_continue_before_decl_used_in_continuing: { |
| src: 'loop { continue; let cond = false; continuing { break if cond; } }', |
| pass: false, |
| }, |
| loop_continue_before_decl_not_used_in_continuing: { |
| src: 'loop { continue; let cond = false; continuing { break if false; } }', |
| pass: true, |
| }, |
| loop_nested_continue_before_decl_used_in_continuing: { |
| src: 'loop { if false { continue; } let cond = false; continuing { break if cond; } }', |
| pass: false, |
| }, |
| loop_continue_expression: { |
| src: 'loop { if false { break; } continue true; }', |
| pass: false, |
| }, |
| for_init_continue: { |
| src: 'for (continue;;) { break; }', |
| pass: false, |
| }, |
| for_condition_continue: { |
| src: 'for (;continue;) { break; }', |
| pass: false, |
| }, |
| for_continue_continue: { |
| src: 'for (;;continue) { break; }', |
| pass: false, |
| }, |
| }; |
| |
| g.test('placement') |
| .desc('Test that continue placement is validated correctly') |
| .params(u => u.combine('stmt', keysOf(kTests))) |
| .fn(t => { |
| const code = ` |
| @vertex |
| fn vtx() -> @builtin(position) vec4f { |
| ${kTests[t.params.stmt].src} |
| return vec4f(1); |
| } |
| `; |
| t.expectCompileResult(kTests[t.params.stmt].pass, code); |
| }); |
| |
| g.test('module_scope') |
| .desc('Test that continue is not valid at module-scope.') |
| .fn(t => { |
| const code = ` |
| continue; |
| `; |
| t.expectCompileResult(false, code); |
| }); |