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

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

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

%main_1 = func():void {
  $B2: {
    %a:ptr<function, i32, read_write> = var
    %i:ptr<function, i32, read_write> = var
    %6:ptr<uniform, i32, read> = access %x_6, 0u, 1i, 0u
    %7:i32 = load %6
    %x_27:i32 = let %7
    store %a, %x_27
    %9:ptr<uniform, i32, read> = access %x_6, 0u, 3i, 0u
    %10:i32 = load %9
    %x_29:i32 = let %10
    %12:i32 = negation %x_29
    store %i, %12
    loop [b: $B3, c: $B4] {  # loop_1
      $B3: {  # body
        %13:i32 = load %i
        %x_35:i32 = let %13
        %15:i32 = add %x_35, 1i
        %x_36:i32 = let %15
        store %i, %x_36
        %17:ptr<uniform, i32, read> = access %x_6, 0u, 2i, 0u
        %18:i32 = load %17
        %x_39:i32 = let %18
        %20:i32 = reverseBits %x_36
        %21:bool = lte %20, %x_39
        if %21 [t: $B5, f: $B6] {  # if_1
          $B5: {  # true
            exit_if  # if_1
          }
          $B6: {  # false
            exit_loop  # loop_1
          }
        }
        %22:i32 = load %a
        %x_42:i32 = let %22
        %24:i32 = add %x_42, 1i
        store %a, %24
        continue  # -> $B4
      }
      $B4: {  # continuing
        next_iteration  # -> $B3
      }
    }
    %25:i32 = load %a
    %x_44:i32 = let %25
    %27:ptr<uniform, i32, read> = access %x_6, 0u, 0i, 0u
    %28:i32 = load %27
    %x_46:i32 = let %28
    %30:bool = eq %x_44, %x_46
    if %30 [t: $B7, f: $B8] {  # if_2
      $B7: {  # true
        %31:ptr<uniform, i32, read> = access %x_6, 0u, 2i, 0u
        %32:i32 = load %31
        %x_52:i32 = let %32
        %34:ptr<uniform, i32, read> = access %x_6, 0u, 1i, 0u
        %35:i32 = load %34
        %x_55:i32 = let %35
        %37:ptr<uniform, i32, read> = access %x_6, 0u, 1i, 0u
        %38:i32 = load %37
        %x_58:i32 = let %38
        %40:ptr<uniform, i32, read> = access %x_6, 0u, 2i, 0u
        %41:i32 = load %40
        %x_61:i32 = let %41
        %43:f32 = convert %x_52
        %44:f32 = let %43
        %45:f32 = convert %x_55
        %46:f32 = let %45
        %47:f32 = convert %x_58
        %48:f32 = let %47
        %49:f32 = convert %x_61
        %50:vec4<f32> = construct %44, %46, %48, %49
        store %x_GLF_color, %50
        exit_if  # if_2
      }
      $B8: {  # false
        %51:ptr<uniform, i32, read> = access %x_6, 0u, 1i, 0u
        %52:i32 = load %51
        %x_65:i32 = let %52
        %54:f32 = convert %x_65
        %x_66:f32 = let %54
        %56:vec4<f32> = construct %x_66, %x_66, %x_66, %x_66
        store %x_GLF_color, %56
        exit_if  # if_2
      }
    }
    ret
  }
}
%tint_symbol = @fragment func():main_out {
  $B9: {
    %58:void = call %main_1
    %59:vec4<f32> = load %x_GLF_color
    %60:main_out = construct %59
    ret %60
  }
}

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