SKIP: FAILED

#include <metal_stdlib>

using namespace metal;
struct ResultMatrix {
  /* 0x0000 */ float numbers[1];
};
struct FirstMatrix {
  /* 0x0000 */ float numbers[1];
};
struct SecondMatrix {
  /* 0x0000 */ float numbers[1];
};
struct Uniforms {
  /* 0x0000 */ float tint_symbol;
  /* 0x0004 */ int sizeA;
  /* 0x0008 */ int sizeB;
};

float binaryOperation_f1_f1_(thread float* const a, thread float* const b) {
  float x_26 = 0.0f;
  float const x_13 = *(b);
  if ((x_13 == 0.0f)) {
    return 1.0f;
  }
  float const x_21 = *(b);
  if (!((rint((x_21 % 2.0f)) == 1.0f))) {
    float const x_29 = *(a);
    float const x_31 = *(b);
    x_26 = pow(fabs(x_29), x_31);
  } else {
    float const x_34 = *(a);
    float const x_36 = *(a);
    float const x_38 = *(b);
    x_26 = (sign(x_34) * pow(fabs(x_36), x_38));
  }
  float const x_41 = x_26;
  return x_41;
}

void main_1(device ResultMatrix& resultMatrix, thread uint3* const tint_symbol_3) {
  int index = 0;
  int a_1 = 0;
  float param = 0.0f;
  float param_1 = 0.0f;
  uint const x_54 = (*(tint_symbol_3)).x;
  index = as_type<int>(x_54);
  a_1 = -10;
  int const x_63 = index;
  param = -4.0f;
  param_1 = -3.0f;
  float const x_68 = binaryOperation_f1_f1_(&(param), &(param_1));
  resultMatrix.numbers[x_63] = x_68;
  return;
}

kernel void tint_symbol_1(uint3 gl_GlobalInvocationID_param [[thread_position_in_grid]], device ResultMatrix& resultMatrix [[buffer(2)]]) {
  thread uint3 tint_symbol_4 = 0u;
  tint_symbol_4 = gl_GlobalInvocationID_param;
  main_1(resultMatrix, &(tint_symbol_4));
  return;
}

Compilation failed: 

program_source:26:21: error: invalid operands to binary expression ('const float' and 'float')
  if (!((rint((x_21 % 2.0f)) == 1.0f))) {
               ~~~~ ^ ~~~~


