SKIP: FAILED

<dawn>/src/tint/lang/msl/writer/printer/printer.cc:355 internal compiler error: strided_arr = struct @align(4) {
  el:f32 @offset(0)
}

buf0 = struct @align(4) {
  x_GLF_uniform_float_values:array<strided_arr, 1> @offset(0)
}

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

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

%main_1 = func():void -> %b2 {
  %b2 = block {
    %v1:ptr<function, vec2<f32>, read_write> = var
    %b:ptr<function, vec2<f32>, read_write> = var
    %a:ptr<function, f32, read_write> = var
    %x_51:ptr<function, bool, read_write> = var
    %x_52_phi:ptr<function, bool, read_write> = var
    %9:ptr<uniform, f32, read> = access %x_6, 0u, 0i, 0u
    %x_30:f32 = load %9
    %11:vec2<f32> = construct %x_30, %x_30
    store %v1, %11
    %x_32:vec2<f32> = load %v1
    %13:vec2<f32> = fract %x_32
    store %b, %13
    %x_34:vec2<f32> = load %b
    %15:vec2<f32> = smoothstep vec2<f32>(1.0f), vec2<f32>(1.0f), %x_34
    %16:f32 = access %15, 0u
    store %a, %16
    %17:ptr<uniform, f32, read> = access %x_6, 0u, 0i, 0u
    %x_38:f32 = load %17
    %x_39:f32 = load %a
    %x_40:f32 = load %a
    %21:ptr<uniform, f32, read> = access %x_6, 0u, 0i, 0u
    %x_42:f32 = load %21
    %23:vec4<f32> = construct %x_38, %x_39, %x_40, %x_42
    store %x_GLF_color, %23
    %x_45:f32 = load_vector_element %b, 0u
    %x_46:bool = lt %x_45, 1.0f
    store %x_52_phi, %x_46
    if %x_46 [t: %b3] {  # if_1
      %b3 = block {  # true
        %x_50:f32 = load_vector_element %b, 1u
        %27:bool = lt %x_50, 1.0f
        store %x_51, %27
        %28:bool = load %x_51
        store %x_52_phi, %28
        exit_if  # if_1
      }
    }
    %x_52:bool = load %x_52_phi
    if %x_52 [t: %b4, f: %b5] {  # if_2
      %b4 = block {  # true
        %30:ptr<uniform, f32, read> = access %x_6, 0u, 0i, 0u
        %x_57:f32 = load %30
        %x_59:f32 = load_vector_element %b, 0u
        %x_61:f32 = load_vector_element %b, 1u
        %34:ptr<uniform, f32, read> = access %x_6, 0u, 0i, 0u
        %x_63:f32 = load %34
        %36:vec4<f32> = construct %x_57, %x_59, %x_61, %x_63
        store %x_GLF_color, %36
        exit_if  # if_2
      }
      %b5 = block {  # false
        %37:ptr<uniform, f32, read> = access %x_6, 0u, 0i, 0u
        %x_66:f32 = load %37
        %39:vec4<f32> = construct %x_66, %x_66, %x_66, %x_66
        store %x_GLF_color, %39
        exit_if  # if_2
      }
    }
    ret
  }
}
%tint_symbol = @fragment func():main_out -> %b6 {
  %b6 = block {
    %41:void = call %main_1
    %42:vec4<f32> = load %x_GLF_color
    %43:main_out = construct %42
    ret %43
  }
}

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