<script>
if (window.testRunner) { testRunner.waitUntilDone(); testRunner.dumpAsText() }
const log = globalThis.$vm?.print ?? console.log;

onload = async () => {
    adapter1 = await navigator.gpu.requestAdapter( { } );
    let promise3 = adapter1.requestDevice(
    {
    label: 'a',
    requiredFeatures: [
    'depth-clip-control',
    'depth32float-stencil8',
    'indirect-first-instance',
    'shader-f16',
    'rg11b10ufloat-renderable',
    'bgra8unorm-storage'
    ],
    requiredLimits: {
    maxVertexAttributes: 22,
    maxVertexBufferArrayStride: 60002,
    maxStorageTexturesPerShaderStage: 36,
    maxBindingsPerBindGroup: 205,
    },
    }
    );

    let device1 = await promise3;

    let pipelineLayout2 = device1.createPipelineLayout(
    {
    label: 'a',
    bindGroupLayouts: [
    ],
    }
    );

    let shaderModule4 = device1.createShaderModule(
    {
    label: 'a',
    code: `@group(1) @binding(121)
    var<storage, read_write> __dynamicOffset2: array<u32>;
    @group(1) @binding(632)
    var<storage, read_write> field5: array<u32>;
    @group(0) @binding(632)
    var<storage, read_write> __DynamicOffsets0: array<u32>;
    @group(2) @binding(523)
    var<storage, read_write> global4: array<u32>;
    @group(1) @binding(351)
    var<storage, read_write> __DynamicOffsets1: array<u32>;
    @group(2) @binding(623)
    var<storage, read_write> type4: array<u32>;
    @group(0) @binding(121)
    var<storage, read_write> __ArgumentBuffer_2: array<u32>;
    @group(2) @binding(559)
    var<storage, read_write> function3: array<u32>;
    @compute @workgroup_size(7, 1, 1)
    fn compute0(@builtin(global_invocation_id) global_id : vec3<u32>, @builtin(local_invocation_id) local_id : vec3<u32>) {
      var x: u32 = 0;
      loop {
        function3[x] = global_id.x;
        x += 1;
        __DynamicOffsets1[global_id.y-global_id.x] = __dynamicOffset2[x];
        if (x > 2 * arrayLength(&field5)) {
          break;
        }
      }
    }
    @compute @workgroup_size(8, 1, 4)
    fn compute1(@builtin(global_invocation_id) global_id : vec3<u32>, @builtin(local_invocation_id) local_id : vec3<u32>) {
      __dynamicOffset2[global_id.x*local_id.x] = u32(function3[global_id.x*local_id.x]);
    }

    struct S {
      @location(0) out0: vec4<f32>,
      @location(1) out1: vec4<f32>,
    }

    struct S2 {
      @location(0) out0: vec4<f32>,
      out1: vec4<f32>,
    }

    struct S3 {
      @location(0) out0: vec4<f32>,
      out1: S4,
    }

    struct S4 {
      @location(1) out2: vec4<f32>,
      @location(2) out3: vec4<f32>,
    }

    @fragment
    fn fragment0(@builtin(position) coord_in: vec4<f32>) -> @location(123) i32 {
    return i32();
    }

    @fragment
    fn fragment1(@builtin(position) coord_in: vec4<f32>) -> @location(0) vec4<f32> {
      return vec4<f32>(coord_in.x, coord_in.y, 0.0, 1.0);
    }

    @fragment
    fn fragment2(@builtin(position) coord_in: vec4<f32>) -> S {
    }

    @fragment
    fn fragment3(@builtin(position) coord_in: vec4<f32>) -> S {
      return S();
    }

    @fragment
    fn fragment4(@builtin(position) coord_in: vec4<f32>) -> S2 {
      return S2();
    }

    @fragment
    fn fragment5(x: S3) -> S3 {
      return x;
    }

    @vertex
    fn vertex0() -> @builtin(position) vec4<f32> {
      return vec4<f32>(0.0, 0.0, 0.0, 1.0);
    }

    @vertex
    fn vertex1(@builtin(vertex_index) v_index: u32, @builtin(instance_index) i_index: u32,) -> @builtin(position) vec4<f32> {
      return vec4<f32>(f32(v_index), f32(i_index), 0.0, 1.0);
    }

    @vertex
    fn vertex2(@builtin(vertex_index) v_index: u32, @builtin(instance_index) i_index: u32,) -> S {
    }

    @vertex
    fn vertex3(@builtin(vertex_index) v_index: u32, @builtin(instance_index) i_index: u32,) -> S {
      return S();
    }
    `,
    sourceMap: {},
    hints: {},
    }
    );

    let pipeline6 = device1.createComputePipeline(
    {
    label: 'a',
    layout: pipelineLayout2,
    compute: {
    module: shaderModule4,
    entryPoint: 'compute0',
    constants: {},
    },
    }
    );

    let bindGroupLayout11 = pipeline6.getBindGroupLayout(
    75
    );

    bindGroupLayout11.label = '\u0afc';
    if (window.testRunner) { testRunner.notifyDone() }
};
</script>
This test passes if it does not crash.
