SKIP: FAILED

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

Array = struct @align(4) {
  values:array<i32, 2> @offset(0)
}

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

$B1: {  # root
  %x_8: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_50:ptr<function, bool, read_write> = var, false
    %x_15:ptr<function, i32, read_write> = var
    %x_16:ptr<function, i32, read_write> = var
    %param:ptr<function, Array, read_write> = var
    %x_19:ptr<function, i32, read_write> = var
    %x_20_phi:ptr<function, i32, read_write> = var
    store %param, Array(array<i32, 2>(0i))
    store %x_50, false
    loop [b: $B3] {  # loop_1
      $B3: {  # body
        %x_19_phi:ptr<function, i32, read_write> = var
        %x_63_phi:ptr<function, bool, read_write> = var
        loop [b: $B4] {  # loop_2
          $B4: {  # body
            %12:ptr<uniform, i32, read> = access %x_8, 0u
            %13:i32 = load %12
            %x_17:i32 = let %13
            %15:ptr<function, i32, read_write> = access %param, 0u, %x_17
            %16:i32 = load %15
            %x_18:i32 = let %16
            %18:bool = eq %x_18, 1i
            if %18 [t: $B5] {  # if_1
              $B5: {  # true
                store %x_50, true
                store %x_15, 1i
                store %x_19_phi, 1i
                store %x_63_phi, true
                exit_loop  # loop_2
              }
            }
            store %x_19_phi, 0i
            store %x_63_phi, false
            exit_loop  # loop_2
          }
        }
        %19:i32 = load %x_19_phi
        store %x_19, %19
        %20:bool = load %x_63_phi
        %x_63:bool = let %20
        %22:i32 = load %x_19
        store %x_20_phi, %22
        if %x_63 [t: $B6] {  # if_2
          $B6: {  # true
            exit_loop  # loop_1
          }
        }
        store %x_50, true
        store %x_15, 1i
        store %x_20_phi, 1i
        exit_loop  # loop_1
      }
    }
    %23:i32 = load %x_20_phi
    %x_20:i32 = let %23
    store %x_16, %x_20
    %25:bool = eq %x_20, 1i
    if %25 [t: $B7, f: $B8] {  # if_3
      $B7: {  # true
        store %x_GLF_color, vec4<f32>(1.0f, 0.0f, 0.0f, 1.0f)
        exit_if  # if_3
      }
      $B8: {  # false
        store %x_GLF_color, vec4<f32>(0.0f)
        exit_if  # if_3
      }
    }
    ret
  }
}
%tint_symbol = @fragment func():main_out {
  $B9: {
    %27:void = call %main_1
    %28:vec4<f32> = load %x_GLF_color
    %29:main_out = construct %28
    ret %29
  }
}
%func_struct_Array_i1_2_1_ = func(%a:ptr<function, Array, read_write>):i32 {
  $B10: {
    %x_70:ptr<function, bool, read_write> = var, false
    %x_12:ptr<function, i32, read_write> = var
    %x_13:ptr<function, i32, read_write> = var
    %x_72_phi:ptr<function, bool, read_write> = var
    %x_14_phi:ptr<function, i32, read_write> = var
    store %x_72_phi, false
    loop [b: $B11] {  # loop_3
      $B11: {  # body
        %x_77:ptr<function, bool, read_write> = var
        %x_77_phi:ptr<function, bool, read_write> = var
        %x_13_phi:ptr<function, i32, read_write> = var
        %x_87_phi:ptr<function, bool, read_write> = var
        %41:bool = load %x_72_phi
        %x_72:bool = let %41
        store %x_77_phi, %x_72
        loop [b: $B12] {  # loop_4
          $B12: {  # body
            %43:bool = load %x_77_phi
            store %x_77, %43
            %44:ptr<uniform, i32, read> = access %x_8, 0u
            %45:i32 = load %44
            %x_10:i32 = let %45
            %47:ptr<function, i32, read_write> = access %a, 0u, %x_10
            %48:i32 = load %47
            %x_11:i32 = let %48
            %50:bool = eq %x_11, 1i
            if %50 [t: $B13] {  # if_4
              $B13: {  # true
                store %x_70, true
                store %x_12, 1i
                store %x_13_phi, 1i
                store %x_87_phi, true
                exit_loop  # loop_4
              }
            }
            store %x_13_phi, 0i
            %51:bool = load %x_77
            store %x_87_phi, %51
            exit_loop  # loop_4
          }
        }
        %52:i32 = load %x_13_phi
        store %x_13, %52
        %53:bool = load %x_87_phi
        %x_87:bool = let %53
        %55:i32 = load %x_13
        store %x_14_phi, %55
        if %x_87 [t: $B14] {  # if_5
          $B14: {  # true
            exit_loop  # loop_3
          }
        }
        store %x_70, true
        store %x_12, 1i
        store %x_14_phi, 1i
        exit_loop  # loop_3
      }
    }
    %56:i32 = load %x_14_phi
    %x_14:i32 = let %56
    ret %x_14
  }
}

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