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: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
    store %x_16, %18
    %19:array<i32, 2> = load %x_16
    %20:Array = construct %19
    store %param, %20
    store %x_52, false
    loop [b: $B3] {  # loop_1
      $B3: {  # body
        %x_67:ptr<function, bool, read_write> = var
        loop [b: $B4] {  # loop_2
          $B4: {  # body
            %22:ptr<function, i32, read_write> = access %param, 0u, %x_12
            %23:i32 = load %22
            %24:bool = eq %23, 0i
            if %24 [t: $B5] {  # if_1
              $B5: {  # true
                store %x_52, true
                store %x_17, 42i
                store %x_20, 42i
                store %x_67, true
                exit_loop  # loop_2
              }
            }
            store %x_20, 0i
            store %x_67, false
            exit_loop  # loop_2
          }
        }
        %25:i32 = load %x_20
        store %x_21, %25
        %26:bool = load %x_67
        if %26 [t: $B6] {  # if_2
          $B6: {  # true
            exit_loop  # loop_1
          }
        }
        store %x_52, true
        store %x_17, 42i
        store %x_21, 42i
        exit_loop  # loop_1
      }
    }
    %27:i32 = load %x_21
    store %x_18, %27
    %28:i32 = load %x_21
    %29:bool = eq %28, 42i
    if %29 [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: {
    %31:void = call %main_1
    %32:vec4<f32> = load %x_GLF_color
    %33:main_out = construct %32
    ret %33
  }
}
%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_76:ptr<function, bool, read_write> = var
    %x_14:ptr<function, i32, read_write> = var
    %x_15:ptr<function, i32, read_write> = var
    store %x_76, false
    loop [b: $B11] {  # loop_3
      $B11: {  # body
        %x_81:ptr<function, bool, read_write> = var
        %x_91:ptr<function, bool, read_write> = var
        %43:bool = load %x_76
        store %x_81, %43
        loop [b: $B12] {  # loop_4
          $B12: {  # body
            %44:ptr<uniform, i32, read> = access %x_8, 0u
            %45:i32 = load %44
            %46:ptr<function, i32, read_write> = access %a, 0u, %45
            %47:i32 = load %46
            %48:bool = eq %47, 0i
            if %48 [t: $B13] {  # if_4
              $B13: {  # true
                store %x_74, true
                store %x_13, 42i
                store %x_14, 42i
                store %x_91, true
                exit_loop  # loop_4
              }
            }
            store %x_14, 0i
            %49:bool = load %x_81
            store %x_91, %49
            exit_loop  # loop_4
          }
        }
        %50:i32 = load %x_14
        store %x_15, %50
        %51:bool = load %x_91
        if %51 [t: $B14] {  # if_5
          $B14: {  # true
            exit_loop  # loop_3
          }
        }
        store %x_74, true
        store %x_13, 42i
        store %x_15, 42i
        exit_loop  # loop_3
      }
    }
    %52:i32 = load %x_15
    ret %52
  }
}

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