rust/compiler
Noah Lev e27315268b Suggest using a temporary variable to fix borrowck errors
In Rust, nesting method calls with both require `&mut` access to `self`
produces a borrow-check error:

    error[E0499]: cannot borrow `*self` as mutable more than once at a time
     --> src/lib.rs:7:14
      |
    7 |     self.foo(self.bar());
      |     ---------^^^^^^^^^^-
      |     |    |   |
      |     |    |   second mutable borrow occurs here
      |     |    first borrow later used by call
      |     first mutable borrow occurs here

That's because Rust has a left-to-right evaluation order, and the method
receiver is passed first. Thus, the argument to the method cannot then
mutate `self`.

There's an easy solution to this error: just extract a local variable
for the inner argument:

    let tmp = self.bar();
    self.foo(tmp);

However, the error doesn't give any suggestion of how to solve the
problem. As a result, new users may assume that it's impossible to
express their code correctly and get stuck.

This commit adds a (non-structured) suggestion to extract a local
variable for the inner argument to solve the error. The suggestion uses
heuristics that eliminate most false positives, though there are a few
false negatives (cases where the suggestion should be emitted but is
not). Those other cases can be implemented in a future change.
2021-12-10 14:34:00 -08:00
..
rustc
rustc_apfloat
rustc_arena
rustc_ast Add initial AST and MIR support for unwinding from inline assembly 2021-12-03 23:51:46 +01:00
rustc_ast_lowering Use IntoIterator for array impl everywhere. 2021-12-04 19:40:33 +01:00
rustc_ast_passes Rollup merge of #91208 - estebank:eq-constraint, r=cjgillot 2021-11-27 11:46:44 +01:00
rustc_ast_pretty Pretty print break and continue without redundant space 2021-12-08 14:35:20 -08:00
rustc_attr re-format with new rustfmt 2021-11-30 13:08:41 -05:00
rustc_borrowck Suggest using a temporary variable to fix borrowck errors 2021-12-10 14:34:00 -08:00
rustc_builtin_macros Implement concat_bytes! 2021-12-06 21:05:13 -05:00
rustc_codegen_cranelift Use IntoIterator for array impl everywhere. 2021-12-04 19:40:33 +01:00
rustc_codegen_gcc Rollup merge of #90796 - Amanieu:remove_reg_thumb, r=joshtriplett 2021-12-09 05:08:32 +01:00
rustc_codegen_llvm Rollup merge of #90796 - Amanieu:remove_reg_thumb, r=joshtriplett 2021-12-09 05:08:32 +01:00
rustc_codegen_ssa Rollup merge of #90796 - Amanieu:remove_reg_thumb, r=joshtriplett 2021-12-09 05:08:32 +01:00
rustc_const_eval Rollup merge of #91551 - b-naber:const-eval-normalization-ice, r=oli-obk 2021-12-08 16:08:07 +01:00
rustc_data_structures Annotate comments onto the LT algorithm 2021-12-06 20:30:15 -05:00
rustc_driver
rustc_error_codes Clarify and tidy up explanation of E0038 2021-11-30 09:25:17 -08:00
rustc_errors Rollup merge of #91394 - Mark-Simulacrum:bump-stage0, r=pietroalbini 2021-12-02 15:52:03 +01:00
rustc_expand Future compatibility warning on cfg_attr on crate_type and crate_name 2021-12-07 11:47:21 -05:00
rustc_feature add unwind_asm feature gate for may_unwind option 2021-12-03 23:51:49 +01:00
rustc_fs_util
rustc_graphviz
rustc_hir Use IntoIterator for array impl everywhere. 2021-12-04 19:40:33 +01:00
rustc_hir_pretty Pretty print break and continue without redundant space 2021-12-08 14:35:20 -08:00
rustc_incremental
rustc_index Auto merge of #90491 - Mark-Simulacrum:push-pred-faster, r=matthewjasper 2021-11-24 15:51:46 +00:00
rustc_infer Rollup merge of #90709 - estebank:erase-known-type-params, r=nagisa 2021-12-08 16:08:06 +01:00
rustc_interface Rollup merge of #91476 - m-ou-se:ferris-identifier, r=estebank 2021-12-09 05:02:20 +01:00
rustc_lexer Auto merge of #91393 - Julian-Wollersberger:lexer_optimization, r=petrochenkov 2021-12-03 13:20:14 +00:00
rustc_lint Use let_else in some more places in rustc_lint 2021-12-03 03:51:47 +01:00
rustc_lint_defs Future compatibility warning on cfg_attr on crate_type and crate_name 2021-12-07 11:47:21 -05:00
rustc_llvm Auto merge of #91284 - t6:freebsd-riscv64, r=Amanieu 2021-12-06 03:51:05 +00:00
rustc_macros Rename TypeFolderFallible to FallibleTypeFolder 2021-12-02 16:14:18 +00:00
rustc_metadata Improve suggestion for extern crate self error message 2021-12-01 21:59:54 +00:00
rustc_middle Suggest using a temporary variable to fix borrowck errors 2021-12-10 14:34:00 -08:00
rustc_mir_build Evaluate inline const pat early and report error if too generic 2021-12-05 21:38:37 +00:00
rustc_mir_dataflow Auto merge of #91475 - ecstatic-morse:mir-pass-manager3, r=oli-obk 2021-12-05 03:41:18 +00:00
rustc_mir_transform Use Vec extend instead of repeated pushes in several places 2021-12-08 22:57:33 +01:00
rustc_monomorphize
rustc_parse Rollup merge of #91634 - terrarier2111:fix-recover-from-variant-ice, r=nagisa 2021-12-09 05:08:33 +01:00
rustc_parse_format
rustc_passes Update invalid crate attributes, add help message 2021-12-03 18:38:32 +00:00
rustc_plugin_impl
rustc_privacy Take a LocalDefId in expect_*item. 2021-11-28 21:09:45 +01:00
rustc_query_impl
rustc_query_system std: Stabilize the thread_local_const_init feature 2021-11-29 07:23:46 -08:00
rustc_resolve Annotate derived spans and move span suggestion code 2021-12-03 18:41:40 +00:00
rustc_save_analysis
rustc_serialize avoid string validation in rustc_serialize, check a marker byte instead 2021-12-06 18:43:01 +01:00
rustc_session Auto merge of #91555 - matthiaskrgr:rollup-pq0iaq7, r=matthiaskrgr 2021-12-05 15:33:44 +00:00
rustc_span Auto merge of #91692 - matthiaskrgr:rollup-u7dvh0n, r=matthiaskrgr 2021-12-09 07:08:32 +00:00
rustc_symbol_mangling
rustc_target Remove the reg_thumb register class for asm! on ARM 2021-12-07 23:54:09 +00:00
rustc_trait_selection Use Vec extend instead of repeated pushes in several places 2021-12-08 22:57:33 +01:00
rustc_traits Reduce boilerplate around infallible folders 2021-12-02 16:14:16 +00:00
rustc_ty_utils Revert "Auto merge of #91354 - fee1-dead:const_env, r=spastorino" 2021-12-03 10:11:21 -03:00
rustc_type_ir
rustc_typeck Rollup merge of #91042 - Kobzol:vec-extend-cleanup, r=nagisa 2021-12-09 05:08:33 +01:00