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, 2> @offset(0)
}

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

$B1: {  # root
  %x_5:ptr<uniform, buf0, read> = var @binding_point(0, 0)
  %x_GLF_color:ptr<private, vec4<f32>, read_write> = var
}

%main_1 = func():void {
  $B2: {
    %x_23:ptr<function, i32, read_write> = var
    %x_27:ptr<function, i32, read_write> = var
    %x_37:ptr<function, i32, read_write> = var
    %x_45:ptr<function, i32, read_write> = var
    store %x_23, 0i
    loop [b: $B3, c: $B4] {  # loop_1
      $B3: {  # body
        %x_24:ptr<function, i32, read_write> = var
        %9:ptr<uniform, i32, read> = access %x_5, 0u, 1i, 0u
        %10:i32 = load %9
        store %x_27, %10
        %11:i32 = load %x_23
        %12:i32 = load %x_27
        %13:i32 = sub 100i, %12
        %14:bool = lt %11, %13
        if %14 [t: $B5, f: $B6] {  # if_1
          $B5: {  # true
            exit_if  # if_1
          }
          $B6: {  # false
            exit_loop  # loop_1
          }
        }
        continue  # -> $B4
      }
      $B4: {  # continuing
        %15:i32 = load %x_23
        %16:i32 = add %15, 1i
        store %x_24, %16
        %17:i32 = load %x_24
        store %x_23, %17
        next_iteration  # -> $B3
      }
    }
    %x_40:ptr<function, i32, read_write> = var
    %19:ptr<uniform, i32, read> = access %x_5, 0u, 0i, 0u
    %20:i32 = load %19
    %x_32:i32 = let %20
    store %x_45, 1i
    %22:bool = eq %x_32, 0i
    if %22 [t: $B7] {  # if_2
      $B7: {  # true
        store %x_37, 1i
        %23:i32 = load %x_23
        store %x_40, %23
        loop [b: $B8, c: $B9] {  # loop_2
          $B8: {  # body
            %x_41:ptr<function, i32, read_write> = var
            %x_38:ptr<function, i32, read_write> = var
            %26:i32 = load %x_40
            %27:bool = lt %26, 100i
            if %27 [t: $B10, f: $B11] {  # if_3
              $B10: {  # true
                exit_if  # if_3
              }
              $B11: {  # false
                exit_loop  # loop_2
              }
            }
            continue  # -> $B9
          }
          $B9: {  # continuing
            %28:i32 = load %x_40
            %29:i32 = add %28, 1i
            store %x_41, %29
            %30:i32 = load %x_37
            %31:i32 = load %x_37
            %32:i32 = sub 1i, %31
            %33:i32 = mul %30, %32
            store %x_38, %33
            %34:i32 = load %x_38
            store %x_37, %34
            %35:i32 = load %x_41
            store %x_40, %35
            next_iteration  # -> $B8
          }
        }
        %36:i32 = load %x_37
        store %x_45, %36
        exit_if  # if_2
      }
    }
    %37:i32 = load %x_45
    %38:bool = eq %37, %x_32
    if %38 [t: $B12, f: $B13] {  # if_4
      $B12: {  # true
        %39:i32 = load %x_27
        %40:f32 = convert %39
        %x_50:f32 = let %40
        %42:f32 = convert %x_32
        %x_51:f32 = let %42
        %44:vec4<f32> = construct %x_50, %x_51, %x_51, %x_50
        store %x_GLF_color, %44
        exit_if  # if_4
      }
      $B13: {  # false
        %45:f32 = convert %x_32
        %46:vec4<f32> = construct %45
        store %x_GLF_color, %46
        exit_if  # if_4
      }
    }
    ret
  }
}
%tint_symbol = @fragment func():main_out {
  $B14: {
    %48:void = call %main_1
    %49:vec4<f32> = load %x_GLF_color
    %50:main_out = construct %49
    ret %50
  }
}

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