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
  %gl_FragCoord:ptr<private, vec4<f32>, read_write> = var
  %x_GLF_color:ptr<private, vec4<f32>, read_write> = var
  %continue_execution:ptr<private, bool, read_write> = var, true
}

%x_47 = func():void {
  $B2: {
    store %continue_execution, false
    ret
  }
}
%main_1 = func():void {
  $B3: {
    loop [b: $B4] {  # loop_1
      $B4: {  # body
        %x_30:ptr<function, i32, read_write> = var
        %x_48:ptr<function, bool, read_write> = var
        store %x_30, 0i
        loop [b: $B5, c: $B6] {  # loop_2
          $B5: {  # body
            %x_31:ptr<function, i32, read_write> = var
            store %x_48, false
            %9:i32 = load %x_30
            %10:bool = lt %9, 10i
            if %10 [t: $B7, f: $B8] {  # if_1
              $B7: {  # true
                exit_if  # if_1
              }
              $B8: {  # false
                exit_loop  # loop_2
              }
            }
            %11:f32 = load_vector_element %gl_FragCoord, 1u
            %12:bool = lt %11, 0.0f
            if %12 [t: $B9] {  # if_2
              $B9: {  # true
                %13:f32 = load_vector_element %gl_FragCoord, 0u
                %14:bool = lt %13, 0.0f
                if %14 [t: $B10, f: $B11] {  # if_3
                  $B10: {  # true
                    store %x_48, false
                    exit_loop  # loop_2
                  }
                  $B11: {  # false
                    continue  # -> $B6
                  }
                }
                exit_if  # if_2
              }
            }
            %15:void = call %x_47
            store %x_48, true
            exit_loop  # loop_2
          }
          $B6: {  # continuing
            %16:i32 = load %x_30
            %17:i32 = add %16, 1i
            store %x_31, %17
            %18:i32 = load %x_31
            store %x_30, %18
            next_iteration  # -> $B5
          }
        }
        %19:bool = load %x_48
        if %19 [t: $B12] {  # if_4
          $B12: {  # true
            exit_loop  # loop_1
          }
        }
        store %x_GLF_color, vec4<f32>(1.0f, 0.0f, 0.0f, 1.0f)
        exit_loop  # loop_1
      }
    }
    ret
  }
}
%tint_symbol = @fragment func(%gl_FragCoord_param:vec4<f32> [@position]):main_out {
  $B13: {
    store %gl_FragCoord, %gl_FragCoord_param
    %22:void = call %main_1
    %23:vec4<f32> = load %x_GLF_color
    %24:main_out = construct %23
    %25:bool = load %continue_execution
    %26:bool = eq %25, false
    if %26 [t: $B14] {  # if_5
      $B14: {  # true
        terminate_invocation
      }
    }
    ret %24
  }
}

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