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
        %x_90:i32 = let %6
        %8:bool = lt %x_90, 2i
        if %8 [t: $B5, f: $B6] {  # if_1
          $B5: {  # true
            exit_if  # if_1
          }
          $B6: {  # false
            exit_loop  # loop_1
          }
        }
        %9:f32 = load_vector_element %v, 1u
        %x_94:f32 = let %9
        %11:f32 = add %x_94, 1.0f
        %12:bool = gt %11, 4.0f
        if %12 [t: $B7] {  # if_2
          $B7: {  # true
            exit_loop  # loop_1
          }
        }
        store_vector_element %v, 1u, 1.0f
        %13:i32 = load %i
        %x_100:i32 = let %13
        %15:i32 = add %x_100, 1i
        store %i, %15
        continue  # -> $B4
      }
      $B4: {  # continuing
        %16:i32 = load %k
        %x_102:i32 = let %16
        %18:i32 = add %x_102, 1i
        store %k, %18
        next_iteration  # -> $B3
      }
    }
    %19:i32 = load %i
    %x_104:i32 = let %19
    %21:bool = lt %x_104, 10i
    if %21 [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
    %x_80:ptr<function, bool, read_write> = var
    %x_81_phi:ptr<function, bool, read_write> = var
    store %j, 0i
    loop [b: $B11, c: $B12] {  # loop_2
      $B11: {  # body
        %28:i32 = load %j
        %x_49:i32 = let %28
        %30:bool = lt %x_49, 1i
        if %30 [t: $B13, f: $B14] {  # if_4
          $B13: {  # true
            exit_if  # if_4
          }
          $B14: {  # false
            exit_loop  # loop_2
          }
        }
        %31:i32 = load %j
        %x_52:i32 = let %31
        %33:vec3<f32> = call %func_
        %x_53:vec3<f32> = let %33
        %35:ptr<function, vec3<f32>, read_write> = access %data, %x_52
        store %35, %x_53
        continue  # -> $B12
      }
      $B12: {  # continuing
        %36:i32 = load %j
        %x_55:i32 = let %36
        %38:i32 = add %x_55, 1i
        store %j, %38
        next_iteration  # -> $B11
      }
    }
    store %j_1, 0i
    loop [b: $B15, c: $B16] {  # loop_3
      $B15: {  # body
        %39:i32 = load %j_1
        %x_61:i32 = let %39
        %41:bool = lt %x_61, 1i
        if %41 [t: $B17, f: $B18] {  # if_5
          $B17: {  # true
            exit_if  # if_5
          }
          $B18: {  # false
            exit_loop  # loop_3
          }
        }
        %42:i32 = load %j_1
        %x_64:i32 = let %42
        %44:vec3<f32> = call %func_
        %x_67:vec3<f32> = let %44
        %46:i32 = mul 4i, %x_64
        %47:i32 = add %46, 1i
        %48:ptr<function, vec3<f32>, read_write> = access %data, %47
        store %48, %x_67
        continue  # -> $B16
      }
      $B16: {  # continuing
        %49:i32 = load %j_1
        %x_69:i32 = let %49
        %51:i32 = add %x_69, 1i
        store %j_1, %51
        next_iteration  # -> $B15
      }
    }
    %52:ptr<function, vec3<f32>, read_write> = access %data, 0i
    %53:vec3<f32> = load %52
    %x_72:vec3<f32> = let %53
    %55:vec3<bool> = eq %x_72, vec3<f32>(1.0f, 0.0f, 0.0f)
    %56:bool = all %55
    %x_74:bool = let %56
    store %x_81_phi, %x_74
    if %x_74 [t: $B19] {  # if_6
      $B19: {  # true
        %58:ptr<function, vec3<f32>, read_write> = access %data, 1i
        %59:vec3<f32> = load %58
        %x_78:vec3<f32> = let %59
        %61:vec3<bool> = eq %x_78, vec3<f32>(1.0f, 0.0f, 0.0f)
        %62:bool = all %61
        store %x_80, %62
        %63:bool = load %x_80
        store %x_81_phi, %63
        exit_if  # if_6
      }
    }
    %64:bool = load %x_81_phi
    %x_81:bool = let %64
    if %x_81 [t: $B20, f: $B21] {  # if_7
      $B20: {  # true
        store %x_GLF_color, vec4<f32>(1.0f, 0.0f, 0.0f, 1.0f)
        exit_if  # if_7
      }
      $B21: {  # false
        store %x_GLF_color, vec4<f32>(0.0f)
        exit_if  # if_7
      }
    }
    ret
  }
}
%tint_symbol = @fragment func():main_out {
  $B22: {
    %67:void = call %main_1
    %68:vec4<f32> = load %x_GLF_color
    %69:main_out = construct %68
    ret %69
  }
}

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