SKIP: FAILED

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

S = struct @align(4) {
  x:i32 @offset(0)
  y:i32 @offset(4)
}

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

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

%func_struct_S_i1_i11_ = func(%arg:ptr<function, S, read_write>):void {
  $B2: {
    %5:ptr<function, i32, read_write> = access %arg, 1u
    store %5, 1i
    ret
  }
}
%main_1 = func():void {
  $B3: {
    %a:ptr<function, f32, read_write> = var
    %b:ptr<function, array<S, 2>, read_write> = var
    %param:ptr<function, S, read_write> = var
    store %a, 5.0f
    loop [b: $B4, c: $B5] {  # loop_1
      $B4: {  # body
        %10:ptr<uniform, i32, read> = access %x_10, 0u
        %11:i32 = load %10
        %x_43:i32 = let %11
        %13:ptr<function, i32, read_write> = access %b, %x_43, 0u
        store %13, 1i
        %14:ptr<function, i32, read_write> = access %b, 1i, 0u
        %15:i32 = load %14
        %x_46:i32 = let %15
        %17:bool = eq %x_46, 1i
        if %17 [t: $B6] {  # if_1
          $B6: {  # true
            %18:ptr<uniform, i32, read> = access %x_10, 0u
            %19:i32 = load %18
            %x_51:i32 = let %19
            %21:bool = eq %x_51, 1i
            if %21 [t: $B7] {  # if_2
              $B7: {  # true
                exit_loop  # loop_1
              }
            }
            %22:ptr<function, S, read_write> = access %b, 1i
            %23:S = load %22
            %x_56:S = let %23
            store %param, %x_56
            %25:void = call %func_struct_S_i1_i11_, %param
            %26:S = load %param
            %x_58:S = let %26
            %28:ptr<function, S, read_write> = access %b, 1i
            store %28, %x_58
            %29:ptr<function, i32, read_write> = access %b, 1i, 1u
            %30:i32 = load %29
            %x_61:i32 = let %30
            %32:f32 = convert %x_61
            store %a, %32
            exit_if  # if_1
          }
        }
        store %a, 0.0f
        continue  # -> $B5
      }
      $B5: {  # continuing
        break_if true  # -> [t: exit_loop loop_1, f: $B4]
      }
    }
    %33:f32 = load %a
    %x_63:f32 = let %33
    %35:bool = eq %x_63, 5.0f
    if %35 [t: $B8, f: $B9] {  # if_3
      $B8: {  # true
        store %x_GLF_color, vec4<f32>(1.0f, 0.0f, 0.0f, 1.0f)
        exit_if  # if_3
      }
      $B9: {  # false
        store %x_GLF_color, vec4<f32>(0.0f)
        exit_if  # if_3
      }
    }
    ret
  }
}
%tint_symbol = @fragment func():main_out {
  $B10: {
    %37:void = call %main_1
    %38:vec4<f32> = load %x_GLF_color
    %39:main_out = construct %38
    ret %39
  }
}

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