-
Notifications
You must be signed in to change notification settings - Fork 13.3k
Constify implementations of (Try)From
for int types
#86840
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
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
#[test] | ||
fn from() { | ||
use core::convert::TryFrom; | ||
use core::num::TryFromIntError; | ||
|
||
// From | ||
const FROM: i64 = i64::from(1i32); | ||
assert_eq!(FROM, 1i64); | ||
|
||
// From int to float | ||
const FROM_F64: f64 = f64::from(42u8); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. cc @rust-lang/wg-const-eval this is an interesting edge case around floats. We forbid floats in const fn, but those checks only happen at the declaration site, and libcore uses the feature gate that allows them. So now we can invoke const fns (only within items, not within other const fn) that work with floats. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yeah, we should really work towards getting rid of "things that are allowed in |
||
assert_eq!(FROM_F64, 42f64); | ||
|
||
// Upper bounded | ||
const U8_FROM_U16: Result<u8, TryFromIntError> = u8::try_from(1u16); | ||
assert_eq!(U8_FROM_U16, Ok(1u8)); | ||
|
||
// Both bounded | ||
const I8_FROM_I16: Result<i8, TryFromIntError> = i8::try_from(1i16); | ||
assert_eq!(I8_FROM_I16, Ok(1i8)); | ||
|
||
// Lower bounded | ||
const I16_FROM_U16: Result<i16, TryFromIntError> = i16::try_from(1u16); | ||
assert_eq!(I16_FROM_U16, Ok(1i16)); | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -27,6 +27,8 @@ mod u64; | |
mod u8; | ||
|
||
mod bignum; | ||
|
||
mod const_from; | ||
mod dec2flt; | ||
mod flt2dec; | ||
mod int_log; | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Stability attributes do not usually work on trait
impl
s. Do they work forimpl const
?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes. See this.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That tests the case where we call a trait fn on a concrete type.
But there is another way to use a trait impl: to satisfy a bound.
Is that properly checked?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That tests the case where we call a trait fn on a concrete type.
But there is another way to use a trait impl: to satisfy a bound.
Is that properly checked?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You are right, those are probably not. I guess it is fine to let this PR pass and I will come up with a fix in the future. (and we need to wait for #87375, as that introduces a check on const bounds to error on previous code that should not be accepted) Trait bounds on const functons are gated behind a feature anyways, so even if this would allow one to use an unstable library feature without having it enabled, it would still require users to use a nightly compiler anyways.