diff --git a/libc/src/__support/FPUtil/except_value_utils.h b/libc/src/__support/FPUtil/except_value_utils.h index f8e4e92d3e1fb..5f767769974d2 100644 --- a/libc/src/__support/FPUtil/except_value_utils.h +++ b/libc/src/__support/FPUtil/except_value_utils.h @@ -81,12 +81,19 @@ template struct ExceptValues { StorageType out_bits = values[i].rnd_towardzero_result; switch (fputil::quick_get_round()) { case FE_UPWARD: - out_bits += sign ? values[i].rnd_downward_offset - : values[i].rnd_upward_offset; + if (sign) + out_bits += values[i].rnd_downward_offset; + else + out_bits += values[i].rnd_upward_offset; break; case FE_DOWNWARD: - out_bits += sign ? values[i].rnd_upward_offset - : values[i].rnd_downward_offset; + // Use conditionals instead of ternary operator to work around gcc's + // -Wconversion false positive bug: + // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101537 + if (sign) + out_bits += values[i].rnd_upward_offset; + else + out_bits += values[i].rnd_downward_offset; break; case FE_TONEAREST: out_bits += values[i].rnd_tonearest_offset;