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: {
    %a:ptr<function, i32, read_write> = var
    %b:ptr<function, i32, read_write> = var
    %i:ptr<function, i32, read_write> = var
    %i_1:ptr<function, i32, read_write> = var
    %i_2:ptr<function, i32, read_write> = var
    %indexable:ptr<function, array<i32, 2>, read_write> = var
    store %a, 0i
    store %b, 1i
    store %x_GLF_color, vec4<f32>(0.0f)
    store %i, 0i
    loop [b: $B3, c: $B4] {  # loop_1
      $B3: {  # body
        %9:i32 = load %i
        %x_38:i32 = let %9
        %11:bool = lt %x_38, 10i
        if %11 [t: $B5, f: $B6] {  # if_1
          $B5: {  # true
            exit_if  # if_1
          }
          $B6: {  # false
            exit_loop  # loop_1
          }
        }
        %12:i32 = load %i
        %x_41:i32 = let %12
        %14:bool = gt %x_41, 1i
        if %14 [t: $B7] {  # if_2
          $B7: {  # true
            %15:i32 = load %a
            %x_45:i32 = let %15
            %17:i32 = add %x_45, 1i
            store %a, %17
            if false [t: $B8] {  # if_3
              $B8: {  # true
                store %i_1, 0i
                loop [b: $B9] {  # loop_2
                  $B9: {  # body
                    %18:i32 = load %i_1
                    %x_53:i32 = let %18
                    %20:bool = lt %x_53, 10i
                    if %20 [t: $B10, f: $B11] {  # if_4
                      $B10: {  # true
                        exit_if  # if_4
                      }
                      $B11: {  # false
                        exit_loop  # loop_2
                      }
                    }
                    ret
                  }
                }
                exit_if  # if_3
              }
            }
            exit_if  # if_2
          }
        }
        continue  # -> $B4
      }
      $B4: {  # continuing
        %21:i32 = load %i
        %x_56:i32 = let %21
        %23:i32 = add %x_56, 1i
        store %i, %23
        next_iteration  # -> $B3
      }
    }
    store %i_2, 0i
    loop [b: $B12, c: $B13] {  # loop_3
      $B12: {  # body
        %24:i32 = load %i_2
        %x_62:i32 = let %24
        %26:bool = lt %x_62, 10i
        if %26 [t: $B14, f: $B15] {  # if_5
          $B14: {  # true
            exit_if  # if_5
          }
          $B15: {  # false
            exit_loop  # loop_3
          }
        }
        %27:i32 = load %b
        %x_65:i32 = let %27
        store %indexable, array<i32, 2>(1i, 2i)
        %29:ptr<function, i32, read_write> = access %indexable, %x_65
        %30:i32 = load %29
        %x_67:i32 = let %30
        %32:i32 = load %a
        %x_68:i32 = let %32
        %34:i32 = add %x_68, %x_67
        store %a, %34
        continue  # -> $B13
      }
      $B13: {  # continuing
        %35:i32 = load %i_2
        %x_70:i32 = let %35
        %37:i32 = add %x_70, 1i
        store %i_2, %37
        next_iteration  # -> $B12
      }
    }
    %38:i32 = load %a
    %x_72:i32 = let %38
    %40:bool = eq %x_72, 28i
    if %40 [t: $B16] {  # if_6
      $B16: {  # true
        store %x_GLF_color, vec4<f32>(1.0f, 0.0f, 0.0f, 1.0f)
        exit_if  # if_6
      }
    }
    ret
  }
}
%tint_symbol = @fragment func():main_out {
  $B17: {
    %42:void = call %main_1
    %43:vec4<f32> = load %x_GLF_color
    %44:main_out = construct %43
    ret %44
  }
}

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