SKIP: FAILED

../../src/tint/lang/msl/writer/printer/printer.cc:500 internal compiler error: Inner = struct @align(4) {
  scalar_i32:i32 @offset(0)
  scalar_f32:f32 @offset(4)
}

S = 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)
  struct_inner:Inner @offset(544)
  array_struct_inner:array<Inner, 4> @offset(552)
}

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

%tint_symbol = @compute @workgroup_size(1, 1, 1) func():void {
  $B2: {
    %3:ptr<storage, f32, read_write> = access %sb, 0u
    store %3, 0.0f
    %4:ptr<storage, i32, read_write> = access %sb, 1u
    store %4, 0i
    %5:ptr<storage, u32, read_write> = access %sb, 2u
    store %5, 0u
    %6:ptr<storage, vec2<f32>, read_write> = access %sb, 3u
    store %6, vec2<f32>(0.0f)
    %7:ptr<storage, vec2<i32>, read_write> = access %sb, 4u
    store %7, vec2<i32>(0i)
    %8:ptr<storage, vec2<u32>, read_write> = access %sb, 5u
    store %8, vec2<u32>(0u)
    %9:ptr<storage, vec3<f32>, read_write> = access %sb, 6u
    store %9, vec3<f32>(0.0f)
    %10:ptr<storage, vec3<i32>, read_write> = access %sb, 7u
    store %10, vec3<i32>(0i)
    %11:ptr<storage, vec3<u32>, read_write> = access %sb, 8u
    store %11, vec3<u32>(0u)
    %12:ptr<storage, vec4<f32>, read_write> = access %sb, 9u
    store %12, vec4<f32>(0.0f)
    %13:ptr<storage, vec4<i32>, read_write> = access %sb, 10u
    store %13, vec4<i32>(0i)
    %14:ptr<storage, vec4<u32>, read_write> = access %sb, 11u
    store %14, vec4<u32>(0u)
    %15:ptr<storage, mat2x2<f32>, read_write> = access %sb, 12u
    store %15, mat2x2<f32>(vec2<f32>(0.0f))
    %16:ptr<storage, mat2x3<f32>, read_write> = access %sb, 13u
    %17:void = call %tint_store_and_preserve_padding, %16, mat2x3<f32>(vec3<f32>(0.0f))
    %19:ptr<storage, mat2x4<f32>, read_write> = access %sb, 14u
    store %19, mat2x4<f32>(vec4<f32>(0.0f))
    %20:ptr<storage, mat3x2<f32>, read_write> = access %sb, 15u
    store %20, mat3x2<f32>(vec2<f32>(0.0f))
    %21:ptr<storage, mat3x3<f32>, read_write> = access %sb, 16u
    %22:void = call %tint_store_and_preserve_padding_1, %21, mat3x3<f32>(vec3<f32>(0.0f))
    %24:ptr<storage, mat3x4<f32>, read_write> = access %sb, 17u
    store %24, mat3x4<f32>(vec4<f32>(0.0f))
    %25:ptr<storage, mat4x2<f32>, read_write> = access %sb, 18u
    store %25, mat4x2<f32>(vec2<f32>(0.0f))
    %26:ptr<storage, mat4x3<f32>, read_write> = access %sb, 19u
    %27:void = call %tint_store_and_preserve_padding_2, %26, mat4x3<f32>(vec3<f32>(0.0f))
    %29:ptr<storage, mat4x4<f32>, read_write> = access %sb, 20u
    store %29, mat4x4<f32>(vec4<f32>(0.0f))
    %30:ptr<storage, array<vec3<f32>, 2>, read_write> = access %sb, 21u
    %31:void = call %tint_store_and_preserve_padding_3, %30, array<vec3<f32>, 2>(vec3<f32>(0.0f))
    %33:ptr<storage, Inner, read_write> = access %sb, 22u
    store %33, Inner(0i, 0.0f)
    %34:ptr<storage, array<Inner, 4>, read_write> = access %sb, 23u
    store %34, array<Inner, 4>(Inner(0i, 0.0f))
    ret
  }
}
%tint_store_and_preserve_padding = func(%target:ptr<storage, mat2x3<f32>, read_write>, %value_param:mat2x3<f32>):void {
  $B3: {
    %37:ptr<storage, vec3<f32>, read_write> = access %target, 0u
    %38:vec3<f32> = access %value_param, 0u
    store %37, %38
    %39:ptr<storage, vec3<f32>, read_write> = access %target, 1u
    %40:vec3<f32> = access %value_param, 1u
    store %39, %40
    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: {
    %43:ptr<storage, vec3<f32>, read_write> = access %target_1, 0u
    %44:vec3<f32> = access %value_param_1, 0u
    store %43, %44
    %45:ptr<storage, vec3<f32>, read_write> = access %target_1, 1u
    %46:vec3<f32> = access %value_param_1, 1u
    store %45, %46
    %47:ptr<storage, vec3<f32>, read_write> = access %target_1, 2u
    %48:vec3<f32> = access %value_param_1, 2u
    store %47, %48
    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: {
    %51:ptr<storage, vec3<f32>, read_write> = access %target_2, 0u
    %52:vec3<f32> = access %value_param_2, 0u
    store %51, %52
    %53:ptr<storage, vec3<f32>, read_write> = access %target_2, 1u
    %54:vec3<f32> = access %value_param_2, 1u
    store %53, %54
    %55:ptr<storage, vec3<f32>, read_write> = access %target_2, 2u
    %56:vec3<f32> = access %value_param_2, 2u
    store %55, %56
    %57:ptr<storage, vec3<f32>, read_write> = access %target_2, 3u
    %58:vec3<f32> = access %value_param_2, 3u
    store %57, %58
    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:u32): {  # body
        %62:bool = gte %idx, 2u
        if %62 [t: $B10] {  # if_1
          $B10: {  # true
            exit_loop  # loop_1
          }
        }
        %63:ptr<storage, vec3<f32>, read_write> = access %target_3, %idx
        %64:vec3<f32> = access %value_param_3, %idx
        store %63, %64
        continue  # -> $B9
      }
      $B9: {  # continuing
        %65:u32 = add %idx, 1u
        next_iteration %65  # -> $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.  *
********************************************************************
