Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[libc][math] Ensure fputil::nextafter is called with correct type args #75009

Merged
merged 1 commit into from
Dec 10, 2023

Conversation

nishantwrp
Copy link
Contributor

Follow up to #73698 (comment)

@llvmbot llvmbot added the libc label Dec 10, 2023
@nishantwrp
Copy link
Contributor Author

@lntue @michaelrj-google ptal!

@llvmbot
Copy link

llvmbot commented Dec 10, 2023

@llvm/pr-subscribers-libc

Author: Nishant Mittal (nishantwrp)

Changes

Follow up to #73698 (comment)


Full diff: https://github.com/llvm/llvm-project/pull/75009.diff

1 Files Affected:

  • (modified) libc/src/__support/FPUtil/ManipulationFunctions.h (+8-4)
diff --git a/libc/src/__support/FPUtil/ManipulationFunctions.h b/libc/src/__support/FPUtil/ManipulationFunctions.h
index 9d3fd075be471..08adb074b121f 100644
--- a/libc/src/__support/FPUtil/ManipulationFunctions.h
+++ b/libc/src/__support/FPUtil/ManipulationFunctions.h
@@ -144,10 +144,11 @@ LIBC_INLINE T ldexp(T x, int exp) {
   return normal;
 }
 
-template <
-    typename T, typename U,
-    cpp::enable_if_t<cpp::is_floating_point_v<T> && cpp::is_floating_point_v<U>,
-                     int> = 0>
+template <typename T, typename U,
+          cpp::enable_if_t<cpp::is_floating_point_v<T> &&
+                               cpp::is_floating_point_v<U> &&
+                               (sizeof(T) <= sizeof(U)),
+                           int> = 0>
 LIBC_INLINE T nextafter(T from, U to) {
   FPBits<T> from_bits(from);
   if (from_bits.is_nan())
@@ -157,6 +158,9 @@ LIBC_INLINE T nextafter(T from, U to) {
   if (to_bits.is_nan())
     return static_cast<T>(to);
 
+  // NOTE: This would work only if `U` has a greater or equal precision than
+  // `T`. Otherwise `from` could loose its precision and the following statement
+  // could incorrectly evaluate to `true`.
   if (static_cast<U>(from) == to)
     return static_cast<T>(to);
 

@lntue lntue self-requested a review December 10, 2023 20:47
@lntue lntue merged commit ac640c6 into llvm:main Dec 10, 2023
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants