diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2023-04-25 21:06:34 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-04-25 21:06:34 +0200 |
| commit | 95e9f68eb50cfdaa830b07b3d960a311e4a0e540 (patch) | |
| tree | cbdea99a2b39fc3a006ee565697ee6b90c6488c5 /tests | |
| parent | 94dfb3ba78e211ea2a650b7aaeff2b79e0235003 (diff) | |
| parent | bb2cb89ead84128441472ffec7e5c9174ce204e7 (diff) | |
| download | rust-95e9f68eb50cfdaa830b07b3d960a311e4a0e540.tar.gz rust-95e9f68eb50cfdaa830b07b3d960a311e4a0e540.zip | |
Rollup merge of #110671 - compiler-errors:polarity, r=lcnr
Consider polarity in new solver It's kinda ugly to have a polarity check in all of the builtin impls -- I guess I could consider the polarity at the top of assemble-builtin but that would require adding a polarity fn to `GoalKind`... :shrug: putting this up just so i dont forget, since it's needed to bootstrap core during coherence (this alone does not allow core to bootstrap though, additional work is needed!) r? ``@lcnr``
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/ui/traits/new-solver/negative-coherence-bounds.rs | 40 | ||||
| -rw-r--r-- | tests/ui/traits/new-solver/negative-coherence-bounds.stderr | 12 |
2 files changed, 52 insertions, 0 deletions
diff --git a/tests/ui/traits/new-solver/negative-coherence-bounds.rs b/tests/ui/traits/new-solver/negative-coherence-bounds.rs new file mode 100644 index 00000000000..5436b02c3de --- /dev/null +++ b/tests/ui/traits/new-solver/negative-coherence-bounds.rs @@ -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() {} diff --git a/tests/ui/traits/new-solver/negative-coherence-bounds.stderr b/tests/ui/traits/new-solver/negative-coherence-bounds.stderr new file mode 100644 index 00000000000..4127f51f56d --- /dev/null +++ b/tests/ui/traits/new-solver/negative-coherence-bounds.stderr @@ -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 + |
