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():vec3<f32> {
  $B2: {
    %v:ptr<function, vec2<f32>, read_write> = var
    %i:ptr<function, i32, read_write> = var
    %k:ptr<function, i32, read_write> = var
    store %v, vec2<f32>(1.0f)
    store %i, 0i
    store %k, 0i
    loop [b: $B3, c: $B4] {  # loop_1
      $B3: {  # body
        %6:i32 = load %k
        %7:bool = lt %6, 2i
        if %7 [t: $B5, f: $B6] {  # if_1
          $B5: {  # true
            exit_if  # if_1
          }
          $B6: {  # false
            exit_loop  # loop_1
          }
        }
        %8:f32 = load_vector_element %v, 1u
        %9:f32 = add %8, 1.0f
        %10:bool = gt %9, 4.0f
        if %10 [t: $B7] {  # if_2
          $B7: {  # true
            exit_loop  # loop_1
          }
        }
        store_vector_element %v, 1u, 1.0f
        %11:i32 = load %i
        %12:i32 = add %11, 1i
        store %i, %12
        continue  # -> $B4
      }
      $B4: {  # continuing
        %13:i32 = load %k
        %14:i32 = add %13, 1i
        store %k, %14
        next_iteration  # -> $B3
      }
    }
    %15:i32 = load %i
    %16:bool = lt %15, 10i
    if %16 [t: $B8, f: $B9] {  # if_3
      $B8: {  # true
        ret vec3<f32>(1.0f, 0.0f, 0.0f)
      }
      $B9: {  # false
        ret vec3<f32>(0.0f, 0.0f, 1.0f)
      }
    }
    unreachable
  }
}
%main_1 = func():void {
  $B10: {
    %j:ptr<function, i32, read_write> = var
    %data:ptr<function, array<vec3<f32>, 2>, read_write> = var
    %j_1:ptr<function, i32, read_write> = var
    store %j, 0i
    loop [b: $B11, c: $B12] {  # loop_2
      $B11: {  # body
        %21:i32 = load %j
        %22:bool = lt %21, 1i
        if %22 [t: $B13, f: $B14] {  # if_4
          $B13: {  # true
            exit_if  # if_4
          }
          $B14: {  # false
            exit_loop  # loop_2
          }
        }
        %23:i32 = load %j
        %x_49:i32 = let %23
        %25:vec3<f32> = call %func_
        %x_50:vec3<f32> = let %25
        %27:ptr<function, vec3<f32>, read_write> = access %data, %x_49
        store %27, %x_50
        continue  # -> $B12
      }
      $B12: {  # continuing
        %28:i32 = load %j
        %29:i32 = add %28, 1i
        store %j, %29
        next_iteration  # -> $B11
      }
    }
    store %j_1, 0i
    loop [b: $B15, c: $B16] {  # loop_3
      $B15: {  # body
        %30:i32 = load %j_1
        %31:bool = lt %30, 1i
        if %31 [t: $B17, f: $B18] {  # if_5
          $B17: {  # true
            exit_if  # if_5
          }
          $B18: {  # false
            exit_loop  # loop_3
          }
        }
        %32:i32 = load %j_1
        %x_61:i32 = let %32
        %34:vec3<f32> = call %func_
        %x_64:vec3<f32> = let %34
        %36:i32 = mul 4i, %x_61
        %37:i32 = add %36, 1i
        %38:ptr<function, vec3<f32>, read_write> = access %data, %37
        store %38, %x_64
        continue  # -> $B16
      }
      $B16: {  # continuing
        %39:i32 = load %j_1
        %40:i32 = add %39, 1i
        store %j_1, %40
        next_iteration  # -> $B15
      }
    }
    %41:ptr<function, vec3<f32>, read_write> = access %data, 0i
    %42:vec3<f32> = load %41
    %x_69:vec3<f32> = let %42
    %44:f32 = access %x_69, 0u
    %45:f32 = access %x_69, 1u
    %46:f32 = access %x_69, 2u
    %47:vec4<f32> = construct %44, %45, %46, 1.0f
    store %x_GLF_color, %47
    ret
  }
}
%tint_symbol = @fragment func():main_out {
  $B19: {
    %49:void = call %main_1
    %50:vec4<f32> = load %x_GLF_color
    %51:main_out = construct %50
    ret %51
  }
}

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