-
Notifications
You must be signed in to change notification settings - Fork 12.8k
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
[tracking issue] const fn: count_zeros, count_ones, leading_zeros, trailing_zeros #51267
Comments
The underlying intrinsics are const as of #51171, now we just need to make the stable wrapper functions
LLVM is irrelevant. Clang is evaluating the built-in in the frontend (check the generated IR at -O0), and rustc is doing it in miri. Both have to do that since the value of a constant can be needed during type checking. |
hah, I tried an hour too early! |
There's a bootstrapping problem, though. stage0 doesn't have support for those const intrinsics, so it won't accept the const keyword even behind a |
Is Not disagreeing, though, that it would be nice to have these operations be const fn :) |
cc @faern |
Yes. I created #51171 in order to then make |
Initially I only planned on making I made the appropriate methods on integers constant and pushed a feature branch to my fork, the diff can be viewed at https://github.com/rust-lang/rust/compare/master...faern:const-int-ops?expand=1. Please check if it makes all the methods you need I'm going to try to get that feature branch merged into nightly as soon as Rust 1.27 comes out and the stage0 compiler is bumped. But yes, if I understand the way the stage0 compiler is bumped, this can't hit stable before Rust 1.29. |
(unless #51171 is uplifted to beta) |
There is no motivation to do so. This is a feature, not a bugfix.
Idk what the policy on that is, but maybe we can just bump the stage0 now? |
stage0 must always be a beta compiler, but otherwise we can bump whenever. I'm not opposed to uplifting #51171 if it make some other patch possible, but that should ~never be the case. AFAICT, the correct approach here is to have the relevant methods (count_*) be made const fn with |
You can't do something like: #[cfg(stage0)]
fn foo() {}
#[cfg(not(stage0))]
const fn foo() {} The stage0 compiler still barfs about the const. So the only way to do this without a stage0 that has #51171 is a macro that can parse all kinds of function declarations. |
I am somewhat surprised by that? Do you happen to have an error message? |
Same as without a |
I can't reproduce that (example), and it doesn't make sense that const fn restrictions would be checked before cfg stripping. Please double-check and show your code. |
I wouldn't expect us to edit the intrinsic definitions but rather have the cfg's around the definitions in libcore: e.g., Lines 284 to 288 in aa094a4
|
https://play.rust-lang.org/?gist=5eab5ec94d7b452942b2c5b8ed15f6f7&version=nightly&mode=debug But as @Mark-Simulacrum says, the intrinsic definitions actually don't need to change in the end. |
Seems like I can make it work by duplicating all methods and marking the const version with I'm personally in no rush to get this merged now, as compared to around June 22 (1.27). Adding this conditional compilation and getting it in now would mean it could potentially hit stable in 1.28, right? So 500 LOC vs 6 weeks extra wait? :) I can submit it as a PR now with the extra |
The lines of code of no concern as after release is cut the |
I submitted PR #51299 to address this issue. |
Should const |
const fn integer operations A follow up to rust-lang#51171 Fixes rust-lang#51267 Makes a lot of the integer methods (`swap_bytes`, `count_ones` etc) `const fn`s. See rust-lang#51267 for a discussion about why this is wanted and the solution used.
is this not a tracking issue now? |
This is now available on nightly under the |
@scottmcm did you open an issue about |
@gnzlbg No, I didn't. |
Done (note I didn't add the item lists to the initial comment, oli_obk did) |
What's the status here? The top-level comment says the stabilization PR is done, but it was actually closed without being merged. |
Done in #57234. |
One thing that I would like to do is to compile-time assert that the log2 of an alignment is less a given size. A simple way to do log2 of a power of 2 is to use
trailing_zeros
. Buttrailing_zeros
is not const, so it's not possible to do a compile-time check.The equivalent
__builtin
s in clang are const (example: https://godbolt.org/g/RxWczn) so llvm should be able to handle that.However, adding
const
to the functions incore::num
requires addingconst
to the corresponding intrinsics, and that is not supported (extern items cannot be 'const'
)The text was updated successfully, but these errors were encountered: