rust/compiler
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
..
rustc Split out the stable part of smir into its own crate to prevent accidental usage of forever unstable things 2023-09-25 14:38:27 +00:00
rustc_abi s/generator/coroutine/ 2023-10-20 21:14:01 +00:00
rustc_arena rustdoc: remove rust logo from non-Rust crates 2023-10-08 20:17:53 -07:00
rustc_ast use visibility to check unused imports and delete some stmts 2023-10-22 21:27:46 +08:00
rustc_ast_lowering Rename AsyncCoroutineKind to CoroutineSource 2023-10-25 16:14:05 +00:00
rustc_ast_passes s/generator/coroutine/ 2023-10-20 21:14:01 +00:00
rustc_ast_pretty Auto merge of #116822 - notriddle:notriddle/rust-logo, r=fmease 2023-10-17 04:41:20 +00:00
rustc_attr Expose a non-Symbol way to access current rustc version string 2023-10-24 18:11:20 -07:00
rustc_baked_icu_data docs: add Rust logo to more compiler crates 2023-10-16 15:38:08 -07:00
rustc_borrowck Rename AsyncCoroutineKind to CoroutineSource 2023-10-25 16:14:05 +00:00
rustc_builtin_macros Auto merge of #116236 - dtolnay:builtinmacrocomment, r=cjgillot 2023-10-25 06:57:37 +00:00
rustc_codegen_cranelift Merge commit '93a5433f17' into sync_cg_clif-2023-10-24 2023-10-24 12:22:23 +00:00
rustc_codegen_gcc s/generator/coroutine/ 2023-10-20 21:14:01 +00:00
rustc_codegen_llvm Auto merge of #116033 - bvanjoi:fix-116032, r=petrochenkov 2023-10-23 20:24:09 +00:00
rustc_codegen_ssa Auto merge of #117115 - zetafunction:linking, r=bjorn3 2023-10-26 04:04:50 +00:00
rustc_const_eval Refactor away the need for some descr methods. 2023-10-25 16:40:32 +00:00
rustc_data_structures Auto merge of #116849 - oli-obk:error_shenanigans, r=cjgillot 2023-10-23 09:59:40 +00:00
rustc_driver docs: add Rust logo to more compiler crates 2023-10-16 15:38:08 -07:00
rustc_driver_impl Auto merge of #116818 - Nilstrieb:stop-submitting-bug-reports, r=wesleywiser 2023-10-26 02:08:07 +00:00
rustc_error_codes Replace all uses of generator in markdown documentation with coroutine 2023-10-20 21:14:02 +00:00
rustc_error_messages docs: add Rust logo to more compiler crates 2023-10-16 15:38:08 -07:00
rustc_errors Auto merge of #116962 - estebank:issue-63835, r=oli-obk 2023-10-20 10:52:24 +00:00
rustc_expand Auto merge of #116818 - Nilstrieb:stop-submitting-bug-reports, r=wesleywiser 2023-10-26 02:08:07 +00:00
rustc_feature Rollup merge of #116943 - heiher:target-features, r=wesleywiser 2023-10-24 19:29:55 +02:00
rustc_fluent_macro Use v0.0.0 in compiler crates 2023-10-18 21:55:15 +00:00
rustc_fs_util Add try_canonicalize to rustc_fs_util and use it over fs::canonicalize 2023-03-16 21:50:23 +01:00
rustc_graphviz rustdoc: remove rust logo from non-Rust crates 2023-10-08 20:17:53 -07:00
rustc_hir Rollup merge of #117175 - oli-obk:gen_fn_split, r=compiler-errors 2023-10-25 23:37:11 +02:00
rustc_hir_analysis Rollup merge of #116553 - gurry:116464-assoc-type-invalid-suggestion, r=compiler-errors 2023-10-25 23:37:09 +02:00
rustc_hir_pretty Fiddle with State functions. 2023-10-11 10:46:55 +11:00
rustc_hir_typeck Rollup merge of #117175 - oli-obk:gen_fn_split, r=compiler-errors 2023-10-25 23:37:11 +02:00
rustc_incremental Auto merge of #115964 - bjorn3:cgu_reuse_tracker_global_state, r=cjgillot 2023-10-13 00:09:30 +00:00
rustc_index Preserve DebugInfo in DeadStoreElimination. 2023-10-06 15:46:11 +00:00
rustc_infer Refactor away the need for some descr methods. 2023-10-25 16:40:32 +00:00
rustc_interface Auto merge of #116818 - Nilstrieb:stop-submitting-bug-reports, r=wesleywiser 2023-10-26 02:08:07 +00:00
rustc_lexer Use v0.0.0 in compiler crates 2023-10-18 21:55:15 +00:00
rustc_lint Make ty::print::Printer take &mut self instead of self 2023-10-21 11:33:05 +02:00
rustc_lint_defs Auto merge of #116734 - Nadrieril:lint-per-column, r=cjgillot 2023-10-21 11:04:19 +00:00
rustc_llvm rustdoc: remove rust logo from non-Rust crates 2023-10-08 20:17:53 -07:00
rustc_log use env variable to control thread ids in rustc_log 2023-10-10 09:39:47 +08:00
rustc_macros Allow ensure queries to return Result<(), ErrorGuaranteed> 2023-10-23 08:20:29 +00:00
rustc_metadata s/generator/coroutine/ 2023-10-20 21:14:01 +00:00
rustc_middle Auto merge of #112875 - compiler-errors:negative-coherence-rework, r=lcnr 2023-10-26 10:57:21 +00:00
rustc_mir_build Make THIR unused_unsafe lint consistent with MIR 2023-10-25 10:10:13 +00:00
rustc_mir_dataflow Auto merge of #116300 - cjgillot:split-move, r=petrochenkov 2023-10-24 00:25:32 +00:00
rustc_mir_transform Rollup merge of #117141 - tmiasko:inline-target-features, r=oli-obk 2023-10-25 19:51:14 +02:00
rustc_monomorphize coverage: Change query codegened_and_inlined_items to a plain function 2023-10-21 12:20:05 +11:00
rustc_parse s/generator/coroutine/ 2023-10-20 21:14:01 +00:00
rustc_parse_format rustdoc: remove rust logo from non-Rust crates 2023-10-08 20:17:53 -07:00
rustc_passes Keep track of #[stable] attribute even if version cannot be parsed 2023-10-24 15:50:23 -07:00
rustc_plugin_impl rustdoc: remove rust logo from non-Rust crates 2023-10-08 20:17:53 -07:00
rustc_privacy Merge associated types with the other alias types 2023-10-23 10:10:22 +00:00
rustc_query_impl rustdoc: remove rust logo from non-Rust crates 2023-10-08 20:17:53 -07:00
rustc_query_system fix broken link: update incremental compilation url 2023-10-22 07:20:36 -07:00
rustc_resolve Rollup merge of #117009 - fmease:diag-disambig-sugg-crate, r=b-naber 2023-10-25 23:37:10 +02:00
rustc_serialize rustdoc: remove rust logo from non-Rust crates 2023-10-08 20:17:53 -07:00
rustc_session Auto merge of #116818 - Nilstrieb:stop-submitting-bug-reports, r=wesleywiser 2023-10-26 02:08:07 +00:00
rustc_smir Rollup merge of #117175 - oli-obk:gen_fn_split, r=compiler-errors 2023-10-25 23:37:11 +02:00
rustc_span Make Iterator a lang item 2023-10-25 16:18:57 +00:00
rustc_symbol_mangling Make ty::print::Printer take &mut self instead of self 2023-10-21 11:33:05 +02:00
rustc_target implement C ABI lowering for CSKY 2023-10-25 20:47:06 +08:00
rustc_trait_selection Auto merge of #112875 - compiler-errors:negative-coherence-rework, r=lcnr 2023-10-26 10:57:21 +00:00
rustc_traits Detect cycle errors hidden by opaques during monomorphization 2023-09-13 17:35:44 +00:00
rustc_transmute Use v0.0.0 in compiler crates 2023-10-18 21:55:15 +00:00
rustc_ty_utils Rollup merge of #117136 - compiler-errors:defid-list, r=oli-obk 2023-10-25 17:40:29 +02:00
rustc_type_ir Uplift Canonical to rustc_type_ir 2023-10-25 16:25:09 +00:00
stable_mir Rollup merge of #117175 - oli-obk:gen_fn_split, r=compiler-errors 2023-10-25 23:37:11 +02:00