[libc-commits] [libc] ed199c8 - [libc] Workaround for gcc complaining about implicit conversions with the ternary ?: operator. (#124820)

via libc-commits libc-commits at lists.llvm.org
Tue Jan 28 13:05:00 PST 2025


Author: lntue
Date: 2025-01-28T16:04:57-05:00
New Revision: ed199c8d7668c14e9e9e8e4bfa59793e3f7f0266

URL: https://github.com/llvm/llvm-project/commit/ed199c8d7668c14e9e9e8e4bfa59793e3f7f0266
DIFF: https://github.com/llvm/llvm-project/commit/ed199c8d7668c14e9e9e8e4bfa59793e3f7f0266.diff

LOG: [libc] Workaround for gcc complaining about implicit conversions with the ternary ?: operator. (#124820)

Fixes https://github.com/llvm/llvm-project/issues/120427,
https://github.com/llvm/llvm-project/issues/122745

This is caused by a -Wconversion false-positive bug in gcc:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101537

Added: 
    

Modified: 
    libc/src/__support/FPUtil/except_value_utils.h

Removed: 
    


################################################################################
diff  --git a/libc/src/__support/FPUtil/except_value_utils.h b/libc/src/__support/FPUtil/except_value_utils.h
index f8e4e92d3e1fb3..5f767769974d29 100644
--- a/libc/src/__support/FPUtil/except_value_utils.h
+++ b/libc/src/__support/FPUtil/except_value_utils.h
@@ -81,12 +81,19 @@ template <typename T, size_t N> 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;


        


More information about the libc-commits mailing list