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
    %x_80:ptr<function, bool, read_write> = var
    %x_81:ptr<function, bool, read_write> = var
    store %j, 0i
    loop [b: $B11, c: $B12] {  # loop_2
      $B11: {  # body
        %23:i32 = load %j
        %24:bool = lt %23, 1i
        if %24 [t: $B13, f: $B14] {  # if_4
          $B13: {  # true
            exit_if  # if_4
          }
          $B14: {  # false
            exit_loop  # loop_2
          }
        }
        %25:i32 = load %j
        %x_52:i32 = let %25
        %27:vec3<f32> = call %func_
        %x_53:vec3<f32> = let %27
        %29:ptr<function, vec3<f32>, read_write> = access %data, %x_52
        store %29, %x_53
        continue  # -> $B12
      }
      $B12: {  # continuing
        %30:i32 = load %j
        %31:i32 = add %30, 1i
        store %j, %31
        next_iteration  # -> $B11
      }
    }
    store %j_1, 0i
    loop [b: $B15, c: $B16] {  # loop_3
      $B15: {  # body
        %32:i32 = load %j_1
        %33:bool = lt %32, 1i
        if %33 [t: $B17, f: $B18] {  # if_5
          $B17: {  # true
            exit_if  # if_5
          }
          $B18: {  # false
            exit_loop  # loop_3
          }
        }
        %34:i32 = load %j_1
        %x_64:i32 = let %34
        %36:vec3<f32> = call %func_
        %x_67:vec3<f32> = let %36
        %38:i32 = mul 4i, %x_64
        %39:i32 = add %38, 1i
        %40:ptr<function, vec3<f32>, read_write> = access %data, %39
        store %40, %x_67
        continue  # -> $B16
      }
      $B16: {  # continuing
        %41:i32 = load %j_1
        %42:i32 = add %41, 1i
        store %j_1, %42
        next_iteration  # -> $B15
      }
    }
    %43:ptr<function, vec3<f32>, read_write> = access %data, 0i
    %44:vec3<f32> = load %43
    %45:vec3<bool> = eq %44, vec3<f32>(1.0f, 0.0f, 0.0f)
    %46:bool = all %45
    %x_74:bool = let %46
    store %x_81, %x_74
    if %x_74 [t: $B19] {  # if_6
      $B19: {  # true
        %48:ptr<function, vec3<f32>, read_write> = access %data, 1i
        %49:vec3<f32> = load %48
        %50:vec3<bool> = eq %49, vec3<f32>(1.0f, 0.0f, 0.0f)
        %51:bool = all %50
        store %x_80, %51
        %52:bool = load %x_80
        store %x_81, %52
        exit_if  # if_6
      }
    }
    %53:bool = load %x_81
    if %53 [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: {
    %55:void = call %main_1
    %56:vec4<f32> = load %x_GLF_color
    %57:main_out = construct %56
    ret %57
  }
}

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