diff options
| author | bors <bors@rust-lang.org> | 2025-02-07 13:42:52 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2025-02-07 13:42:52 +0000 |
| commit | 64e06c0f5578829373743884b708d494136c3e8f (patch) | |
| tree | 43287d63ad59b14feb122ec27bed172c4c889653 /compiler/rustc_mir_build/src | |
| parent | 5ff18d0eaefd1bd9ab8ec33dab2404a44e7631ed (diff) | |
| parent | 0047263387c046f1caf71c0c652612e9bb42b8a7 (diff) | |
| download | rust-64e06c0f5578829373743884b708d494136c3e8f.tar.gz rust-64e06c0f5578829373743884b708d494136c3e8f.zip | |
Auto merge of #136684 - matthiaskrgr:rollup-mlpzre5, r=matthiaskrgr
Rollup of 8 pull requests
Successful merges:
- #135973 (fix tail call checks wrt `#[track_caller]`)
- #136191 (compiler: replace few consts arrays with statics to remove const dupes)
- #136565 (compiler: Clean up weird `rustc_abi` reexports)
- #136582 (Revert "CI: build FreeBSD artifacts on FreeBSD 13.4")
- #136627 (MIR validation: add comment explaining the limitations of CfgChecker)
- #136634 (Stabilise `Cursor::{get_mut, set_position}` in `const` scenarios.)
- #136643 (ping me for attribute-related changes)
- #136644 (Add `rustc_hir_pretty::item_to_string` function)
r? `@ghost`
`@rustbot` modify labels: rollup
Diffstat (limited to 'compiler/rustc_mir_build/src')
| -rw-r--r-- | compiler/rustc_mir_build/src/check_tail_calls.rs | 51 |
1 files changed, 28 insertions, 23 deletions
diff --git a/compiler/rustc_mir_build/src/check_tail_calls.rs b/compiler/rustc_mir_build/src/check_tail_calls.rs index 921205428db..18db8c1debb 100644 --- a/compiler/rustc_mir_build/src/check_tail_calls.rs +++ b/compiler/rustc_mir_build/src/check_tail_calls.rs @@ -132,11 +132,24 @@ impl<'tcx> TailCallCkVisitor<'_, 'tcx> { } { + // `#[track_caller]` affects the ABI of a function (by adding a location argument), + // so a `track_caller` can only tail call other `track_caller` functions. + // + // The issue is however that we can't know if a function is `track_caller` or not at + // this point (THIR can be polymorphic, we may have an unresolved trait function). + // We could only allow functions that we *can* resolve and *are* `track_caller`, + // but that would turn changing `track_caller`-ness into a breaking change, + // which is probably undesirable. + // + // Also note that we don't check callee's `track_caller`-ness at all, mostly for the + // reasons above, but also because we can always tailcall the shim we'd generate for + // coercing the function to an `fn()` pointer. (although in that case the tailcall is + // basically useless -- the shim calls the actual function, so tailcalling the shim is + // equivalent to calling the function) let caller_needs_location = self.needs_location(self.caller_ty); - let callee_needs_location = self.needs_location(ty); - if caller_needs_location != callee_needs_location { - self.report_track_caller_mismatch(expr.span, caller_needs_location); + if caller_needs_location { + self.report_track_caller_caller(expr.span); } } @@ -150,7 +163,9 @@ impl<'tcx> TailCallCkVisitor<'_, 'tcx> { } /// Returns true if function of type `ty` needs location argument - /// (i.e. if a function is marked as `#[track_caller]`) + /// (i.e. if a function is marked as `#[track_caller]`). + /// + /// Panics if the function's instance can't be immediately resolved. fn needs_location(&self, ty: Ty<'tcx>) -> bool { if let &ty::FnDef(did, substs) = ty.kind() { let instance = @@ -293,25 +308,15 @@ impl<'tcx> TailCallCkVisitor<'_, 'tcx> { self.found_errors = Err(err); } - fn report_track_caller_mismatch(&mut self, sp: Span, caller_needs_location: bool) { - let err = match caller_needs_location { - true => self - .tcx - .dcx() - .struct_span_err( - sp, - "a function marked with `#[track_caller]` cannot tail-call one that is not", - ) - .emit(), - false => self - .tcx - .dcx() - .struct_span_err( - sp, - "a function mot marked with `#[track_caller]` cannot tail-call one that is", - ) - .emit(), - }; + fn report_track_caller_caller(&mut self, sp: Span) { + let err = self + .tcx + .dcx() + .struct_span_err( + sp, + "a function marked with `#[track_caller]` cannot perform a tail-call", + ) + .emit(); self.found_errors = Err(err); } |
