SKIP: FAILED

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

buf0 = struct @align(4) {
  x_GLF_uniform_int_values:array<strided_arr, 3> @offset(0)
}

buf2 = struct @align(8) {
  injectionSwitch:vec2<f32> @offset(0)
}

strided_arr_1 = struct @align(4) {
  el:f32 @offset(0)
}

buf1 = struct @align(4) {
  x_GLF_uniform_float_values:array<strided_arr_1, 1> @offset(0)
}

main_out = struct @align(16) {
  x_GLF_color_1:vec4<f32> @offset(0), @location(0)
}

$B1: {  # root
  %x_GLF_color:ptr<private, vec4<f32>, read_write> = var
  %x_6:ptr<uniform, buf0, read> = var @binding_point(0, 0)
  %x_9:ptr<uniform, buf2, read> = var @binding_point(0, 2)
  %x_11:ptr<uniform, buf1, read> = var @binding_point(0, 1)
  %continue_execution:ptr<private, bool, read_write> = var, true
}

%main_1 = func():void {
  $B2: {
    %a:ptr<function, i32, read_write> = var
    %i:ptr<function, i32, read_write> = var
    store %a, 1i
    %9:ptr<uniform, i32, read> = access %x_6, 0u, 0i, 0u
    %10:i32 = load %9
    %11:f32 = convert %10
    %12:f32 = let %11
    %13:ptr<uniform, i32, read> = access %x_6, 0u, 1i, 0u
    %14:i32 = load %13
    %15:f32 = convert %14
    %16:f32 = let %15
    %17:ptr<uniform, i32, read> = access %x_6, 0u, 1i, 0u
    %18:i32 = load %17
    %19:f32 = convert %18
    %20:f32 = let %19
    %21:ptr<uniform, i32, read> = access %x_6, 0u, 0i, 0u
    %22:i32 = load %21
    %23:f32 = convert %22
    %24:vec4<f32> = construct %12, %16, %20, %23
    store %x_GLF_color, %24
    %25:ptr<uniform, i32, read> = access %x_6, 0u, 1i, 0u
    %26:i32 = load %25
    store %i, %26
    loop [b: $B3, c: $B4] {  # loop_1
      $B3: {  # body
        %27:i32 = load %i
        %28:ptr<uniform, i32, read> = access %x_6, 0u, 2i, 0u
        %29:i32 = load %28
        %30:bool = lt %27, %29
        if %30 [t: $B5, f: $B6] {  # if_1
          $B5: {  # true
            exit_if  # if_1
          }
          $B6: {  # false
            exit_loop  # loop_1
          }
        }
        %31:i32 = load %a
        %x_61:i32 = let %31
        %33:i32 = load %a
        %34:i32 = add %33, 1i
        store %a, %34
        %35:bool = gt %x_61, 3i
        if %35 [t: $B7] {  # if_2
          $B7: {  # true
            exit_loop  # loop_1
          }
        }
        %36:ptr<uniform, vec2<f32>, read> = access %x_9, 0u
        %37:f32 = load_vector_element %36, 0u
        %38:ptr<uniform, f32, read> = access %x_11, 0u, 0i, 0u
        %39:f32 = load %38
        %40:bool = gt %37, %39
        if %40 [t: $B8] {  # if_3
          $B8: {  # true
            store %continue_execution, false
            exit_if  # if_3
          }
        }
        continue  # -> $B4
      }
      $B4: {  # continuing
        %41:i32 = load %i
        %42:i32 = add %41, 1i
        store %i, %42
        next_iteration  # -> $B3
      }
    }
    ret
  }
}
%tint_symbol = @fragment func():main_out {
  $B9: {
    %44:void = call %main_1
    %45:vec4<f32> = load %x_GLF_color
    %46:main_out = construct %45
    %47:bool = load %continue_execution
    %48:bool = eq %47, false
    if %48 [t: $B10] {  # if_4
      $B10: {  # true
        terminate_invocation
      }
    }
    ret %46
  }
}

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.  *
********************************************************************
