rust/compiler
Matthias Krüger 99e34a4ea0
Rollup merge of #135976 - WaffleLapkin:tailcall-nodrop, r=oli-obk
Don't drop types with no drop glue when building drops for tailcalls

this is required as otherwise drops of `&mut` refs count as a usage of a
'two-phase temporary' causing an ICE.

fixes #128097

The underlying issue is that the current code generates drops for `&mut` which are later counted as a second use of a two-phase temporary:

`bat t.rs -p`
```rust
#![expect(incomplete_features)]
#![feature(explicit_tail_calls)]

fn f(x: &mut ()) {
    let _y = String::new();
    become f(x);
}

fn main() {}
```
`rustc t.rs -Zdump_mir=f`
```text
error: internal compiler error: compiler/rustc_borrowck/src/borrow_set.rs:298:17: found two uses for 2-phase borrow temporary _4: bb2[1] and bb3[0]
 --> t.rs:6:5
  |
6 |     become f(x);
  |     ^^^^^^^^^^^

thread 'rustc' panicked at compiler/rustc_borrowck/src/borrow_set.rs:298:17:
Box<dyn Any>
stack backtrace:
[REDACTED]

error: aborting due to 1 previous error
```
`bat ./mir_dump/t.f.-------.renumber.0.mir -p -lrust`
```rust
// MIR for `f` 0 renumber

fn f(_1: &mut ()) -> () {
    debug x => _1;
    let mut _0: ();
    let mut _2: !;
    let _3: std::string::String;
    let mut _4: &mut ();
    scope 1 {
        debug _y => _3;
    }

    bb0: {
        StorageLive(_3);
        _3 = String::new() -> [return: bb1, unwind: bb4];
    }

    bb1: {
        FakeRead(ForLet(None), _3);
        StorageLive(_4);
        _4 = &mut (*_1);
        drop(_3) -> [return: bb2, unwind: bb3];
    }

    bb2: {
        StorageDead(_3);
        tailcall f(Spanned { node: move _4, span: t.rs:6:14: 6:15 (#0) });
    }

    bb3 (cleanup): {
        drop(_4) -> [return: bb4, unwind terminate(cleanup)];
    }

    bb4 (cleanup): {
        resume;
    }
}
```

Note how `_4 is moved into the tail call in `bb2` and dropped in `bb3`.

This PR adds a check that the locals we drop need dropping.

r? `@oli-obk` (feel free to reassign, I'm not sure who would be a good reviewer, but thought you might have an idea)
cc `@beepster4096,` since you wrote the original drop implementation.
2025-01-24 23:25:46 +01:00
..
rustc
rustc_abi Auto merge of #135047 - Flakebi:amdgpu-kernel-cc, r=workingjubilee 2025-01-17 04:36:09 +00:00
rustc_arena Add inherent versions of MaybeUninit methods for slices 2025-01-11 23:57:00 -05:00
rustc_ast Handle parenthesised infer args 2025-01-23 06:01:36 +00:00
rustc_ast_ir
rustc_ast_lowering Handle parenthesised infer args 2025-01-23 06:01:36 +00:00
rustc_ast_passes Auto merge of #134299 - RalfJung:remove-start, r=compiler-errors 2025-01-21 19:46:20 +00:00
rustc_ast_pretty Rename PatKind::Lit to Expr 2025-01-08 07:34:59 +00:00
rustc_attr_data_structures allowed_through_unstable_modules: support showing a deprecation message when the unstable module name is used 2025-01-15 09:41:33 +01:00
rustc_attr_parsing Run clippy --fix for unnecessary_map_or lint 2025-01-19 19:15:00 +00:00
rustc_baked_icu_data
rustc_borrowck visit_x_unambig 2025-01-23 06:01:36 +00:00
rustc_builtin_macros Rollup merge of #135557 - estebank:wtf8, r=fee1-dead 2025-01-22 20:37:24 +01:00
rustc_codegen_cranelift Auto merge of #134299 - RalfJung:remove-start, r=compiler-errors 2025-01-21 19:46:20 +00:00
rustc_codegen_gcc Rollup merge of #135581 - EnzymeAD:refactor-codgencx, r=oli-obk 2025-01-24 23:25:42 +01:00
rustc_codegen_llvm Rollup merge of #135581 - EnzymeAD:refactor-codgencx, r=oli-obk 2025-01-24 23:25:42 +01:00
rustc_codegen_ssa Rollup merge of #135581 - EnzymeAD:refactor-codgencx, r=oli-obk 2025-01-24 23:25:42 +01:00
rustc_const_eval Rollup merge of #134858 - estebank:issue-81370, r=Noratrieb 2025-01-19 11:48:15 +01:00
rustc_data_structures bumpt compiler and tools to windows 0.59 2025-01-21 16:48:44 +03:00
rustc_driver
rustc_driver_impl Rollup merge of #135880 - bjorn3:misc_driver_refactors, r=oli-obk 2025-01-23 19:54:26 +01:00
rustc_error_codes Refactor dyn-compatibility error and suggestions 2025-01-22 09:20:57 -08:00
rustc_error_messages
rustc_errors bumpt compiler and tools to windows 0.59 2025-01-21 16:48:44 +03:00
rustc_expand Auto merge of #134478 - compiler-errors:attr-span, r=oli-obk 2025-01-22 14:46:41 +00:00
rustc_feature Refactor dyn-compatibility error and suggestions 2025-01-22 09:20:57 -08:00
rustc_fluent_macro
rustc_fs_util
rustc_graphviz
rustc_hir Explain visit_ty_unambig naming 2025-01-23 06:01:36 +00:00
rustc_hir_analysis Auto merge of #135272 - BoxyUwU:generic_arg_infer_reliability_2, r=compiler-errors 2025-01-24 11:12:01 +00:00
rustc_hir_pretty Split hir TyKind and ConstArgKind in two and update hir::Visitor 2025-01-23 06:01:36 +00:00
rustc_hir_typeck Auto merge of #135272 - BoxyUwU:generic_arg_infer_reliability_2, r=compiler-errors 2025-01-24 11:12:01 +00:00
rustc_incremental turn hir::ItemKind::Fn into a named-field variant 2025-01-04 11:35:31 +01:00
rustc_index Run clippy --fix for unnecessary_map_or lint 2025-01-19 19:15:00 +00:00
rustc_index_macros
rustc_infer Remove Copy bound from enter_forall 2025-01-22 11:45:09 +00:00
rustc_interface Rollup merge of #135880 - bjorn3:misc_driver_refactors, r=oli-obk 2025-01-23 19:54:26 +01:00
rustc_lexer
rustc_lint Auto merge of #135272 - BoxyUwU:generic_arg_infer_reliability_2, r=compiler-errors 2025-01-24 11:12:01 +00:00
rustc_lint_defs Rollup merge of #132397 - m-ou-se:warn-missing-abi, r=Nadrieril 2025-01-15 04:08:10 -05:00
rustc_llvm Make our DIFlags match LLVMDIFlags in the LLVM-C API 2025-01-21 14:41:44 +11:00
rustc_log Avoid naming variables str 2025-01-07 14:30:02 +02:00
rustc_macros Avoid naming variables str 2025-01-07 14:30:02 +02:00
rustc_metadata Manual cleanup of some is_{or_none|some_and} usages 2025-01-19 20:50:43 +00:00
rustc_middle Rollup merge of #135873 - Zalathar:be-prepared, r=oli-obk 2025-01-24 16:25:42 +01:00
rustc_mir_build don't drop types with no drop glue when tailcalling 2025-01-24 06:45:19 +01:00
rustc_mir_dataflow Run clippy --fix for unnecessary_map_or lint 2025-01-19 19:15:00 +00:00
rustc_mir_transform coverage: Treat the "merged node flow graph" as a plain data struct 2025-01-24 16:13:12 +11:00
rustc_monomorphize Make sure we actually use the right trivial lifetime substs when eagerly monomorphizing drop for structs 2025-01-15 04:20:25 +00:00
rustc_next_trait_solver Rollup merge of #135766 - lcnr:candidate-assembly-3, r=compiler-errors 2025-01-23 19:54:25 +01:00
rustc_parse Rollup merge of #135855 - cuviper:parser-size, r=wesleywiser 2025-01-24 00:15:56 +01:00
rustc_parse_format Rollup merge of #135920 - hkBst:patch-16, r=SparrowLii 2025-01-23 19:54:28 +01:00
rustc_passes visit_x_unambig 2025-01-23 06:01:36 +00:00
rustc_pattern_analysis rename BitSet to DenseBitSet 2025-01-11 11:34:01 +00:00
rustc_privacy Split hir TyKind and ConstArgKind in two and update hir::Visitor 2025-01-23 06:01:36 +00:00
rustc_query_impl don't return an Option from try_find_dep_kind 2025-01-07 21:57:00 +01:00
rustc_query_system Properly note when query stack is being cut off 2025-01-16 19:12:22 +00:00
rustc_resolve rustc_resolve: don't open-code Option::filter 2025-01-21 13:44:53 +00:00
rustc_sanitizers Eliminate an unnecessary Symbol::to_string; use as_str 2025-01-07 14:24:47 +02:00
rustc_serialize
rustc_session Remove the need to manually call set_using_internal_features 2025-01-23 09:38:58 +00:00
rustc_smir Remove RunCompiler 2025-01-23 09:38:58 +00:00
rustc_span Auto merge of #134478 - compiler-errors:attr-span, r=oli-obk 2025-01-22 14:46:41 +00:00
rustc_symbol_mangling Fix legacy symbol mangling of closures 2025-01-14 16:33:03 +00:00
rustc_target Auto merge of #135978 - matthiaskrgr:rollup-ni16gqr, r=matthiaskrgr 2025-01-24 08:28:35 +00:00
rustc_trait_selection Rollup merge of #135949 - estebank:shorten-ty, r=davidtwco 2025-01-24 23:25:45 +01:00
rustc_traits Remove query normalize from normalize type op 2025-01-23 05:56:22 +00:00
rustc_transmute
rustc_ty_utils Split hir TyKind and ConstArgKind in two and update hir::Visitor 2025-01-23 06:01:36 +00:00
rustc_type_ir Auto merge of #133830 - compiler-errors:span-key, r=lcnr 2025-01-21 12:33:33 +00:00
rustc_type_ir_macros
stable_mir Add gpu-kernel calling convention 2025-01-16 00:26:55 +01:00