SKIP: FAILED

<dawn>/src/tint/lang/msl/writer/printer/printer.cc:355 internal compiler error: buf0 = struct @align(8) {
  injectionSwitch:vec2<f32> @offset(0)
}

main_out = struct @align(16) {
  x_GLF_color_1:vec4<f32> @offset(0), @location(0)
}

%b1 = block {  # root
  %x_6:ptr<uniform, buf0, read> = var @binding_point(0, 0)
  %x_GLF_color:ptr<private, vec4<f32>, read_write> = var
}

%makeFrame_ = func():f32 -> %b2 {
  %b2 = block {
    %x_60:ptr<function, f32, read_write> = var
    %x_63:ptr<function, f32, read_write> = var
    loop [b: %b3, c: %b4] {  # loop_1
      %b3 = block {  # body
        %x_41:ptr<function, bool, read_write> = var
        %x_8:ptr<function, i32, read_write> = var
        %x_44:ptr<function, f32, read_write> = var
        %x_45:ptr<function, f32, read_write> = var
        %x_42:ptr<function, bool, read_write> = var
        %x_61:ptr<function, bool, read_write> = var
        store %x_41, false
        store %x_8, 0i
        store %x_44, 0.0f
        loop [b: %b5, c: %b6] {  # loop_2
          %b5 = block {  # body
            %x_50:ptr<function, f32, read_write> = var
            %x_9:ptr<function, i32, read_write> = var
            %x_52:ptr<function, bool, read_write> = var
            %x_7:ptr<function, i32, read_write> = var
            %16:f32 = load %x_44
            store %x_60, %16
            %17:bool = load %x_41
            store %x_61, %17
            %18:i32 = load %x_8
            %19:bool = lt %18, 1i
            if %19 [t: %b7, f: %b8] {  # if_1
              %b7 = block {  # true
                exit_if  # if_1
              }
              %b8 = block {  # false
                exit_loop  # loop_2
              }
            }
            %20:f32 = load %x_44
            store %x_50, %20
            %21:i32 = load %x_8
            store %x_9, %21
            %22:bool = load %x_41
            store %x_52, %22
            loop [b: %b9, c: %b10] {  # loop_3
              %b9 = block {  # body
                %23:ptr<uniform, vec2<f32>, read> = access %x_6, 0u
                %x_54:f32 = load_vector_element %23, 1u
                %25:f32 = load %x_50
                store %x_45, %25
                %26:bool = load %x_52
                store %x_42, %26
                %27:i32 = convert %x_54
                %28:bool = lt 1i, %27
                if %28 [t: %b11, f: %b12] {  # if_2
                  %b11 = block {  # true
                    exit_if  # if_2
                  }
                  %b12 = block {  # false
                    exit_loop  # loop_3
                  }
                }
                store %x_45, 1.0f
                store %x_42, true
                exit_loop  # loop_3
              }
              %b10 = block {  # continuing
                store %x_50, 0.0f
                store %x_9, 0i
                store %x_52, false
                next_iteration %b9
              }
            }
            %29:f32 = load %x_45
            store %x_60, %29
            %30:bool = load %x_42
            store %x_61, %30
            %31:bool = load %x_42
            if %31 [t: %b13] {  # if_3
              %b13 = block {  # true
                exit_loop  # loop_2
              }
            }
            continue %b6
          }
          %b6 = block {  # continuing
            %32:i32 = load %x_9
            %33:i32 = add %32, 1i
            store %x_7, %33
            %34:bool = load %x_42
            store %x_41, %34
            %35:i32 = load %x_7
            store %x_8, %35
            %36:f32 = load %x_45
            store %x_44, %36
            next_iteration %b5
          }
        }
        %37:f32 = load %x_60
        store %x_63, %37
        %38:bool = load %x_61
        if %38 [t: %b14] {  # if_4
          %b14 = block {  # true
            exit_loop  # loop_1
          }
        }
        store %x_63, 1.0f
        exit_loop  # loop_1
      }
      %b4 = block {  # continuing
        next_iteration %b3
      }
    }
    %39:f32 = load %x_63
    ret %39
  }
}
%main_1 = func():void -> %b15 {
  %b15 = block {
    %x_34:f32 = call %makeFrame_
    store %x_GLF_color, vec4<f32>(1.0f, 0.0f, 0.0f, 1.0f)
    ret
  }
}
%tint_symbol = @fragment func():main_out -> %b16 {
  %b16 = block {
    %43:void = call %main_1
    %44:vec4<f32> = load %x_GLF_color
    %45:main_out = construct %44
    ret %45
  }
}

unhandled variable address space
********************************************************************
*  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.  *
********************************************************************
