Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions compiler/rustc_trait_selection/src/traits/util.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this has happened multiple times by now 🤔 forgetting the polarity is too damn easy right now 🤔

I can't really think of a good alternative apart from actually splitting ClauseKind::Trait and ClauseKind::NegTrait 🤔

removing the def_id etc functions on TraitPredicate to require trait_pred.trait_ref.def_id() instead feels really cumbersome and not that helpful 🤔 changing ClauseKind::Trait to have TraitRef and Polarity as separate fields so that we always have to use (_, _) could work but feels really ugly

anyways, not part of this PR

{
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;
}
Expand Down
8 changes: 8 additions & 0 deletions tests/ui/traits/negative-bounds/negative-sized.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#![feature(negative_bounds)]

fn foo<T: !Sized>() {}

fn main() {
foo::<()>();
//~^ ERROR the trait bound `(): !Sized` is not satisfied
}
15 changes: 15 additions & 0 deletions tests/ui/traits/negative-bounds/negative-sized.stderr
Original file line number Diff line number Diff line change
@@ -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`.