Auto merge of #114526 - matthiaskrgr:rollup-zz041wi, r=matthiaskrgr

Rollup of 4 pull requests

Successful merges:

 - #114486 (Avoid invalid NaN lint machine-applicable suggestion in const context)
 - #114503 (Remove invalid lint when there is a generic argument in prefix path)
 - #114509 (Migrate GUI colors test to original CSS color format)
 - #114524 (Also ICE when goals go from Ok to Err in new solver)

r? `@ghost`
`@rustbot` modify labels: rollup
This commit is contained in:
bors 2023-08-06 03:39:37 +00:00
commit 11467b1c2a
7 changed files with 36 additions and 20 deletions

View File

@ -1496,7 +1496,7 @@ pub enum InvalidNanComparisons {
#[diag(lint_invalid_nan_comparisons_eq_ne)] #[diag(lint_invalid_nan_comparisons_eq_ne)]
EqNe { EqNe {
#[subdiagnostic] #[subdiagnostic]
suggestion: InvalidNanComparisonsSuggestion, suggestion: Option<InvalidNanComparisonsSuggestion>,
}, },
#[diag(lint_invalid_nan_comparisons_lt_le_gt_ge)] #[diag(lint_invalid_nan_comparisons_lt_le_gt_ge)]
LtLeGtGe, LtLeGtGe,

View File

@ -572,32 +572,36 @@ fn lint_nan<'tcx>(
} }
fn eq_ne( fn eq_ne(
cx: &LateContext<'_>,
e: &hir::Expr<'_>, e: &hir::Expr<'_>,
l: &hir::Expr<'_>, l: &hir::Expr<'_>,
r: &hir::Expr<'_>, r: &hir::Expr<'_>,
f: impl FnOnce(Span, Span) -> InvalidNanComparisonsSuggestion, f: impl FnOnce(Span, Span) -> InvalidNanComparisonsSuggestion,
) -> InvalidNanComparisons { ) -> InvalidNanComparisons {
let suggestion = // 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) && if let Some(l_span) = l.span.find_ancestor_inside(e.span) &&
let Some(r_span) = r.span.find_ancestor_inside(e.span) { let Some(r_span) = r.span.find_ancestor_inside(e.span)
{
f(l_span, r_span) f(l_span, r_span)
} else { } else {
InvalidNanComparisonsSuggestion::Spanless InvalidNanComparisonsSuggestion::Spanless
}; }
});
InvalidNanComparisons::EqNe { suggestion } InvalidNanComparisons::EqNe { suggestion }
} }
let lint = match binop.node { let lint = match binop.node {
hir::BinOpKind::Eq | hir::BinOpKind::Ne if is_nan(cx, l) => { hir::BinOpKind::Eq | hir::BinOpKind::Ne if is_nan(cx, l) => {
eq_ne(e, l, r, |l_span, r_span| InvalidNanComparisonsSuggestion::Spanful { eq_ne(cx, e, l, r, |l_span, r_span| InvalidNanComparisonsSuggestion::Spanful {
nan_plus_binop: l_span.until(r_span), nan_plus_binop: l_span.until(r_span),
float: r_span.shrink_to_hi(), float: r_span.shrink_to_hi(),
neg: (binop.node == hir::BinOpKind::Ne).then(|| r_span.shrink_to_lo()), neg: (binop.node == hir::BinOpKind::Ne).then(|| r_span.shrink_to_lo()),
}) })
} }
hir::BinOpKind::Eq | hir::BinOpKind::Ne if is_nan(cx, r) => { hir::BinOpKind::Eq | hir::BinOpKind::Ne if is_nan(cx, r) => {
eq_ne(e, l, r, |l_span, r_span| InvalidNanComparisonsSuggestion::Spanful { eq_ne(cx, e, l, r, |l_span, r_span| InvalidNanComparisonsSuggestion::Spanful {
nan_plus_binop: l_span.shrink_to_hi().to(r_span), nan_plus_binop: l_span.shrink_to_hi().to(r_span),
float: l_span.shrink_to_hi(), float: l_span.shrink_to_hi(),
neg: (binop.node == hir::BinOpKind::Ne).then(|| l_span.shrink_to_lo()), neg: (binop.node == hir::BinOpKind::Ne).then(|| l_span.shrink_to_lo()),

View File

@ -3944,11 +3944,12 @@ impl<'a: 'ast, 'b, 'ast, 'tcx> LateResolutionVisitor<'a, 'b, 'ast, 'tcx> {
if path.len() > 1 if path.len() > 1
&& let Some(res) = result.full_res() && let Some(res) = result.full_res()
&& let Some((&last_segment, prev_segs)) = path.split_last()
&& prev_segs.iter().all(|seg| !seg.has_generic_args)
&& res != Res::Err && res != Res::Err
&& path[0].ident.name != kw::PathRoot && path[0].ident.name != kw::PathRoot
&& path[0].ident.name != kw::DollarCrate && path[0].ident.name != kw::DollarCrate
{ {
let last_segment = *path.last().unwrap();
let unqualified_result = { let unqualified_result = {
match self.resolve_path(&[last_segment], Some(ns), None) { match self.resolve_path(&[last_segment], Some(ns), None) {
PathResult::NonModule(path_res) => path_res.expect_full_res(), PathResult::NonModule(path_res) => path_res.expect_full_res(),

View File

@ -391,13 +391,19 @@ impl<'a, 'tcx> EvalCtxt<'a, 'tcx> {
debug!("rerunning goal to check result is stable"); debug!("rerunning goal to check result is stable");
self.search_graph.reset_encountered_overflow(encountered_overflow); self.search_graph.reset_encountered_overflow(encountered_overflow);
let (_orig_values, canonical_goal) = self.canonicalize_goal(goal); let (_orig_values, canonical_goal) = self.canonicalize_goal(goal);
let new_canonical_response = EvalCtxt::evaluate_canonical_goal( let Ok(new_canonical_response) = EvalCtxt::evaluate_canonical_goal(
self.tcx(), self.tcx(),
self.search_graph, self.search_graph,
canonical_goal, canonical_goal,
// FIXME(-Ztrait-solver=next): we do not track what happens in `evaluate_canonical_goal` // FIXME(-Ztrait-solver=next): we do not track what happens in `evaluate_canonical_goal`
&mut ProofTreeBuilder::new_noop(), &mut ProofTreeBuilder::new_noop(),
)?; ) else {
bug!(
"goal went from {certainty:?} to error: re-canonicalized goal={canonical_goal:#?} \
first_response={canonical_response:#?},
second response was error"
);
};
// We only check for modulo regions as we convert all regions in // We only check for modulo regions as we convert all regions in
// the input to new existentials, even if they're expected to be // the input to new existentials, even if they're expected to be
// `'static` or a placeholder region. // `'static` or a placeholder region.

View File

@ -28,18 +28,18 @@ define-function: (
call-function: ("check-color", { call-function: ("check-color", {
"theme": "ayu", "theme": "ayu",
"toggle_line_color": "rgb(153, 153, 153)", "toggle_line_color": "#999",
"toggle_line_hover_color": "rgb(197, 197, 197)", "toggle_line_hover_color": "#c5c5c5",
}) })
call-function: ("check-color", { call-function: ("check-color", {
"theme": "dark", "theme": "dark",
"toggle_line_color": "rgb(153, 153, 153)", "toggle_line_color": "#999",
"toggle_line_hover_color": "rgb(197, 197, 197)", "toggle_line_hover_color": "#c5c5c5",
}) })
call-function: ("check-color", { call-function: ("check-color", {
"theme": "light", "theme": "light",
"toggle_line_color": "rgb(204, 204, 204)", "toggle_line_color": "#ccc",
"toggle_line_hover_color": "rgb(153, 153, 153)", "toggle_line_hover_color": "#999",
}) })
// Toggling all docs will close additional examples // Toggling all docs will close additional examples

View File

@ -5,11 +5,6 @@ LL | const TEST: bool = 5f32 == f32::NAN;
| ^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^
| |
= note: `#[warn(invalid_nan_comparisons)]` on by default = note: `#[warn(invalid_nan_comparisons)]` on by default
help: use `f32::is_nan()` or `f64::is_nan()` instead
|
LL - const TEST: bool = 5f32 == f32::NAN;
LL + const TEST: bool = 5f32.is_nan();
|
warning: incorrect NaN comparison, NaN cannot be directly compared to itself warning: incorrect NaN comparison, NaN cannot be directly compared to itself
--> $DIR/invalid-nan-comparison.rs:14:5 --> $DIR/invalid-nan-comparison.rs:14:5

View File

@ -0,0 +1,10 @@
#![deny(unused_qualifications)]
// check-pass
fn bar() {
match Option::<Option<()>>::None {
Some(v) => {}
None => {}
}
}
fn main() {}