SKIP: FAILED

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

BinarySearchObject = struct @align(4) {
  prime_numbers:array<i32, 10> @offset(0)
}

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

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

%binarySearch_struct_BinarySearchObject_i1_10_1_ = func(%obj:ptr<function, BinarySearchObject, read_write>):i32 -> %b2 {
  %b2 = block {
    %m:ptr<function, i32, read_write> = var
    loop [b: %b3, c: %b4] {  # loop_1
      %b3 = block {  # body
        %6:ptr<uniform, vec2<f32>, read> = access %x_8, 0u
        %x_91:f32 = load_vector_element %6, 0u
        %8:bool = gt %x_91, 1.0f
        if %8 [t: %b5, f: %b6] {  # if_1
          %b5 = block {  # true
            exit_if  # if_1
          }
          %b6 = block {  # false
            exit_loop  # loop_1
          }
        }
        %9:ptr<uniform, vec2<f32>, read> = access %x_8, 0u
        %x_95:f32 = load_vector_element %9, 0u
        %11:i32 = convert %x_95
        store %m, %11
        %x_14:i32 = load %m
        %13:ptr<function, i32, read_write> = access %obj, 0u, %x_14
        %x_15:i32 = load %13
        %15:bool = eq %x_15, 1i
        if %15 [t: %b7] {  # if_2
          %b7 = block {  # true
            ret 1i
          }
        }
        continue %b4
      }
      %b4 = block {  # continuing
        next_iteration %b3
      }
    }
    ret 1i
  }
}
%main_1 = func():void -> %b8 {
  %b8 = block {
    %i:ptr<function, i32, read_write> = var
    %obj_1:ptr<function, BinarySearchObject, read_write> = var
    %param:ptr<function, BinarySearchObject, read_write> = var
    store %i, 0i
    loop [b: %b9, c: %b10] {  # loop_2
      %b9 = block {  # body
        %x_16:i32 = load %i
        %21:bool = lt %x_16, 10i
        if %21 [t: %b11, f: %b12] {  # if_3
          %b11 = block {  # true
            exit_if  # if_3
          }
          %b12 = block {  # false
            exit_loop  # loop_2
          }
        }
        %x_17:i32 = load %i
        %23:bool = neq %x_17, 3i
        if %23 [t: %b13] {  # if_4
          %b13 = block {  # true
            %x_18:i32 = load %i
            %25:ptr<uniform, vec2<f32>, read> = access %x_8, 0u
            %x_67:f32 = load_vector_element %25, 0u
            %27:i32 = convert %x_67
            %28:i32 = sub %x_18, %27
            %29:bool = eq %28, 4i
            if %29 [t: %b14, f: %b15] {  # if_5
              %b14 = block {  # true
                %x_21:i32 = load %i
                %31:ptr<function, i32, read_write> = access %obj_1, 0u, %x_21
                store %31, 11i
                exit_if  # if_5
              }
              %b15 = block {  # false
                %x_22:i32 = load %i
                %33:bool = eq %x_22, 6i
                if %33 [t: %b16] {  # if_6
                  %b16 = block {  # true
                    %x_23:i32 = load %i
                    %35:ptr<function, i32, read_write> = access %obj_1, 0u, %x_23
                    store %35, 17i
                    exit_if  # if_6
                  }
                }
                continue %b10
              }
            }
            exit_if  # if_4
          }
        }
        loop [b: %b17, c: %b18] {  # loop_3
          %b17 = block {  # body
            continue %b18
          }
          %b18 = block {  # continuing
            %36:ptr<uniform, vec2<f32>, read> = access %x_8, 0u
            %x_82:f32 = load_vector_element %36, 1u
            %38:bool = gt 0.0f, %x_82
            %39:bool = eq %38, false
            break_if %39 %b17
          }
        }
        continue %b10
      }
      %b10 = block {  # continuing
        %x_24:i32 = load %i
        %41:i32 = add %x_24, 1i
        store %i, %41
        next_iteration %b9
      }
    }
    %x_84:BinarySearchObject = load %obj_1
    store %param, %x_84
    %x_26:i32 = call %binarySearch_struct_BinarySearchObject_i1_10_1_, %param
    store %x_GLF_color, vec4<f32>(1.0f, 0.0f, 0.0f, 1.0f)
    ret
  }
}
%tint_symbol = @fragment func():main_out -> %b19 {
  %b19 = block {
    %45:void = call %main_1
    %46:vec4<f32> = load %x_GLF_color
    %47:main_out = construct %46
    ret %47
  }
}

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