SKIP: FAILED

#include <metal_stdlib>

using namespace metal;
struct tint_array_wrapper {
  float arr[3];
};
struct S {
  tint_array_wrapper numbers;
};
struct tint_padded_array_element {
  /* 0x0000 */ float el;
  /* 0x0004 */ int8_t tint_pad[12];
};
struct tint_array_wrapper_1 {
  /* 0x0000 */ tint_padded_array_element arr[5];
};
struct buf1 {
  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
};
struct buf2 {
  /* 0x0000 */ packed_float2 zeroVec;
};
struct buf3 {
  /* 0x0000 */ packed_float2 oneVec;
};
struct tint_padded_array_element_1 {
  /* 0x0000 */ int el;
  /* 0x0004 */ int8_t tint_pad_1[12];
};
struct tint_array_wrapper_2 {
  /* 0x0000 */ tint_padded_array_element_1 arr[2];
};
struct buf0 {
  /* 0x0000 */ tint_array_wrapper_2 x_GLF_uniform_int_values;
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_1 {
  float4 x_GLF_color_1 [[color(0)]];
};

void main_1(constant buf1& x_7, constant buf2& x_9, constant buf3& x_12, constant buf0& x_15, thread float4* const tint_symbol_6) {
  S obj = {};
  float a = 0.0f;
  float2 x_49 = 0.0f;
  float b = 0.0f;
  float const x_51 = x_7.x_GLF_uniform_float_values.arr[3].el;
  float const x_53 = x_7.x_GLF_uniform_float_values.arr[2].el;
  float const x_55 = x_7.x_GLF_uniform_float_values.arr[4].el;
  tint_array_wrapper const tint_symbol_3 = {.arr={x_51, x_53, x_55}};
  S const tint_symbol_4 = {.numbers=tint_symbol_3};
  obj = tint_symbol_4;
  float const x_59 = x_9.zeroVec.x;
  float const x_62 = x_7.x_GLF_uniform_float_values.arr[0].el;
  obj.numbers.arr[int(x_59)] = x_62;
  float const x_65 = x_9.zeroVec.x;
  float const x_67 = x_7.x_GLF_uniform_float_values.arr[0].el;
  if ((x_65 > x_67)) {
    float2 const x_73 = x_9.zeroVec;
    x_49 = x_73;
  } else {
    float2 const x_75 = x_12.oneVec;
    x_49 = x_75;
  }
  float const x_77 = x_49.y;
  a = x_77;
  float const x_79 = x_7.x_GLF_uniform_float_values.arr[0].el;
  float const x_80 = a;
  int const x_82 = x_15.x_GLF_uniform_int_values.arr[0].el;
  float const x_84 = obj.numbers.arr[x_82];
  b = mix(x_79, x_80, x_84);
  float const x_86 = b;
  float const x_88 = x_7.x_GLF_uniform_float_values.arr[2].el;
  float const x_91 = x_7.x_GLF_uniform_float_values.arr[1].el;
  if ((distance(x_86, x_88) < x_91)) {
    int const x_97 = x_15.x_GLF_uniform_int_values.arr[0].el;
    int const x_100 = x_15.x_GLF_uniform_int_values.arr[1].el;
    int const x_103 = x_15.x_GLF_uniform_int_values.arr[1].el;
    int const x_106 = x_15.x_GLF_uniform_int_values.arr[0].el;
    *(tint_symbol_6) = float4(float(x_97), float(x_100), float(x_103), float(x_106));
  } else {
    int const x_110 = x_15.x_GLF_uniform_int_values.arr[1].el;
    float const x_111 = float(x_110);
    *(tint_symbol_6) = float4(x_111, x_111, x_111, x_111);
  }
  return;
}

fragment tint_symbol_1 tint_symbol(constant buf1& x_7 [[buffer(1)]], constant buf2& x_9 [[buffer(2)]], constant buf3& x_12 [[buffer(3)]], constant buf0& x_15 [[buffer(0)]]) {
  thread float4 tint_symbol_7 = 0.0f;
  main_1(x_7, x_9, x_12, x_15, &(tint_symbol_7));
  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_7};
  tint_symbol_1 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
  return tint_symbol_5;
}

T:\tmp\udr8.0.metal:76:8: error: call to 'distance' is ambiguous
  if ((distance(x_86, x_88) < x_91)) {
       ^~~~~~~~
C:\Program Files\Metal Developer Tools\macos\lib\clang\31001.138\include\metal\metal_geometric:481:17: note: candidate function
METAL_FUNC half distance(half2 x, half2 y)
                ^
C:\Program Files\Metal Developer Tools\macos\lib\clang\31001.138\include\metal\metal_geometric:512:17: note: candidate function
METAL_FUNC half distance(half3 x, half3 y)
                ^
C:\Program Files\Metal Developer Tools\macos\lib\clang\31001.138\include\metal\metal_geometric:543:17: note: candidate function
METAL_FUNC half distance(half4 x, half4 y)
                ^
C:\Program Files\Metal Developer Tools\macos\lib\clang\31001.138\include\metal\metal_geometric:648:18: note: candidate function
METAL_FUNC float distance(float2 x, float2 y)
                 ^
C:\Program Files\Metal Developer Tools\macos\lib\clang\31001.138\include\metal\metal_geometric:691:18: note: candidate function
METAL_FUNC float distance(float3 x, float3 y)
                 ^
C:\Program Files\Metal Developer Tools\macos\lib\clang\31001.138\include\metal\metal_geometric:734:18: note: candidate function
METAL_FUNC float distance(float4 x, float4 y)
                 ^
1 error generated.

