Auto merge of #130157 - eduardosm:stabilize-const_float_classify, r=RalfJung
Stabilize `const_float_classify` Tracking issue: https://github.com/rust-lang/rust/issues/72505 Also reverts https://github.com/rust-lang/rust/pull/114486 Closes https://github.com/rust-lang/rust/issues/72505 Stabilized const API: ```rust impl f32 { pub const fn is_nan(self) -> bool; pub const fn is_infinite(self) -> bool; pub const fn is_finite(self) -> bool; pub const fn is_subnormal(self) -> bool; pub const fn is_normal(self) -> bool; pub const fn classify(self) -> FpCategory; pub const fn is_sign_positive(self) -> bool; pub const fn is_sign_negative(self) -> bool; } impl f64 { pub const fn is_nan(self) -> bool; pub const fn is_infinite(self) -> bool; pub const fn is_finite(self) -> bool; pub const fn is_subnormal(self) -> bool; pub const fn is_normal(self) -> bool; pub const fn classify(self) -> FpCategory; pub const fn is_sign_positive(self) -> bool; pub const fn is_sign_negative(self) -> bool; } ``` cc `@rust-lang/wg-const-eval` `@rust-lang/libs-api`
This commit is contained in:
commit
14f303bc14
10 changed files with 43 additions and 47 deletions
|
@ -1703,7 +1703,7 @@ pub(crate) enum InvalidNanComparisons {
|
|||
#[diag(lint_invalid_nan_comparisons_eq_ne)]
|
||||
EqNe {
|
||||
#[subdiagnostic]
|
||||
suggestion: Option<InvalidNanComparisonsSuggestion>,
|
||||
suggestion: InvalidNanComparisonsSuggestion,
|
||||
},
|
||||
#[diag(lint_invalid_nan_comparisons_lt_le_gt_ge)]
|
||||
LtLeGtGe,
|
||||
|
|
|
@ -209,36 +209,32 @@ fn lint_nan<'tcx>(
|
|||
}
|
||||
|
||||
fn eq_ne(
|
||||
cx: &LateContext<'_>,
|
||||
e: &hir::Expr<'_>,
|
||||
l: &hir::Expr<'_>,
|
||||
r: &hir::Expr<'_>,
|
||||
f: impl FnOnce(Span, Span) -> InvalidNanComparisonsSuggestion,
|
||||
) -> InvalidNanComparisons {
|
||||
// FIXME(#72505): This suggestion can be restored if `f{32,64}::is_nan` is made const.
|
||||
let suggestion = (!cx.tcx.hir().is_inside_const_context(e.hir_id)).then(|| {
|
||||
if let Some(l_span) = l.span.find_ancestor_inside(e.span)
|
||||
&& let Some(r_span) = r.span.find_ancestor_inside(e.span)
|
||||
{
|
||||
f(l_span, r_span)
|
||||
} else {
|
||||
InvalidNanComparisonsSuggestion::Spanless
|
||||
}
|
||||
});
|
||||
let suggestion = if let Some(l_span) = l.span.find_ancestor_inside(e.span)
|
||||
&& let Some(r_span) = r.span.find_ancestor_inside(e.span)
|
||||
{
|
||||
f(l_span, r_span)
|
||||
} else {
|
||||
InvalidNanComparisonsSuggestion::Spanless
|
||||
};
|
||||
|
||||
InvalidNanComparisons::EqNe { suggestion }
|
||||
}
|
||||
|
||||
let lint = match binop.node {
|
||||
hir::BinOpKind::Eq | hir::BinOpKind::Ne if is_nan(cx, l) => {
|
||||
eq_ne(cx, e, l, r, |l_span, r_span| InvalidNanComparisonsSuggestion::Spanful {
|
||||
eq_ne(e, l, r, |l_span, r_span| InvalidNanComparisonsSuggestion::Spanful {
|
||||
nan_plus_binop: l_span.until(r_span),
|
||||
float: r_span.shrink_to_hi(),
|
||||
neg: (binop.node == hir::BinOpKind::Ne).then(|| r_span.shrink_to_lo()),
|
||||
})
|
||||
}
|
||||
hir::BinOpKind::Eq | hir::BinOpKind::Ne if is_nan(cx, r) => {
|
||||
eq_ne(cx, e, l, r, |l_span, r_span| InvalidNanComparisonsSuggestion::Spanful {
|
||||
eq_ne(e, l, r, |l_span, r_span| InvalidNanComparisonsSuggestion::Spanful {
|
||||
nan_plus_binop: l_span.shrink_to_hi().to(r_span),
|
||||
float: l_span.shrink_to_hi(),
|
||||
neg: (binop.node == hir::BinOpKind::Ne).then(|| l_span.shrink_to_lo()),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue