rust/compiler
bors bd53aa3bf7 Auto merge of #129317 - compiler-errors:expectation-subtyping, r=lcnr
Use equality when relating formal and expected type in arg checking

#129059 uncovered an interesting issue in argument checking. When we check arguments, we create three sets of types:
* Formals
* Expected
* Actuals

The **actuals** are the types of the argument expressions themselves. The **formals** are the types from the signature that we're checking. The **expected** types are the formal types, but passed through `expected_inputs_for_expected_outputs`:

a971212545/compiler/rustc_hir_typeck/src/fn_ctxt/_impl.rs (L691-L725)

This method attempts to constrain the formal inputs by relating the [expectation](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_hir_typeck/expectation/enum.Expectation.html) of the call expression and the formal output.

When we check an argument, we get the expression's actual type, and then we first attempt to coerce it to the expected type:

a971212545/compiler/rustc_hir_typeck/src/fn_ctxt/checks.rs (L280-L293)

Then we subtype the expected type and the formal type:

a971212545/compiler/rustc_hir_typeck/src/fn_ctxt/checks.rs (L299-L305)

However, since we are now recording the right coercion target (since #129059), we now end up recording the expected type to the typeck results, rather than the actual.

Since that expected type was [fudged](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_infer/infer/struct.InferCtxt.html#method.fudge_inference_if_ok), it has fresh variables. And since the expected type is only subtyped against the formal type, if that expected type has a bivariant parameter, it will likely remain unconstrained since `Covariant * Bivariant = Bivariant` according to [xform](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/enum.Variance.html#method.xform). This leads to an unconstrained type variable in writeback.

AFAICT, there's no reason for us to be using subtyping here, though. The expected output is already related to the expectation by subtyping:

a971212545/compiler/rustc_hir_typeck/src/fn_ctxt/_impl.rs (L713)

So the formals don't need "another" indirection of subtyping in the argument checking... So I've changed it to use equality here. We could alternatively fix this by requiring WF for all the expected types to constrain their bivariant parameters, but this seems a bit overkill.

Fixes #129286
2024-09-02 16:08:50 +00:00
..
rustc Link std statically in rustc_driver 2024-08-11 04:16:53 +02:00
rustc_abi ABI compat check: detect unadjusted ABI mismatches 2024-08-27 09:04:59 +02:00
rustc_arena compiler: Remove feature(new_uninit) 2024-08-27 10:17:05 -07:00
rustc_ast Create opaque definitions in resolver. 2024-08-31 20:14:43 +00:00
rustc_ast_ir Add warn(unreachable_pub) to several crates. 2024-08-16 08:46:13 +10:00
rustc_ast_lowering Rollup merge of #129493 - cjgillot:early-opaque-def, r=petrochenkov 2024-09-01 03:58:04 +02:00
rustc_ast_passes Create opaque definitions in resolver. 2024-08-31 20:14:43 +00:00
rustc_ast_pretty Add warn(unreachable_pub) to rustc_ast_pretty. 2024-08-16 08:46:46 +10:00
rustc_attr Rollup merge of #126013 - nnethercote:unreachable_pub, r=Urgau 2024-08-27 00:41:57 +02:00
rustc_baked_icu_data Don't add warn(unreachable_pub) to rustc_baked_icu. 2024-08-16 08:46:52 +10:00
rustc_borrowck Rollup merge of #129767 - nnethercote:rm-extern-crate-tracing-4, r=jieyouxu 2024-08-31 14:46:11 +02:00
rustc_builtin_macros Rollup merge of #123940 - kornelski:remove-derived-debug, r=Urgau 2024-08-29 16:21:46 +02:00
rustc_codegen_cranelift introduce PrettyPrintMirOptions for cosmetic MIR dump options 2024-08-30 07:07:28 +00:00
rustc_codegen_gcc Rollup merge of #128731 - RalfJung:simd-shuffle-vector, r=workingjubilee 2024-08-27 01:46:50 -05:00
rustc_codegen_llvm interpret, codegen: tweak some comments and checks regarding Box with custom allocator 2024-08-31 11:29:02 +02:00
rustc_codegen_ssa Revert "Auto merge of #127537 - veluca93:struct_tf, r=BoxyUwU" 2024-09-01 16:35:53 +02:00
rustc_const_eval Auto merge of #129831 - matthiaskrgr:rollup-befq6zx, r=matthiaskrgr 2024-08-31 20:59:27 +00:00
rustc_data_structures Update stacker to 0.1.17 2024-08-28 15:02:41 -07:00
rustc_driver Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_driver_impl Rollup merge of #129667 - dev-ardi:rustc_driver-cleanup, r=michaelwoerister 2024-08-28 17:12:19 +02:00
rustc_error_codes Add warn(unreachable_pub) to rustc_error_codes. 2024-08-27 11:49:59 +10:00
rustc_error_messages Add warn(unreachable_pub) to rustc_error_messages. 2024-08-27 11:52:08 +10:00
rustc_errors Remove attr_id from stable lint ids. 2024-08-31 14:01:07 +00:00
rustc_expand Add warn(unreachable_pub) to rustc_expand. 2024-08-27 12:40:38 +10:00
rustc_feature Revert "Auto merge of #127537 - veluca93:struct_tf, r=BoxyUwU" 2024-09-01 16:35:53 +02:00
rustc_fluent_macro Add warn(unreachable_pub) to rustc_fluent_macro. 2024-08-27 12:56:54 +10:00
rustc_fs_util Reformat use declarations. 2024-07-29 08:26:52 +10:00
rustc_graphviz Add warn(unreachable_pub) to rustc_graphviz. 2024-08-27 12:58:29 +10:00
rustc_hir Revert "Auto merge of #127537 - veluca93:struct_tf, r=BoxyUwU" 2024-09-01 16:35:53 +02:00
rustc_hir_analysis Rollup merge of #129767 - nnethercote:rm-extern-crate-tracing-4, r=jieyouxu 2024-08-31 14:46:11 +02:00
rustc_hir_pretty Add warn(unreachable_pub) to rustc_hir_pretty. 2024-08-27 13:25:40 +10:00
rustc_hir_typeck Auto merge of #129317 - compiler-errors:expectation-subtyping, r=lcnr 2024-09-02 16:08:50 +00:00
rustc_incremental Add warn(unreachable_pub) to rustc_incremental. 2024-08-27 14:30:20 +10:00
rustc_index Rollup merge of #129401 - workingjubilee:partial-initialization-of-stabilization, r=dtolnay,joboet 2024-08-28 19:12:52 -07:00
rustc_index_macros Remove usage of specialization from newtype_index! 2024-06-30 16:42:53 +00:00
rustc_infer Rollup merge of #129767 - nnethercote:rm-extern-crate-tracing-4, r=jieyouxu 2024-08-31 14:46:11 +02:00
rustc_interface make -Z mir-include-spans a dedicated enum 2024-08-30 07:14:19 +00:00
rustc_lexer Add warn(unreachable_pub) to rustc_lexer. 2024-08-27 15:12:46 +10:00
rustc_lint Rollup merge of #129678 - compiler-errors:type-ir-inherent, r=fmease 2024-09-02 04:19:28 +02:00
rustc_lint_defs Auto merge of #127313 - cjgillot:single-expect, r=jieyouxu 2024-09-01 15:50:48 +00:00
rustc_llvm Rollup merge of #129749 - krasimirgg:llvm-20-lto, r=nikic 2024-08-31 14:46:09 +02:00
rustc_log Reformat use declarations. 2024-07-29 08:26:52 +10:00
rustc_macros Add warn(unreachable_pub) to rustc_metadata. 2024-08-29 20:13:06 +10:00
rustc_metadata Revert "Auto merge of #127537 - veluca93:struct_tf, r=BoxyUwU" 2024-09-01 16:35:53 +02:00
rustc_middle Auto merge of #129854 - Kobzol:revert-127537, r=lqd 2024-09-01 19:46:46 +00:00
rustc_mir_build Revert "Auto merge of #127537 - veluca93:struct_tf, r=BoxyUwU" 2024-09-01 16:35:53 +02:00
rustc_mir_dataflow Add warn(unreachable_pub) to rustc_mir_dataflow. 2024-08-29 20:13:06 +10:00
rustc_mir_transform Rollup merge of #129738 - nnethercote:rustc_mir_transform-cleanups, r=cjgillot 2024-09-02 04:19:28 +02:00
rustc_monomorphize Add warn(unreachable_pub) to rustc_monomorphize. 2024-08-29 20:13:06 +10:00
rustc_next_trait_solver Deny imports of rustc_type_ir::inherent outside of type ir + new trait solver 2024-09-01 12:16:18 -04:00
rustc_parse Rollup merge of #120221 - compiler-errors:statements-are-not-patterns, r=nnethercote 2024-08-31 10:08:51 +02:00
rustc_parse_format Add warn(unreachable_pub) to rustc_parse_format. 2024-08-29 20:13:06 +10:00
rustc_passes Revert "Auto merge of #127537 - veluca93:struct_tf, r=BoxyUwU" 2024-09-01 16:35:53 +02:00
rustc_pattern_analysis Add warn(unreachable_pub) to rustc_pattern_analysis. 2024-08-29 20:18:44 +10:00
rustc_privacy Add warn(unreachable_pub) to rustc_privacy. 2024-08-29 20:18:44 +10:00
rustc_query_impl Add warn(unreachable_pub) to rustc_query_impl. 2024-08-29 20:18:44 +10:00
rustc_query_system Add warn(unreachable_pub) to rustc_query_system. 2024-08-29 20:18:44 +10:00
rustc_resolve Replace walk with visit so we dont skip outermost expr kind in def collector 2024-09-01 11:16:50 -04:00
rustc_sanitizers Rollup merge of #129345 - compiler-errors:scratch4, r=jieyouxu 2024-08-21 18:15:06 +02:00
rustc_serialize Reformat use declarations. 2024-07-29 08:26:52 +10:00
rustc_session make -Z mir-include-spans a dedicated enum 2024-08-30 07:14:19 +00:00
rustc_smir Stop using a special inner body for the coroutine by-move body for async closures 2024-08-26 18:44:19 -04:00
rustc_span Revert "Auto merge of #127537 - veluca93:struct_tf, r=BoxyUwU" 2024-09-01 16:35:53 +02:00
rustc_symbol_mangling Stop using a special inner body for the coroutine by-move body for async closures 2024-08-26 18:44:19 -04:00
rustc_target Rollup merge of #129842 - no1wudi:master, r=saethlin 2024-09-02 04:19:30 +02:00
rustc_trait_selection Revert "Auto merge of #127537 - veluca93:struct_tf, r=BoxyUwU" 2024-09-01 16:35:53 +02:00
rustc_traits Remove redundant type ops 2024-08-14 14:18:17 -04:00
rustc_transmute Removes dead code from the compiler 2024-08-25 13:41:39 +08:00
rustc_ty_utils Auto merge of #128506 - compiler-errors:by-move-body, r=cjgillot 2024-08-27 23:30:24 +00:00
rustc_type_ir Deny imports of rustc_type_ir::inherent outside of type ir + new trait solver 2024-09-01 12:16:18 -04:00
rustc_type_ir_macros Reformat use declarations. 2024-07-29 08:26:52 +10:00
stable_mir Introduce methods for obtaining Location for statements and terminators 2024-08-23 12:45:38 -04:00