SKIP: FAILED

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

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

buf2 = struct @align(4) {
  zero:f32 @offset(0)
}

strided_arr_1 = struct @align(4) {
  el:i32 @offset(0)
}

buf0 = struct @align(4) {
  x_GLF_uniform_int_values:array<strided_arr_1, 2> @offset(0)
}

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

%b1 = block {  # root
  %x_GLF_color:ptr<private, vec4<f32>, read_write> = var
  %x_5:ptr<uniform, buf1, read> = var @binding_point(0, 1)
  %x_7:ptr<uniform, buf2, read> = var @binding_point(0, 2)
  %x_10:ptr<uniform, buf0, read> = var @binding_point(0, 0)
}

%main_1 = func():void -> %b2 {
  %b2 = block {
    %i:ptr<function, i32, read_write> = var
    %7:ptr<uniform, f32, read> = access %x_5, 0u, 0i, 0u
    %8:f32 = load %7
    %9:vec4<f32> = construct %8
    store %x_GLF_color, %9
    %10:ptr<uniform, f32, read> = access %x_7, 0u
    %11:f32 = load %10
    %12:ptr<uniform, f32, read> = access %x_5, 0u, 0i, 0u
    %13:f32 = load %12
    %14:bool = gt %11, %13
    if %14 [t: %b3, f: %b4] {  # if_1
      %b3 = block {  # true
        loop [b: %b5, c: %b6] {  # loop_1
          %b5 = block {  # body
            %15:ptr<uniform, f32, read> = access %x_5, 0u, 1i, 0u
            %16:f32 = load %15
            %17:vec4<f32> = construct %16
            store %x_GLF_color, %17
            continue %b6
          }
          %b6 = block {  # continuing
            break_if false %b5
          }
        }
        exit_if  # if_1
      }
      %b4 = block {  # false
        loop [b: %b7, c: %b8] {  # loop_2
          %b7 = block {  # body
            loop [b: %b9, c: %b10] {  # loop_3
              %b9 = block {  # body
                if true [t: %b11, f: %b12] {  # if_2
                  %b11 = block {  # true
                    exit_if  # if_2
                  }
                  %b12 = block {  # false
                    exit_loop  # loop_3
                  }
                }
                %18:ptr<uniform, i32, read> = access %x_10, 0u, 1i, 0u
                %19:i32 = load %18
                store %i, %19
                loop [b: %b13, c: %b14] {  # loop_4
                  %b13 = block {  # body
                    %20:i32 = load %i
                    %21:ptr<uniform, i32, read> = access %x_10, 0u, 0i, 0u
                    %22:i32 = load %21
                    %23:bool = lt %20, %22
                    if %23 [t: %b15, f: %b16] {  # if_3
                      %b15 = block {  # true
                        exit_if  # if_3
                      }
                      %b16 = block {  # false
                        exit_loop  # loop_4
                      }
                    }
                    %24:ptr<uniform, f32, read> = access %x_5, 0u, 1i, 0u
                    %25:f32 = load %24
                    %26:ptr<uniform, f32, read> = access %x_5, 0u, 0i, 0u
                    %27:f32 = load %26
                    %28:ptr<uniform, f32, read> = access %x_5, 0u, 0i, 0u
                    %29:f32 = load %28
                    %30:ptr<uniform, f32, read> = access %x_5, 0u, 1i, 0u
                    %31:f32 = load %30
                    %32:vec4<f32> = construct %25, %27, %29, %31
                    store %x_GLF_color, %32
                    continue %b14
                  }
                  %b14 = block {  # continuing
                    %33:i32 = load %i
                    %34:i32 = add %33, 1i
                    store %i, %34
                    next_iteration %b13
                  }
                }
                exit_loop  # loop_3
              }
              %b10 = block {  # continuing
                next_iteration %b9
              }
            }
            continue %b8
          }
          %b8 = block {  # continuing
            %35:ptr<uniform, f32, read> = access %x_7, 0u
            %x_82:f32 = load %35
            %37:ptr<uniform, f32, read> = access %x_5, 0u, 0i, 0u
            %x_84:f32 = load %37
            %39:bool = gt %x_82, %x_84
            %40:bool = eq %39, false
            break_if %40 %b7
          }
        }
        exit_if  # if_1
      }
    }
    ret
  }
}
%tint_symbol = @fragment func():main_out -> %b17 {
  %b17 = block {
    %42:void = call %main_1
    %43:vec4<f32> = load %x_GLF_color
    %44:main_out = construct %43
    ret %44
  }
}

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