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
}

%main_1 = func():void {
  $B2: {
    %GLF_live15c:ptr<function, vec4<f32>, read_write> = var
    %GLF_live15i:ptr<function, i32, read_write> = var
    %GLF_live15d:ptr<function, vec4<f32>, read_write> = var
    %GLF_live15i_1:ptr<function, i32, read_write> = var
    store %GLF_live15c, vec4<f32>(0.0f)
    store %GLF_live15i, 0i
    loop [b: $B3, c: $B4] {  # loop_1
      $B3: {  # body
        %7:i32 = load %GLF_live15i
        %8:bool = lt %7, 4i
        if %8 [t: $B5, f: $B6] {  # if_1
          $B5: {  # true
            exit_if  # if_1
          }
          $B6: {  # false
            exit_loop  # loop_1
          }
        }
        %9:i32 = load %GLF_live15i
        %10:bool = gte %9, 3i
        if %10 [t: $B7] {  # if_2
          $B7: {  # true
            exit_loop  # loop_1
          }
        }
        %11:f32 = load_vector_element %GLF_live15c, 1u
        %12:bool = gte %11, 1.0f
        if %12 [t: $B8] {  # if_3
          $B8: {  # true
            %13:i32 = load %GLF_live15i
            %x_10:i32 = let %13
            store_vector_element %GLF_live15c, %x_10, 1.0f
            exit_if  # if_3
          }
        }
        continue  # -> $B4
      }
      $B4: {  # continuing
        %15:i32 = load %GLF_live15i
        %16:i32 = add %15, 1i
        store %GLF_live15i, %16
        next_iteration  # -> $B3
      }
    }
    store %GLF_live15d, vec4<f32>(0.0f)
    store %GLF_live15i_1, 0i
    loop [b: $B9, c: $B10] {  # loop_2
      $B9: {  # body
        %17:i32 = load %GLF_live15i_1
        %18:bool = lt %17, 4i
        if %18 [t: $B11, f: $B12] {  # if_4
          $B11: {  # true
            exit_if  # if_4
          }
          $B12: {  # false
            exit_loop  # loop_2
          }
        }
        %19:i32 = load %GLF_live15i_1
        %20:bool = gte %19, 3i
        if %20 [t: $B13] {  # if_5
          $B13: {  # true
            exit_loop  # loop_2
          }
        }
        %21:f32 = load_vector_element %GLF_live15d, 1u
        %22:bool = gte %21, 1.0f
        if %22 [t: $B14] {  # if_6
          $B14: {  # true
            %23:i32 = load %GLF_live15i_1
            %x_15:i32 = let %23
            store_vector_element %GLF_live15d, %x_15, 1.0f
            exit_if  # if_6
          }
        }
        continue  # -> $B10
      }
      $B10: {  # continuing
        %25:i32 = load %GLF_live15i_1
        %26:i32 = add %25, 1i
        store %GLF_live15i_1, %26
        next_iteration  # -> $B9
      }
    }
    store %x_GLF_color, vec4<f32>(1.0f, 0.0f, 0.0f, 1.0f)
    ret
  }
}
%tint_symbol = @fragment func():main_out {
  $B15: {
    %28:void = call %main_1
    %29:vec4<f32> = load %x_GLF_color
    %30:main_out = construct %29
    ret %30
  }
}

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