SKIP: FAILED

../../src/tint/lang/msl/writer/printer/printer.cc:500 internal compiler error: buf0 = struct @align(4) {
  zero:i32 @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_10:ptr<function, array<i32, 1>, read_write> = var
    %x_9:ptr<function, array<i32, 1>, read_write> = var
    %x_7:ptr<function, i32, read_write> = var
    %x_11:ptr<function, i32, read_write> = var
    %8:ptr<function, i32, read_write> = access %x_9, 0i
    %9:ptr<uniform, i32, read> = access %x_5, 0u
    %10:i32 = load %9
    store %8, %10
    %11:array<i32, 1> = load %x_9
    store %x_10, %11
    %12:ptr<function, i32, read_write> = access %x_9, 0i
    %13:i32 = load %12
    store %x_7, %13
    switch 0u [c: (default, $B3)] {  # switch_1
      $B3: {  # case
        store %x_GLF_color, vec4<f32>(0.0f)
        %14:ptr<function, i32, read_write> = access %x_10, 0i
        %15:i32 = load %14
        %16:i32 = load %x_7
        %17:bool = eq %15, %16
        if %17 [t: $B4] {  # if_1
          $B4: {  # true
            store %x_11, 1i
            exit_switch  # switch_1
          }
        }
        store %x_11, 2i
        exit_switch  # switch_1
      }
    }
    %18:i32 = load %x_11
    %19:bool = eq %18, 1i
    if %19 [t: $B5, f: $B6] {  # if_2
      $B5: {  # true
        store %x_GLF_color, vec4<f32>(1.0f, 0.0f, 0.0f, 1.0f)
        exit_if  # if_2
      }
      $B6: {  # false
        store %x_GLF_color, vec4<f32>(0.0f)
        exit_if  # if_2
      }
    }
    ret
  }
}
%tint_symbol = @fragment func():main_out {
  $B7: {
    %21:void = call %main_1
    %22:vec4<f32> = load %x_GLF_color
    %23:main_out = construct %22
    ret %23
  }
}

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