-
Notifications
You must be signed in to change notification settings - Fork 13.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
794cb89
commit bb2cb89
Showing
2 changed files
with
52 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
// check-pass | ||
|
||
// This test verifies that negative trait predicate cannot be satisfied from a | ||
// positive param-env candidate. | ||
|
||
// Negative coherence is one of the only places where we actually construct and | ||
// evaluate negative predicates. Specifically, when verifying whether the first | ||
// and second impls below overlap, we do not want to consider them disjoint, | ||
// otherwise the second impl would be missing an associated type `type Item` | ||
// which is provided by the first impl that it is specializing. | ||
|
||
#![feature(specialization)] | ||
//~^ WARN the feature `specialization` is incomplete | ||
#![feature(with_negative_coherence)] | ||
|
||
trait BoxIter { | ||
type Item; | ||
|
||
fn last(self) -> Option<Self::Item>; | ||
} | ||
|
||
impl<I: Iterator + ?Sized> BoxIter for Box<I> { | ||
type Item = I::Item; | ||
|
||
default fn last(self) -> Option<I::Item> { | ||
todo!() | ||
} | ||
} | ||
|
||
// When checking that this impl does/doesn't overlap the one above, we evaluate | ||
// a negative version of all of the where-clause predicates of the impl below. | ||
// For `I: !Iterator`, we should make sure that the param-env clause `I: Iterator` | ||
// from above doesn't satisfy this predicate. | ||
impl<I: Iterator> BoxIter for Box<I> { | ||
fn last(self) -> Option<I::Item> { | ||
(*self).last() | ||
} | ||
} | ||
|
||
fn main() {} |
12 changes: 12 additions & 0 deletions
12
tests/ui/traits/new-solver/negative-coherence-bounds.stderr
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
warning: the feature `specialization` is incomplete and may not be safe to use and/or cause compiler crashes | ||
--> $DIR/negative-coherence-bounds.rs:12:12 | ||
| | ||
LL | #![feature(specialization)] | ||
| ^^^^^^^^^^^^^^ | ||
| | ||
= note: see issue #31844 <https://github.com/rust-lang/rust/issues/31844> for more information | ||
= help: consider using `min_specialization` instead, which is more stable and complete | ||
= note: `#[warn(incomplete_features)]` on by default | ||
|
||
warning: 1 warning emitted | ||
|