SKIP: FAILED

../../src/tint/lang/msl/writer/printer/printer.cc:500 internal compiler error: buf0 = struct @align(4) {
  one:f32 @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_5:ptr<uniform, buf0, read> = var @binding_point(0, 0)
}

%main_1 = func():void {
  $B2: {
    %x_30:ptr<function, bool, read_write> = var
    %x_31_phi:ptr<function, bool, read_write> = var
    store %x_GLF_color, vec4<f32>(0.0f)
    %6:ptr<uniform, f32, read> = access %x_5, 0u
    %7:f32 = load %6
    %x_23:f32 = let %7
    %9:bool = lt %x_23, 0.0f
    %x_24:bool = let %9
    store %x_31_phi, %x_24
    %11:bool = eq %x_24, false
    if %11 [t: $B3] {  # if_1
      $B3: {  # true
        %12:ptr<uniform, f32, read> = access %x_5, 0u
        %13:f32 = load %12
        %x_29:f32 = let %13
        %15:bool = lt %x_29, 1.0f
        store %x_30, %15
        %16:bool = load %x_30
        store %x_31_phi, %16
        exit_if  # if_1
      }
    }
    %17:bool = load %x_31_phi
    %x_31:bool = let %17
    if %x_31 [t: $B4] {  # if_2
      $B4: {  # true
        ret
      }
    }
    %19:ptr<uniform, f32, read> = access %x_5, 0u
    %20:f32 = load %19
    %x_35:f32 = let %20
    %22:bool = lt %x_35, 0.0f
    if %22 [t: $B5, f: $B6] {  # if_3
      $B5: {  # true
        loop [b: $B7] {  # loop_1
          $B7: {  # body
            %23:ptr<uniform, f32, read> = access %x_5, 0u
            %24:f32 = load %23
            %x_45:f32 = let %24
            %26:bool = lt %x_45, 0.0f
            if %26 [t: $B8, f: $B9] {  # if_4
              $B8: {  # true
                exit_if  # if_4
              }
              $B9: {  # false
                exit_loop  # loop_1
              }
            }
            store %x_GLF_color, vec4<f32>(1.0f)
            exit_loop  # loop_1
          }
        }
        exit_if  # if_3
      }
      $B6: {  # false
        store %x_GLF_color, vec4<f32>(1.0f, 0.0f, 0.0f, 1.0f)
        exit_if  # if_3
      }
    }
    ret
  }
}
%tint_symbol = @fragment func():main_out {
  $B10: {
    %28:void = call %main_1
    %29:vec4<f32> = load %x_GLF_color
    %30:main_out = construct %29
    ret %30
  }
}

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