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_52:ptr<function, bool, read_write> = var, false
    %x_17:ptr<function, i32, read_write> = var
    %x_18:ptr<function, i32, read_write> = var
    %x_16:ptr<function, array<i32, 2>, read_write> = var
    %param:ptr<function, Array, read_write> = var
    %x_20:ptr<function, i32, read_write> = var
    %x_21_phi:ptr<function, i32, read_write> = var
    %11:ptr<uniform, i32, read> = access %x_8, 0u
    %12:i32 = load %11
    %x_12:i32 = let %12
    %14:array<i32, 2> = load %x_16
    %x_22:array<i32, 2> = let %14
    %x_23_1:ptr<function, array<i32, 2>, read_write> = var, %x_22
    %17:ptr<function, i32, read_write> = access %x_23_1, 0u
    store %17, %x_12
    %18:array<i32, 2> = load %x_23_1
    %x_23:array<i32, 2> = let %18
    store %x_16, %x_23
    %20:array<i32, 2> = load %x_16
    %x_54:array<i32, 2> = let %20
    %22:Array = construct %x_54
    store %param, %22
    store %x_52, false
    loop [b: $B3] {  # loop_1
      $B3: {  # body
        %x_20_phi:ptr<function, i32, read_write> = var
        %x_67_phi:ptr<function, bool, read_write> = var
        loop [b: $B4] {  # loop_2
          $B4: {  # body
            %25:ptr<function, i32, read_write> = access %param, 0u, %x_12
            %26:i32 = load %25
            %x_19:i32 = let %26
            %28:bool = eq %x_19, 0i
            if %28 [t: $B5] {  # if_1
              $B5: {  # true
                store %x_52, true
                store %x_17, 42i
                store %x_20_phi, 42i
                store %x_67_phi, true
                exit_loop  # loop_2
              }
            }
            store %x_20_phi, 0i
            store %x_67_phi, false
            exit_loop  # loop_2
          }
        }
        %29:i32 = load %x_20_phi
        store %x_20, %29
        %30:bool = load %x_67_phi
        %x_67:bool = let %30
        %32:i32 = load %x_20
        store %x_21_phi, %32
        if %x_67 [t: $B6] {  # if_2
          $B6: {  # true
            exit_loop  # loop_1
          }
        }
        store %x_52, true
        store %x_17, 42i
        store %x_21_phi, 42i
        exit_loop  # loop_1
      }
    }
    %33:i32 = load %x_21_phi
    %x_21:i32 = let %33
    store %x_18, %x_21
    %35:bool = eq %x_21, 42i
    if %35 [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: {
    %37:void = call %main_1
    %38:vec4<f32> = load %x_GLF_color
    %39:main_out = construct %38
    ret %39
  }
}
%func_struct_Array_i1_2_1_ = func(%a:ptr<function, Array, read_write>):i32 {
  $B10: {
    %x_74:ptr<function, bool, read_write> = var, false
    %x_13:ptr<function, i32, read_write> = var
    %x_14:ptr<function, i32, read_write> = var
    %x_76_phi:ptr<function, bool, read_write> = var
    %x_15_phi:ptr<function, i32, read_write> = var
    store %x_76_phi, false
    loop [b: $B11] {  # loop_3
      $B11: {  # body
        %x_81:ptr<function, bool, read_write> = var
        %x_81_phi:ptr<function, bool, read_write> = var
        %x_14_phi:ptr<function, i32, read_write> = var
        %x_91_phi:ptr<function, bool, read_write> = var
        %51:bool = load %x_76_phi
        %x_76:bool = let %51
        store %x_81_phi, %x_76
        loop [b: $B12] {  # loop_4
          $B12: {  # body
            %53:bool = load %x_81_phi
            store %x_81, %53
            %54:ptr<uniform, i32, read> = access %x_8, 0u
            %55:i32 = load %54
            %x_10:i32 = let %55
            %57:ptr<function, i32, read_write> = access %a, 0u, %x_10
            %58:i32 = load %57
            %x_11:i32 = let %58
            %60:bool = eq %x_11, 0i
            if %60 [t: $B13] {  # if_4
              $B13: {  # true
                store %x_74, true
                store %x_13, 42i
                store %x_14_phi, 42i
                store %x_91_phi, true
                exit_loop  # loop_4
              }
            }
            store %x_14_phi, 0i
            %61:bool = load %x_81
            store %x_91_phi, %61
            exit_loop  # loop_4
          }
        }
        %62:i32 = load %x_14_phi
        store %x_14, %62
        %63:bool = load %x_91_phi
        %x_91:bool = let %63
        %65:i32 = load %x_14
        store %x_15_phi, %65
        if %x_91 [t: $B14] {  # if_5
          $B14: {  # true
            exit_loop  # loop_3
          }
        }
        store %x_74, true
        store %x_13, 42i
        store %x_15_phi, 42i
        exit_loop  # loop_3
      }
    }
    %66:i32 = load %x_15_phi
    %x_15:i32 = let %66
    ret %x_15
  }
}

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