Skip to content

Commit

Permalink
Auto merge of #103683 - fee1-dead-contrib:fix-deferred-cast-checks-co…
Browse files Browse the repository at this point in the history
…nstness, r=oli-obk

Retain ParamEnv constness when running deferred cast checks

Fixes #103677.
  • Loading branch information
bors committed Oct 28, 2022
2 parents 77e7b74 + a990b4c commit 9565dfe
Show file tree
Hide file tree
Showing 5 changed files with 33 additions and 5 deletions.
5 changes: 4 additions & 1 deletion compiler/rustc_hir_typeck/src/cast.rs
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@ pub struct CastCheck<'tcx> {
cast_ty: Ty<'tcx>,
cast_span: Span,
span: Span,
/// whether the cast is made in a const context or not.
pub constness: hir::Constness,
}

/// The kind of pointer and associated metadata (thin, length or vtable) - we
Expand Down Expand Up @@ -210,9 +212,10 @@ impl<'a, 'tcx> CastCheck<'tcx> {
cast_ty: Ty<'tcx>,
cast_span: Span,
span: Span,
constness: hir::Constness,
) -> Result<CastCheck<'tcx>, ErrorGuaranteed> {
let expr_span = expr.span.find_ancestor_inside(span).unwrap_or(expr.span);
let check = CastCheck { expr, expr_ty, expr_span, cast_ty, cast_span, span };
let check = CastCheck { expr, expr_ty, expr_span, cast_ty, cast_span, span, constness };

// For better error messages, check for some obviously unsized
// cases now. We do a more thorough check at the end, once
Expand Down
10 changes: 9 additions & 1 deletion compiler/rustc_hir_typeck/src/expr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1272,7 +1272,15 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
} else {
// Defer other checks until we're done type checking.
let mut deferred_cast_checks = self.deferred_cast_checks.borrow_mut();
match cast::CastCheck::new(self, e, t_expr, t_cast, t.span, expr.span) {
match cast::CastCheck::new(
self,
e,
t_expr,
t_cast,
t.span,
expr.span,
self.param_env.constness(),
) {
Ok(cast_check) => {
debug!(
"check_expr_cast: deferring cast from {:?} to {:?}: {:?}",
Expand Down
15 changes: 13 additions & 2 deletions compiler/rustc_hir_typeck/src/fn_ctxt/checks.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,16 +33,27 @@ use rustc_span::{self, sym, Span};
use rustc_trait_selection::traits::{self, ObligationCauseCode, SelectionContext};

use std::iter;
use std::mem;
use std::ops::ControlFlow;
use std::slice;

impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
pub(in super::super) fn check_casts(&self) {
let mut deferred_cast_checks = self.deferred_cast_checks.borrow_mut();
pub(in super::super) fn check_casts(&mut self) {
// don't hold the borrow to deferred_cast_checks while checking to avoid borrow checker errors
// when writing to `self.param_env`.
let mut deferred_cast_checks = mem::take(&mut *self.deferred_cast_checks.borrow_mut());

debug!("FnCtxt::check_casts: {} deferred checks", deferred_cast_checks.len());
for cast in deferred_cast_checks.drain(..) {
let prev_env = self.param_env;
self.param_env = self.param_env.with_constness(cast.constness);

cast.check(self);

self.param_env = prev_env;
}

*self.deferred_cast_checks.borrow_mut() = deferred_cast_checks;
}

pub(in super::super) fn check_transmutes(&self) {
Expand Down
5 changes: 5 additions & 0 deletions src/test/ui/rfc-2632-const-trait-impl/issue-103677.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
// check-pass

const _: fn(&String) = |s| { &*s as &str; };

fn main() {}
3 changes: 2 additions & 1 deletion src/tools/clippy/clippy_lints/src/transmute/utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ use rustc_hir_typeck::{cast, FnCtxt, Inherited};
use rustc_lint::LateContext;
use rustc_middle::ty::{cast::CastKind, Ty};
use rustc_span::DUMMY_SP;
use rustc_hir as hir;

// check if the component types of the transmuted collection and the result have different ABI,
// size or alignment
Expand Down Expand Up @@ -56,7 +57,7 @@ fn check_cast<'tcx>(cx: &LateContext<'tcx>, e: &'tcx Expr<'_>, from_ty: Ty<'tcx>
if let Ok(check) = cast::CastCheck::new(
&fn_ctxt, e, from_ty, to_ty,
// We won't show any error to the user, so we don't care what the span is here.
DUMMY_SP, DUMMY_SP,
DUMMY_SP, DUMMY_SP, hir::Constness::NotConst,
) {
let res = check.do_check(&fn_ctxt);

Expand Down

0 comments on commit 9565dfe

Please sign in to comment.