mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-26 08:44:35 +00:00
Don't compute trait super bounds unless they're positive
This commit is contained in:
parent
eac35583d2
commit
930eece9d3
@ -657,14 +657,15 @@ pub(super) fn implied_predicates_with_filter(
|
||||
&*tcx.arena.alloc_from_iter(superbounds.predicates().chain(where_bounds_that_match));
|
||||
debug!(?implied_bounds);
|
||||
|
||||
// Now require that immediate supertraits are converted,
|
||||
// which will, in turn, reach indirect supertraits.
|
||||
// Now require that immediate supertraits are converted, which will, in
|
||||
// turn, reach indirect supertraits, so we detect cycles now instead of
|
||||
// overflowing during elaboration.
|
||||
if matches!(filter, PredicateFilter::SelfOnly) {
|
||||
// Now require that immediate supertraits are converted,
|
||||
// which will, in turn, reach indirect supertraits.
|
||||
for &(pred, span) in implied_bounds {
|
||||
debug!("superbound: {:?}", pred);
|
||||
if let ty::PredicateKind::Clause(ty::Clause::Trait(bound)) = pred.kind().skip_binder() {
|
||||
if let ty::PredicateKind::Clause(ty::Clause::Trait(bound)) = pred.kind().skip_binder()
|
||||
&& bound.polarity == ty::ImplPolarity::Positive
|
||||
{
|
||||
tcx.at(span).super_predicates_of(bound.def_id());
|
||||
}
|
||||
}
|
||||
|
9
tests/ui/traits/negative-bounds/supertrait.rs
Normal file
9
tests/ui/traits/negative-bounds/supertrait.rs
Normal file
@ -0,0 +1,9 @@
|
||||
// check-pass
|
||||
|
||||
#![feature(negative_bounds)]
|
||||
//~^ WARN the feature `negative_bounds` is incomplete
|
||||
|
||||
trait A: !B {}
|
||||
trait B: !A {}
|
||||
|
||||
fn main() {}
|
10
tests/ui/traits/negative-bounds/supertrait.stderr
Normal file
10
tests/ui/traits/negative-bounds/supertrait.stderr
Normal file
@ -0,0 +1,10 @@
|
||||
warning: the feature `negative_bounds` is incomplete and may not be safe to use and/or cause compiler crashes
|
||||
--> $DIR/supertrait.rs:3:12
|
||||
|
|
||||
LL | #![feature(negative_bounds)]
|
||||
| ^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: `#[warn(incomplete_features)]` on by default
|
||||
|
||||
warning: 1 warning emitted
|
||||
|
Loading…
Reference in New Issue
Block a user