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
}

%func_ = func():f32 {
  $B2: {
    %i:ptr<function, i32, read_write> = var
    store %i, 0i
    loop [b: $B3, c: $B4] {  # loop_1
      $B3: {  # body
        %4:i32 = load %i
        %5:bool = lt %4, 10i
        if %5 [t: $B5, f: $B6] {  # if_1
          $B5: {  # true
            exit_if  # if_1
          }
          $B6: {  # false
            exit_loop  # loop_1
          }
        }
        %6:i32 = load %i
        %7:bool = gt %6, 5i
        if %7 [t: $B7] {  # if_2
          $B7: {  # true
            %8:i32 = load %i
            %9:i32 = add %8, 1i
            store %i, %9
            exit_if  # if_2
          }
        }
        %10:i32 = load %i
        %11:bool = gt %10, 8i
        if %11 [t: $B8] {  # if_3
          $B8: {  # true
            ret 0.0f
          }
        }
        continue  # -> $B4
      }
      $B4: {  # continuing
        %12:i32 = load %i
        %13:i32 = add %12, 1i
        store %i, %13
        next_iteration  # -> $B3
      }
    }
    ret 1.0f
  }
}
%main_1 = func():void {
  $B9: {
    if false [t: $B10, f: $B11] {  # if_4
      $B10: {  # true
        %15:f32 = call %func_
        %x_28:f32 = let %15
        %17:vec4<f32> = construct %x_28
        store %x_GLF_color, %17
        exit_if  # if_4
      }
      $B11: {  # false
        store %x_GLF_color, vec4<f32>(1.0f, 0.0f, 0.0f, 1.0f)
        exit_if  # if_4
      }
    }
    ret
  }
}
%tint_symbol = @fragment func():main_out {
  $B12: {
    %19:void = call %main_1
    %20:vec4<f32> = load %x_GLF_color
    %21:main_out = construct %20
    ret %21
  }
}

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