Rollup merge of #143307 - compiler-errors:fast-path-nitpicks, r=lcnr
Fast path nitpicks Miscellaneous commits that I didn't really want to fold into anything else. Fixes one theoretical bug with the fast path not considering polarity for `T: !Sized` bounds.
This commit is contained in:
commit
9de211b95a
5 changed files with 31 additions and 24 deletions
|
|
@ -21,19 +21,9 @@ impl<'tcx> super::QueryTypeOp<'tcx> for ProvePredicate<'tcx> {
|
|||
|
||||
if let ty::PredicateKind::Clause(ty::ClauseKind::WellFormed(term)) =
|
||||
key.value.predicate.kind().skip_binder()
|
||||
&& term.is_trivially_wf(tcx)
|
||||
{
|
||||
match term.as_type()?.kind() {
|
||||
ty::Param(_)
|
||||
| ty::Bool
|
||||
| ty::Char
|
||||
| ty::Int(_)
|
||||
| ty::Float(_)
|
||||
| ty::Str
|
||||
| ty::Uint(_) => {
|
||||
return Some(());
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
return Some(());
|
||||
}
|
||||
|
||||
None
|
||||
|
|
|
|||
|
|
@ -368,16 +368,17 @@ pub fn sizedness_fast_path<'tcx>(tcx: TyCtxt<'tcx>, predicate: ty::Predicate<'tc
|
|||
// Proving `Sized`/`MetaSized`, very often on "obviously sized" types like
|
||||
// `&T`, accounts for about 60% percentage of the predicates we have to prove. No need to
|
||||
// canonicalize and all that for such cases.
|
||||
if let ty::PredicateKind::Clause(ty::ClauseKind::Trait(trait_ref)) =
|
||||
if let ty::PredicateKind::Clause(ty::ClauseKind::Trait(trait_pred)) =
|
||||
predicate.kind().skip_binder()
|
||||
&& trait_pred.polarity == ty::PredicatePolarity::Positive
|
||||
{
|
||||
let sizedness = match tcx.as_lang_item(trait_ref.def_id()) {
|
||||
let sizedness = match tcx.as_lang_item(trait_pred.def_id()) {
|
||||
Some(LangItem::Sized) => SizedTraitKind::Sized,
|
||||
Some(LangItem::MetaSized) => SizedTraitKind::MetaSized,
|
||||
_ => return false,
|
||||
};
|
||||
|
||||
if trait_ref.self_ty().has_trivial_sizedness(tcx, sizedness) {
|
||||
if trait_pred.self_ty().has_trivial_sizedness(tcx, sizedness) {
|
||||
debug!("fast path -- trivial sizedness");
|
||||
return true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,11 +6,11 @@
|
|||
use rustc_infer::infer::TyCtxtInferExt;
|
||||
use rustc_middle::bug;
|
||||
use rustc_middle::traits::CodegenObligationError;
|
||||
use rustc_middle::ty::{self, PseudoCanonicalInput, TyCtxt, TypeVisitableExt, Upcast};
|
||||
use rustc_middle::ty::{self, PseudoCanonicalInput, TyCtxt, TypeVisitableExt};
|
||||
use rustc_trait_selection::error_reporting::InferCtxtErrorExt;
|
||||
use rustc_trait_selection::traits::{
|
||||
ImplSource, Obligation, ObligationCause, ObligationCtxt, ScrubbedTraitError, SelectionContext,
|
||||
SelectionError, sizedness_fast_path,
|
||||
SelectionError,
|
||||
};
|
||||
use tracing::debug;
|
||||
|
||||
|
|
@ -34,13 +34,6 @@ pub(crate) fn codegen_select_candidate<'tcx>(
|
|||
let (infcx, param_env) = tcx.infer_ctxt().ignoring_regions().build_with_typing_env(typing_env);
|
||||
let mut selcx = SelectionContext::new(&infcx);
|
||||
|
||||
if sizedness_fast_path(tcx, trait_ref.upcast(tcx)) {
|
||||
return Ok(&*tcx.arena.alloc(ImplSource::Builtin(
|
||||
ty::solve::BuiltinImplSource::Trivial,
|
||||
Default::default(),
|
||||
)));
|
||||
}
|
||||
|
||||
let obligation_cause = ObligationCause::dummy();
|
||||
let obligation = Obligation::new(tcx, obligation_cause, param_env, trait_ref);
|
||||
|
||||
|
|
|
|||
8
tests/ui/traits/negative-bounds/negative-sized.rs
Normal file
8
tests/ui/traits/negative-bounds/negative-sized.rs
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
#![feature(negative_bounds)]
|
||||
|
||||
fn foo<T: !Sized>() {}
|
||||
|
||||
fn main() {
|
||||
foo::<()>();
|
||||
//~^ ERROR the trait bound `(): !Sized` is not satisfied
|
||||
}
|
||||
15
tests/ui/traits/negative-bounds/negative-sized.stderr
Normal file
15
tests/ui/traits/negative-bounds/negative-sized.stderr
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
error[E0277]: the trait bound `(): !Sized` is not satisfied
|
||||
--> $DIR/negative-sized.rs:6:11
|
||||
|
|
||||
LL | foo::<()>();
|
||||
| ^^ the trait bound `(): !Sized` is not satisfied
|
||||
|
|
||||
note: required by a bound in `foo`
|
||||
--> $DIR/negative-sized.rs:3:11
|
||||
|
|
||||
LL | fn foo<T: !Sized>() {}
|
||||
| ^^^^^^ required by this bound in `foo`
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0277`.
|
||||
Loading…
Add table
Add a link
Reference in a new issue