SKIP: FAILED

../../src/tint/lang/msl/writer/printer/printer.cc:500 internal compiler error: Inner = struct @align(16) {
  scalar_f32:f32 @offset(0)
  scalar_i32:i32 @offset(4)
  scalar_u32:u32 @offset(8)
  vec2_f32:vec2<f32> @offset(16)
  vec2_i32:vec2<i32> @offset(24)
  vec2_u32:vec2<u32> @offset(32)
  vec3_f32:vec3<f32> @offset(48)
  vec3_i32:vec3<i32> @offset(64)
  vec3_u32:vec3<u32> @offset(80)
  vec4_f32:vec4<f32> @offset(96)
  vec4_i32:vec4<i32> @offset(112)
  vec4_u32:vec4<u32> @offset(128)
  mat2x2_f32:mat2x2<f32> @offset(144)
  mat2x3_f32:mat2x3<f32> @offset(160)
  mat2x4_f32:mat2x4<f32> @offset(192)
  mat3x2_f32:mat3x2<f32> @offset(224)
  mat3x3_f32:mat3x3<f32> @offset(256)
  mat3x4_f32:mat3x4<f32> @offset(304)
  mat4x2_f32:mat4x2<f32> @offset(352)
  mat4x3_f32:mat4x3<f32> @offset(384)
  mat4x4_f32:mat4x4<f32> @offset(448)
  arr2_vec3_f32:array<vec3<f32>, 2> @offset(512)
}

S = struct @align(16) {
  arr:array<Inner> @offset(0)
}

$B1: {  # root
  %sb:ptr<storage, S, read_write> = var @binding_point(0, 0)
}

%tint_symbol = @compute @workgroup_size(1, 1, 1) func(%idx:u32 [@local_invocation_index]):void {
  $B2: {
    %4:ptr<storage, f32, read_write> = access %sb, 0u, %idx, 0u
    store %4, 0.0f
    %5:ptr<storage, i32, read_write> = access %sb, 0u, %idx, 1u
    store %5, 0i
    %6:ptr<storage, u32, read_write> = access %sb, 0u, %idx, 2u
    store %6, 0u
    %7:ptr<storage, vec2<f32>, read_write> = access %sb, 0u, %idx, 3u
    store %7, vec2<f32>(0.0f)
    %8:ptr<storage, vec2<i32>, read_write> = access %sb, 0u, %idx, 4u
    store %8, vec2<i32>(0i)
    %9:ptr<storage, vec2<u32>, read_write> = access %sb, 0u, %idx, 5u
    store %9, vec2<u32>(0u)
    %10:ptr<storage, vec3<f32>, read_write> = access %sb, 0u, %idx, 6u
    store %10, vec3<f32>(0.0f)
    %11:ptr<storage, vec3<i32>, read_write> = access %sb, 0u, %idx, 7u
    store %11, vec3<i32>(0i)
    %12:ptr<storage, vec3<u32>, read_write> = access %sb, 0u, %idx, 8u
    store %12, vec3<u32>(0u)
    %13:ptr<storage, vec4<f32>, read_write> = access %sb, 0u, %idx, 9u
    store %13, vec4<f32>(0.0f)
    %14:ptr<storage, vec4<i32>, read_write> = access %sb, 0u, %idx, 10u
    store %14, vec4<i32>(0i)
    %15:ptr<storage, vec4<u32>, read_write> = access %sb, 0u, %idx, 11u
    store %15, vec4<u32>(0u)
    %16:ptr<storage, mat2x2<f32>, read_write> = access %sb, 0u, %idx, 12u
    store %16, mat2x2<f32>(vec2<f32>(0.0f))
    %17:ptr<storage, mat2x3<f32>, read_write> = access %sb, 0u, %idx, 13u
    %18:void = call %tint_store_and_preserve_padding, %17, mat2x3<f32>(vec3<f32>(0.0f))
    %20:ptr<storage, mat2x4<f32>, read_write> = access %sb, 0u, %idx, 14u
    store %20, mat2x4<f32>(vec4<f32>(0.0f))
    %21:ptr<storage, mat3x2<f32>, read_write> = access %sb, 0u, %idx, 15u
    store %21, mat3x2<f32>(vec2<f32>(0.0f))
    %22:ptr<storage, mat3x3<f32>, read_write> = access %sb, 0u, %idx, 16u
    %23:void = call %tint_store_and_preserve_padding_1, %22, mat3x3<f32>(vec3<f32>(0.0f))
    %25:ptr<storage, mat3x4<f32>, read_write> = access %sb, 0u, %idx, 17u
    store %25, mat3x4<f32>(vec4<f32>(0.0f))
    %26:ptr<storage, mat4x2<f32>, read_write> = access %sb, 0u, %idx, 18u
    store %26, mat4x2<f32>(vec2<f32>(0.0f))
    %27:ptr<storage, mat4x3<f32>, read_write> = access %sb, 0u, %idx, 19u
    %28:void = call %tint_store_and_preserve_padding_2, %27, mat4x3<f32>(vec3<f32>(0.0f))
    %30:ptr<storage, mat4x4<f32>, read_write> = access %sb, 0u, %idx, 20u
    store %30, mat4x4<f32>(vec4<f32>(0.0f))
    %31:ptr<storage, array<vec3<f32>, 2>, read_write> = access %sb, 0u, %idx, 21u
    %32:void = call %tint_store_and_preserve_padding_3, %31, array<vec3<f32>, 2>(vec3<f32>(0.0f))
    ret
  }
}
%tint_store_and_preserve_padding = func(%target:ptr<storage, mat2x3<f32>, read_write>, %value_param:mat2x3<f32>):void {
  $B3: {
    %36:ptr<storage, vec3<f32>, read_write> = access %target, 0u
    %37:vec3<f32> = access %value_param, 0u
    store %36, %37
    %38:ptr<storage, vec3<f32>, read_write> = access %target, 1u
    %39:vec3<f32> = access %value_param, 1u
    store %38, %39
    ret
  }
}
%tint_store_and_preserve_padding_1 = func(%target_1:ptr<storage, mat3x3<f32>, read_write>, %value_param_1:mat3x3<f32>):void {  # %tint_store_and_preserve_padding_1: 'tint_store_and_preserve_padding', %target_1: 'target', %value_param_1: 'value_param'
  $B4: {
    %42:ptr<storage, vec3<f32>, read_write> = access %target_1, 0u
    %43:vec3<f32> = access %value_param_1, 0u
    store %42, %43
    %44:ptr<storage, vec3<f32>, read_write> = access %target_1, 1u
    %45:vec3<f32> = access %value_param_1, 1u
    store %44, %45
    %46:ptr<storage, vec3<f32>, read_write> = access %target_1, 2u
    %47:vec3<f32> = access %value_param_1, 2u
    store %46, %47
    ret
  }
}
%tint_store_and_preserve_padding_2 = func(%target_2:ptr<storage, mat4x3<f32>, read_write>, %value_param_2:mat4x3<f32>):void {  # %tint_store_and_preserve_padding_2: 'tint_store_and_preserve_padding', %target_2: 'target', %value_param_2: 'value_param'
  $B5: {
    %50:ptr<storage, vec3<f32>, read_write> = access %target_2, 0u
    %51:vec3<f32> = access %value_param_2, 0u
    store %50, %51
    %52:ptr<storage, vec3<f32>, read_write> = access %target_2, 1u
    %53:vec3<f32> = access %value_param_2, 1u
    store %52, %53
    %54:ptr<storage, vec3<f32>, read_write> = access %target_2, 2u
    %55:vec3<f32> = access %value_param_2, 2u
    store %54, %55
    %56:ptr<storage, vec3<f32>, read_write> = access %target_2, 3u
    %57:vec3<f32> = access %value_param_2, 3u
    store %56, %57
    ret
  }
}
%tint_store_and_preserve_padding_3 = func(%target_3:ptr<storage, array<vec3<f32>, 2>, read_write>, %value_param_3:array<vec3<f32>, 2>):void {  # %tint_store_and_preserve_padding_3: 'tint_store_and_preserve_padding', %target_3: 'target', %value_param_3: 'value_param'
  $B6: {
    loop [i: $B7, b: $B8, c: $B9] {  # loop_1
      $B7: {  # initializer
        next_iteration 0u  # -> $B8
      }
      $B8 (%idx_1:u32): {  # body
        %61:bool = gte %idx_1, 2u
        if %61 [t: $B10] {  # if_1
          $B10: {  # true
            exit_loop  # loop_1
          }
        }
        %62:ptr<storage, vec3<f32>, read_write> = access %target_3, %idx_1
        %63:vec3<f32> = access %value_param_3, %idx_1
        store %62, %63
        continue  # -> $B9
      }
      $B9: {  # continuing
        %64:u32 = add %idx_1, 1u
        next_iteration %64  # -> $B8
      }
    }
    ret
  }
}

unhandled variable address space
********************************************************************
*  The tint shader compiler has encountered an unexpected error.   *
*                                                                  *
*  Please help us fix this issue by submitting a bug report at     *
*  crbug.com/tint with the source program that triggered the bug.  *
********************************************************************
