rust/tests/ui/impl-trait
bors 9ab0749ce3 Auto merge of #112875 - compiler-errors:negative-coherence-rework, r=lcnr
Rework negative coherence to properly consider impls that only partly overlap

This PR implements a modified negative coherence that handles impls that only have partial overlap.

It does this by:
1. taking both impl trait refs, instantiating them with infer vars
2. equating both trait refs
3. taking the equated trait ref (which represents the two impls' intersection), and resolving any vars
4. plugging all remaining infer vars with placeholder types

these placeholder-plugged trait refs can then be used normally with the new trait solver, since we no longer have to worry about the issue with infer vars in param-envs.

We use the **new trait solver** to reason correctly about unnormalized trait refs (due to deferred projection equality), since this avoid having to normalize anything under param-envs with infer vars in them.

This PR then additionally:
* removes the `FnPtr` knowable hack by implementing proper negative `FnPtr` trait bounds for rigid types.

---

An example:

Consider these two partially overlapping impls:

```
impl<T, U> PartialEq<&U> for &T where T: PartialEq<U> {}
impl<F> PartialEq<F> for F where F: FnPtr {}
```

Under the old algorithm, we would take one of these impls and replace it with infer vars, then try unifying it with the other impl under identity substitutions. This is not possible in either direction, since it either sets `T = U`, or tries to equate `F = &?0`.

Under the new algorithm, we try to unify `?0: PartialEq<?0>` with `&?1: PartialEq<&?2>`. This gives us `?0 = &?1 = &?2` and thus `?1 = ?2`. The intersection of these two trait refs therefore looks like: `&?1: PartialEq<&?1>`. After plugging this with placeholders, we get a trait ref that looks like `&!0: PartialEq<&!0>`, with the first impl having substs `?T = ?U = !0` and the second having substs `?F = &!0`[^1].

Then we can take the param-env from the first impl, and try to prove the negated where clause of the second.

We know that `&!0: !FnPtr` never holds, since it's a rigid type that is also not a fn ptr, we successfully detect that these impls may never overlap.

[^1]: For the purposes of this example, I just ignored lifetimes, since it doesn't really matter.
2023-10-26 10:57:21 +00:00
..
alias-liveness Add some unsoundness tests for opaques capturing hidden regions not in substs 2023-10-14 13:26:30 +00:00
auxiliary
diagnostics
explicit-generic-args-with-impl-trait
in-trait Remove incomplete features from RPITIT/AFIT tests 2023-10-24 15:27:06 +00:00
issues s/generator/coroutine/ 2023-10-20 21:14:01 +00:00
multiple-lifetimes
rpit check for non-defining uses of RPIT 2023-08-14 15:25:20 +02:00
arg-position-impl-trait-too-long.rs
arg-position-impl-trait-too-long.stderr Tweak wording of type errors involving type params 2023-10-18 23:53:18 +00:00
associated-impl-trait-type-generic-trait.rs
associated-impl-trait-type-trivial.rs
associated-impl-trait-type.rs
async_scope_creep.rs Remove DefiningAnchor::Bubble from opaque wf check 2023-10-16 15:50:31 +00:00
auto-trait-coherence.next.stderr explicitly handle auto trait leakage in coherence 2023-10-13 09:42:51 +00:00
auto-trait-coherence.old.stderr explicitly handle auto trait leakage in coherence 2023-10-13 09:42:51 +00:00
auto-trait-coherence.rs explicitly handle auto trait leakage in coherence 2023-10-13 09:42:51 +00:00
auto-trait-leak2.rs Revert "Suggest using Arc on !Send/!Sync types" 2023-08-28 03:16:48 -07:00
auto-trait-leak2.stderr Revert "Suggest using Arc on !Send/!Sync types" 2023-08-28 03:16:48 -07:00
auto-trait-leak-rpass.rs
auto-trait-leak.rs More precisely detect cycle errors from type_of on opaque 2023-08-27 22:03:16 +00:00
auto-trait-leak.stderr More precisely detect cycle errors from type_of on opaque 2023-08-27 22:03:16 +00:00
autoderef.rs Consider a goal as NOT changed if its response is identity modulo regions 2023-07-27 04:00:49 +00:00
bound-normalization-fail.rs Stabilize impl_trait_projections 2023-09-08 03:45:36 +00:00
bound-normalization-fail.stderr Stabilize impl_trait_projections 2023-09-08 03:45:36 +00:00
bound-normalization-pass.rs
bounds_regression.rs s/generator/coroutine/ 2023-10-20 21:14:01 +00:00
can-return-unconstrained-closure.rs
capture-lifetime-not-in-hir.rs Stabilize impl_trait_projections 2023-09-08 03:45:36 +00:00
capture-lifetime-not-in-hir.stderr Stabilize impl_trait_projections 2023-09-08 03:45:36 +00:00
closure-calling-parent-fn.rs
closure-in-impl-trait-arg.rs
closure-in-impl-trait.rs
coherence-treats-tait-ambig.current.stderr
coherence-treats-tait-ambig.rs update tests 2023-09-21 08:17:58 +02:00
coherence-treats-tait-ambig.stderr update tests 2023-09-21 08:17:58 +02:00
cross-return-site-inference.rs Reorder fullfillment errors to keep more interesting ones first 2023-10-04 02:04:14 +00:00
cross-return-site-inference.stderr Show suggestion for <SelfTy as Trait>::assoc_fn in more cases and fmt code 2023-10-04 02:04:14 +00:00
deduce-signature-from-supertrait.rs Require TAITs to be mentioned in the signatures of functions that register hidden types for them 2023-07-07 13:13:18 +00:00
defined-by-trait-resolution.rs allow opaques to be defined by trait queries 2023-07-14 12:35:33 +00:00
deprecated_annotation.rs
divergence.rs
does-not-live-long-enough.rs
does-not-live-long-enough.stderr
dont-suggest-box-on-empty-else-arm.rs
dont-suggest-box-on-empty-else-arm.stderr
dyn-trait-elided-two-inputs-assoc.rs
dyn-trait-elided-two-inputs-param.rs
dyn-trait-elided-two-inputs-ref-assoc.rs
dyn-trait-elided-two-inputs-ref-param.rs
dyn-trait-return-should-be-impl-trait.rs
dyn-trait-return-should-be-impl-trait.stderr
equal-hidden-lifetimes.rs
equality2.rs
equality2.stderr
equality-in-canonical-query.clone.stderr revert rust-lang/rust#114586 2023-10-18 06:19:04 +00:00
equality-in-canonical-query.rs revert rust-lang/rust#114586 2023-10-18 06:19:04 +00:00
equality-rpass.rs
equality-rpass.stderr
equality.rs
equality.stderr
erased-regions-in-hidden-ty.current.stderr Let's see what those opaque types actually are 2023-10-23 16:18:35 -04:00
erased-regions-in-hidden-ty.next.stderr Let's see what those opaque types actually are 2023-10-23 16:18:35 -04:00
erased-regions-in-hidden-ty.rs Let's see what those opaque types actually are 2023-10-23 16:18:35 -04:00
example-calendar.rs
example-st.rs
extra-impl-in-trait-impl.fixed
extra-impl-in-trait-impl.rs
extra-impl-in-trait-impl.stderr
extra-item.rs
extra-item.stderr
fallback_inference.rs
fallback_inference.stderr
fallback.rs
feature-self-return-type.rs Stabilize impl_trait_projections 2023-09-08 03:45:36 +00:00
feature-self-return-type.stderr Stabilize impl_trait_projections 2023-09-08 03:45:36 +00:00
fresh-lifetime-from-bare-trait-obj-114664.rs Record binder for bare trait object in LifetimeCollectVisitor 2023-08-11 03:15:41 +00:00
fresh-lifetime-from-bare-trait-obj-114664.stderr Add a note to duplicate diagnostics 2023-10-05 01:04:41 +00:00
generic-with-implicit-hrtb-without-dyn.edition2015.stderr
generic-with-implicit-hrtb-without-dyn.edition2021.stderr
generic-with-implicit-hrtb-without-dyn.rs
hidden-lifetimes.rs
hidden-lifetimes.stderr
hidden-type-is-opaque-2.rs Fix invalid suggestion for mismatched types in closure arguments 2023-07-30 17:15:55 +02:00
hidden-type-is-opaque-2.stderr Fix invalid suggestion for mismatched types in closure arguments 2023-07-30 17:15:55 +02:00
hidden-type-is-opaque.rs
impl_fn_associativity.rs
impl_trait_projections.rs
impl_trait_projections.stderr
impl-fn-hrtb-bounds-2.rs
impl-fn-hrtb-bounds-2.stderr
impl-fn-hrtb-bounds.rs
impl-fn-hrtb-bounds.stderr
impl-fn-parsing-ambiguities.rs
impl-fn-parsing-ambiguities.stderr
impl-fn-predefined-lifetimes.rs
impl-fn-predefined-lifetimes.stderr
impl-generic-mismatch-ab.rs
impl-generic-mismatch-ab.stderr
impl-generic-mismatch.rs
impl-generic-mismatch.stderr
impl-subtyper2.rs move subtyper change reveal_all 2023-10-05 18:56:30 +03:00
impl-subtyper.rs move subtyper change reveal_all 2023-10-05 18:56:30 +03:00
impl-trait-in-macro.rs
impl-trait-in-macro.stderr
impl-trait-plus-priority.rs
impl-trait-plus-priority.stderr
in-assoc-type-unconstrained.rs
in-assoc-type-unconstrained.stderr
in-assoc-type.rs Require TAITs to be mentioned in the signatures of functions that register hidden types for them 2023-07-07 13:13:18 +00:00
in-assoc-type.stderr Require TAITs to be mentioned in the signatures of functions that register hidden types for them 2023-07-07 13:13:18 +00:00
issue-35668.rs
issue-35668.stderr
issue-36792.rs
issue-46959.rs
issue-49556.rs
issue-49579.rs
issue-49685.rs
issue-51185.rs
issue-54966.rs
issue-54966.stderr
issue-55872-1.rs
issue-55872-1.stderr
issue-55872-2.rs Bless tests. 2023-09-23 13:47:30 +00:00
issue-55872-2.stderr Add a note to duplicate diagnostics 2023-10-05 01:04:41 +00:00
issue-55872-3.rs Remove compare mode 2023-07-03 21:40:04 +00:00
issue-55872-3.stderr adjust how closure/generator types and rvalues are printed 2023-09-21 22:20:58 +02:00
issue-55872.rs
issue-55872.stderr
issue-56445.rs
issue-68532.rs
issue-72911.rs
issue-72911.stderr
issue-86465.rs Revert "Auto merge of #102417 - oli-obk:opaque_lifetimes2, r=jackh726" 2023-08-30 11:06:46 +00:00
issue-86465.stderr Revert "Auto merge of #102417 - oli-obk:opaque_lifetimes2, r=jackh726" 2023-08-30 11:06:46 +00:00
issue-87450.rs
issue-87450.stderr
issue-99073-2.rs check for non-defining uses of RPIT 2023-08-14 15:25:20 +02:00
issue-99073-2.stderr check for non-defining uses of RPIT 2023-08-14 15:25:20 +02:00
issue-99073.rs check for non-defining uses of RPIT 2023-08-14 15:25:20 +02:00
issue-99073.stderr adjust how closure/generator types and rvalues are printed 2023-09-21 22:20:58 +02:00
issue-99642-2.rs
issue-99642.rs
issue-99914.rs
issue-99914.stderr
issue-100075-2.rs
issue-100075-2.stderr
issue-100075.rs
issue-100075.stderr
issue-100187.rs
issue-102605.rs
issue-102605.stderr Check entry type as part of item type checking. 2023-07-15 22:02:16 +00:00
issue-103181-1.current.stderr
issue-103181-1.next.stderr
issue-103181-1.rs
issue-103181-2.rs More precisely detect cycle errors from type_of on opaque 2023-08-27 22:03:16 +00:00
issue-103181-2.stderr More precisely detect cycle errors from type_of on opaque 2023-08-27 22:03:16 +00:00
issue-103599.rs
issue-103599.stderr
issue-108591.rs Revert "Auto merge of #102417 - oli-obk:opaque_lifetimes2, r=jackh726" 2023-08-30 11:06:46 +00:00
issue-108592.rs Revert "Auto merge of #102417 - oli-obk:opaque_lifetimes2, r=jackh726" 2023-08-30 11:06:46 +00:00
lifetime-ambiguity-regression.rs Paper over an accidental regression 2023-09-14 15:16:48 +00:00
lifetimes2.rs
lifetimes.rs s/generator/coroutine/ 2023-10-20 21:14:01 +00:00
mapping-duplicated-lifetimes-issue-114597.rs add'l test 2023-08-08 09:39:59 +00:00
method-suggestion-no-duplication.rs
method-suggestion-no-duplication.stderr
multiple-defining-usages-in-body.rs
multiple-defining-usages-in-body.stderr
must_outlive_least_region_or_bound.rs
must_outlive_least_region_or_bound.stderr remove trailing dots 2023-10-08 10:06:17 +00:00
needs_least_region_or_bound.rs
negative-reasoning.rs
negative-reasoning.stderr Make things work by using the new solver 2023-10-23 23:35:27 +00:00
nested_impl_trait.rs Tweak wording of E0562 2023-10-04 19:51:43 +00:00
nested_impl_trait.stderr Tweak wording of E0562 2023-10-04 19:51:43 +00:00
nested-return-type2-tait2.rs Remove DefiningAnchor::Bubble from opaque wf check 2023-10-16 15:50:31 +00:00
nested-return-type2-tait2.stderr Remove DefiningAnchor::Bubble from opaque wf check 2023-10-16 15:50:31 +00:00
nested-return-type2-tait3.rs Remove DefiningAnchor::Bubble from opaque wf check 2023-10-16 15:50:31 +00:00
nested-return-type2-tait3.stderr Remove DefiningAnchor::Bubble from opaque wf check 2023-10-16 15:50:31 +00:00
nested-return-type2-tait.rs
nested-return-type2-tait.stderr
nested-return-type2.rs
nested-return-type3-tait2.rs
nested-return-type3-tait2.stderr
nested-return-type3-tait3.rs
nested-return-type3-tait3.stderr
nested-return-type3-tait.rs
nested-return-type3-tait.stderr
nested-return-type3.rs
nested-return-type4.rs
nested-return-type4.stderr adjust how closure/generator types and rvalues are printed 2023-09-21 22:20:58 +02:00
nested-return-type.rs
nested-rpit-hrtb-2.rs don't ICE on higher ranked hidden types 2023-08-04 15:11:09 +00:00
nested-rpit-hrtb-2.stderr don't ICE on higher ranked hidden types 2023-08-04 15:11:09 +00:00
nested-rpit-hrtb.rs
nested-rpit-hrtb.stderr
nested-rpit-with-anonymous-lifetimes.rs
nesting.rs
no-method-suggested-traits.rs
no-method-suggested-traits.stderr
no-trait.rs
no-trait.stderr
normalize-opaque-with-bound-vars.rs
normalize-tait-in-const.rs update tests, adding known-bug 2023-07-27 15:51:02 +00:00
normalize-tait-in-const.stderr bless the known-bug tests 2023-09-20 03:02:14 +00:00
object-unsafe-trait-in-return-position-dyn-trait.rs
object-unsafe-trait-in-return-position-dyn-trait.stderr
object-unsafe-trait-in-return-position-impl-trait.rs
object-unsafe-trait-in-return-position-impl-trait.stderr
opaque-cast-field-access-in-future.rs Only prevent field projections into opaque types, not types containing opaque types 2023-09-25 17:41:08 +00:00
opaque-cast-field-access-in-future.stderr Reorder fullfillment errors to keep more interesting ones first 2023-10-04 02:04:14 +00:00
point-to-type-err-cause-on-impl-trait-return.rs
point-to-type-err-cause-on-impl-trait-return.stderr
printing-binder.rs
printing-binder.stderr
private_unused.rs
projection-mismatch-in-impl-where-clause.rs
projection-mismatch-in-impl-where-clause.stderr
projection.rs
question_mark.rs
recursive-auto-trait.rs deal with opaque types without cycling 2023-07-06 11:37:21 +02:00
recursive-coroutine.rs Rename lots of files that had generator in their name 2023-10-20 21:14:02 +00:00
recursive-coroutine.stderr Rename lots of files that had generator in their name 2023-10-20 21:14:02 +00:00
recursive-impl-trait-type-direct.rs
recursive-impl-trait-type-indirect.rs s/generator/coroutine/ 2023-10-20 21:14:01 +00:00
recursive-impl-trait-type-indirect.stderr s/generator/coroutine/ 2023-10-20 21:14:01 +00:00
recursive-impl-trait-type-through-non-recursive.rs
recursive-impl-trait-type-through-non-recursive.stderr
recursive-type-alias-impl-trait-declaration-too-subtle-2.rs
recursive-type-alias-impl-trait-declaration-too-subtle.rs
recursive-type-alias-impl-trait-declaration-too-subtle.stderr
recursive-type-alias-impl-trait-declaration.rs
recursive-type-alias-impl-trait-declaration.stderr
region-escape-via-bound-contravariant-closure.rs
region-escape-via-bound-contravariant.rs
region-escape-via-bound.rs
region-escape-via-bound.stderr
return-position-impl-trait-minimal.rs
reveal-during-codegen.rs Normalize opaques during codegen in new solver 2023-07-07 16:02:25 +00:00
rpit-assoc-pair-with-lifetime.rs
rpit-not-sized.rs
rpit-not-sized.stderr
static-lifetime-return-position-impl-trait.rs Stabilize AFIT and RPITIT 2023-10-13 21:01:36 +00:00
static-return-lifetime-infered.rs
static-return-lifetime-infered.stderr adjust how closure/generator types and rvalues are printed 2023-09-21 22:20:58 +02:00
suggest-calling-rpit-closure.rs
suggest-calling-rpit-closure.stderr
trait_resolution.rs
trait_type.rs
trait_type.stderr
two_tait_defining_each_other2.rs
two_tait_defining_each_other2.stderr
two_tait_defining_each_other3.rs
two_tait_defining_each_other3.stderr
two_tait_defining_each_other.rs
two_tait_defining_each_other.stderr
type_parameters_captured.rs
type_parameters_captured.stderr remove trailing dots 2023-10-08 10:06:17 +00:00
type-alias-generic-param.rs
type-alias-impl-trait-in-fn-body.rs
type-arg-mismatch-due-to-impl-trait.rs
type-arg-mismatch-due-to-impl-trait.stderr
unactionable_diagnostic.fixed remove trailing dots 2023-10-08 10:06:17 +00:00
unactionable_diagnostic.rs remove trailing dots 2023-10-08 10:06:17 +00:00
unactionable_diagnostic.stderr remove trailing dots 2023-10-08 10:06:17 +00:00
universal_hrtb_anon.rs
universal_hrtb_named.rs
universal_in_adt_in_parameters.rs
universal_in_impl_trait_in_parameters.rs
universal_in_trait_defn_parameters.rs
universal_multiple_bounds.rs
universal_wrong_bounds.rs
universal_wrong_bounds.stderr
universal_wrong_hrtb.rs
universal_wrong_hrtb.stderr
universal-mismatched-type.rs
universal-mismatched-type.stderr Tweak wording of type errors involving type params 2023-10-18 23:53:18 +00:00
universal-two-impl-traits.rs
universal-two-impl-traits.stderr
unsafety-checking-cycle.rs
variance.rs Test variances of opaque captures 2023-08-28 01:05:34 +00:00
variance.stderr Test variances of opaque captures 2023-08-28 01:05:34 +00:00
wf-eval-order.rs
where-allowed-2.rs
where-allowed-2.stderr Reorder fullfillment errors to keep more interesting ones first 2023-10-04 02:04:14 +00:00
where-allowed.rs Stabilize AFIT and RPITIT 2023-10-13 21:01:36 +00:00
where-allowed.stderr Stabilize AFIT and RPITIT 2023-10-13 21:01:36 +00:00
xcrate_simple.rs
xcrate.rs