-
Notifications
You must be signed in to change notification settings - Fork 12.6k
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] Make strtointeger handle all bigint types #111926
[libc] Make strtointeger handle all bigint types #111926
Conversation
Needed for llvm#110894 The strtointeger code was updated to support some bigint types in llvm#85201 but not all. This patch finishes the cleanup so that it can work for a wider range of types.
@llvm/pr-subscribers-libc Author: Michael Jones (michaelrj-google) ChangesNeeded for #110894 The strtointeger code was updated to support some bigint types in #85201 Full diff: https://github.com/llvm/llvm-project/pull/111926.diff 1 Files Affected:
diff --git a/libc/src/__support/str_to_integer.h b/libc/src/__support/str_to_integer.h
index 1f80229a9eff40..ea17178c6afb6a 100644
--- a/libc/src/__support/str_to_integer.h
+++ b/libc/src/__support/str_to_integer.h
@@ -11,6 +11,8 @@
#include "src/__support/CPP/limits.h"
#include "src/__support/CPP/type_traits.h"
+#include "src/__support/CPP/type_traits/make_unsigned.h"
+#include "src/__support/big_int.h"
#include "src/__support/common.h"
#include "src/__support/ctype_utils.h"
#include "src/__support/macros/config.h"
@@ -77,9 +79,7 @@ template <class T>
LIBC_INLINE StrToNumResult<T>
strtointeger(const char *__restrict src, int base,
const size_t src_len = cpp::numeric_limits<size_t>::max()) {
- using ResultType = typename cpp::conditional_t<(cpp::is_same_v<T, UInt128> ||
- cpp::is_same_v<T, Int128>),
- UInt128, unsigned long long>;
+ using ResultType = make_integral_or_big_int_unsigned_t<T>;
ResultType result = 0;
@@ -137,13 +137,13 @@ strtointeger(const char *__restrict src, int base,
result = abs_max;
error_val = ERANGE;
} else {
- result = result * base;
+ result = static_cast<ResultType>(result * base);
}
if (result > abs_max - cur_digit) {
result = abs_max;
error_val = ERANGE;
} else {
- result = result + cur_digit;
+ result = static_cast<ResultType>(result + cur_digit);
}
}
@@ -156,12 +156,7 @@ strtointeger(const char *__restrict src, int base,
return {cpp::numeric_limits<T>::min(), str_len, error_val};
}
- return {
- is_positive
- ? static_cast<T>(result)
- : static_cast<T>(
- -static_cast<make_integral_or_big_int_unsigned_t<T>>(result)),
- str_len, error_val};
+ return {static_cast<T>(is_positive ? result : -result), str_len, error_val};
}
} // namespace internal
|
LLVM Buildbot has detected a new failure on builder Full details are available at: https://lab.llvm.org/buildbot/#/builders/73/builds/6959 Here is the relevant piece of the build log for the reference
|
Ah, thanks! |
Needed for llvm#110894 The strtointeger code was updated to support some bigint types in llvm#85201 but not all. This patch finishes the cleanup so that it can work for a wider range of types.
Needed for llvm#110894 The strtointeger code was updated to support some bigint types in llvm#85201 but not all. This patch finishes the cleanup so that it can work for a wider range of types.
Needed for #110894
The strtointeger code was updated to support some bigint types in #85201
but not all. This patch finishes the cleanup so that it can work for a
wider range of types.