SKIP: FAILED

../../src/tint/lang/msl/writer/printer/printer.cc:1257 internal compiler error: 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
  %gl_FragCoord:ptr<private, vec4<f32>, read_write> = var
  %continue_execution:ptr<private, bool, read_write> = var, true
}

%main_1 = func():void {
  $B2: {
    %ll:ptr<function, i32, read_write> = var
    store %x_GLF_color, vec4<f32>(1.0f, 0.0f, 0.0f, 1.0f)
    %6:f32 = load_vector_element %gl_FragCoord, 0u
    %x_30:f32 = let %6
    %8:i32 = call %tint_f32_to_i32, %x_30
    %10:bool = lt %8, 2000i
    if %10 [t: $B3, f: $B4] {  # if_1
      $B3: {  # true
        exit_if  # if_1
      }
      $B4: {  # false
        store %ll, 0i
        loop [b: $B5, c: $B6] {  # loop_1
          $B5: {  # body
            %11:f32 = load_vector_element %gl_FragCoord, 0u
            %x_41:f32 = let %11
            %13:bool = lt %x_41, 0.0f
            if %13 [t: $B7] {  # if_2
              $B7: {  # true
                store %continue_execution, false
                exit_if  # if_2
              }
            }
            %14:i32 = load %ll
            %x_6:i32 = let %14
            %16:bool = gte %x_6, 5i
            if %16 [t: $B8] {  # if_3
              $B8: {  # true
                exit_loop  # loop_1
              }
            }
            continue  # -> $B6
          }
          $B6: {  # continuing
            %17:i32 = load %ll
            %x_7:i32 = let %17
            %19:i32 = add %x_7, 1i
            store %ll, %19
            next_iteration  # -> $B5
          }
        }
        %20:f32 = load_vector_element %gl_FragCoord, 0u
        %x_49:f32 = let %20
        %22:i32 = call %tint_f32_to_i32, %x_49
        %23:bool = gte %22, 2000i
        if %23 [t: $B9] {  # if_4
          $B9: {  # true
            store %continue_execution, false
            exit_if  # if_4
          }
        }
        exit_if  # if_1
      }
    }
    ret
  }
}
%tint_symbol = @fragment func(%gl_FragCoord_param:vec4<f32> [@position]):main_out {
  $B10: {
    store %gl_FragCoord, %gl_FragCoord_param
    %26:void = call %main_1
    %27:vec4<f32> = load %x_GLF_color
    %28:main_out = construct %27
    %29:bool = load %continue_execution
    %30:bool = eq %29, false
    if %30 [t: $B11] {  # if_5
      $B11: {  # true
        terminate_invocation
      }
    }
    ret %28
  }
}
%tint_f32_to_i32 = func(%value:f32):i32 {
  $B12: {
    %32:i32 = convert %value
    %33:bool = gte %value, -2147483648.0f
    %34:i32 = select -2147483648i, %32, %33
    %35:bool = lte %value, 2147483520.0f
    %36:i32 = select 2147483647i, %34, %35
    ret %36
  }
}

invalid entry point IO struct uses
********************************************************************
*  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.  *
********************************************************************
