<script>
  globalThis.testRunner?.waitUntilDone();
  globalThis.testRunner?.dumpAsText();

  onload = async () => {
    let adapter = await navigator.gpu.requestAdapter({});
    let device = await adapter.requestDevice({});
    device.pushErrorScope('validation');
    let module = device.createShaderModule({
      code: `
@group(0) @binding(0) var<storage, read_write> buffer0: u32;

@compute @workgroup_size(1)
fn compute0() {
  var i = 0x555u;
  loop {
    if i < 0x1000 { continue; }
    break;
    continuing { i += 1u; }
  }
  buffer0 = i;
}
`,
    });
    let bindGroupLayout0 = device.createBindGroupLayout({entries: [{binding: 0, visibility: GPUShaderStage.COMPUTE, buffer: {type: 'storage'}}]});
    let storageBuffer0 = device.createBuffer({size: 4, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC});
    let commandEncoder0 = device.createCommandEncoder({});
    let computePassEncoder0 = commandEncoder0.beginComputePass();
    let pipeline0 = device.createComputePipeline({layout: device.createPipelineLayout({bindGroupLayouts: [bindGroupLayout0]}), compute: {module}});
    computePassEncoder0.setPipeline(pipeline0);
    let bindGroup0 = device.createBindGroup({layout: bindGroupLayout0, entries: [{binding: 0, resource: {buffer: storageBuffer0}}]});
    computePassEncoder0.setBindGroup(0, bindGroup0);
    computePassEncoder0.dispatchWorkgroups(1);
    computePassEncoder0.end();
    let outputBuffer0 = device.createBuffer({size: storageBuffer0.size, usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST});
    commandEncoder0.copyBufferToBuffer(storageBuffer0, 0, outputBuffer0, 0, outputBuffer0.size);
    let commandBuffer0 = commandEncoder0.finish();
    device.queue.submit([commandBuffer0]);
    await device.queue.onSubmittedWorkDone();
    await outputBuffer0.mapAsync(GPUMapMode.READ);
    console.log([...new Uint32Array(outputBuffer0.getMappedRange())].map(x => x.toString(0x10)).join(' '));
    outputBuffer0.unmap();
    let error = await device.popErrorScope();
    if (error) {
      console.log(error.message);
    } else {
      console.log('no validation error');
    }
    globalThis.testRunner?.notifyDone();
  };
</script>
