Fix span edition for 2024 RPIT coming from an external macro
This fixes a problem where code generated by an external macro with an RPIT would end up using the call-site edition instead of the macro's edition for the RPIT. When used from a 2024 crate, this caused the code to change behavior to the 2024 capturing rules, which we don't want. This was caused by the impl-trait lowering code would replace the span with one marked with `DesugaringKind::OpaqueTy` desugaring. However, it was also overriding the edition of the span with the edition of the local crate. Instead it should be using the edition of the span itself. Fixes https://github.com/rust-lang/rust/issues/132917
This commit is contained in:
parent
d163541022
commit
03e2828e88
3 changed files with 2 additions and 94 deletions
|
@ -738,7 +738,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
||||||
allow_internal_unstable: Option<Lrc<[Symbol]>>,
|
allow_internal_unstable: Option<Lrc<[Symbol]>>,
|
||||||
) -> Span {
|
) -> Span {
|
||||||
self.tcx.with_stable_hashing_context(|hcx| {
|
self.tcx.with_stable_hashing_context(|hcx| {
|
||||||
span.mark_with_reason(allow_internal_unstable, reason, self.tcx.sess.edition(), hcx)
|
span.mark_with_reason(allow_internal_unstable, reason, span.edition(), hcx)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,12 +6,11 @@
|
||||||
//@ aux-crate: no_use_macro=no-use-macro.rs
|
//@ aux-crate: no_use_macro=no-use-macro.rs
|
||||||
//@ edition: 2024
|
//@ edition: 2024
|
||||||
//@ compile-flags:-Z unstable-options
|
//@ compile-flags:-Z unstable-options
|
||||||
|
//@ check-pass
|
||||||
|
|
||||||
no_use_pm::pm_rpit!{}
|
no_use_pm::pm_rpit!{}
|
||||||
//~^ ERROR: cannot borrow `x` as mutable
|
|
||||||
|
|
||||||
no_use_macro::macro_rpit!{}
|
no_use_macro::macro_rpit!{}
|
||||||
//~^ ERROR: cannot borrow `x` as mutable
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let mut x = vec![];
|
let mut x = vec![];
|
||||||
|
@ -19,11 +18,9 @@ fn main() {
|
||||||
|
|
||||||
let element = test_pm(&x);
|
let element = test_pm(&x);
|
||||||
x.push(2);
|
x.push(2);
|
||||||
//~^ ERROR: cannot borrow `x` as mutable
|
|
||||||
println!("{element}");
|
println!("{element}");
|
||||||
|
|
||||||
let element = test_mbe(&x);
|
let element = test_mbe(&x);
|
||||||
x.push(2);
|
x.push(2);
|
||||||
//~^ ERROR: cannot borrow `x` as mutable
|
|
||||||
println!("{element}");
|
println!("{element}");
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,89 +0,0 @@
|
||||||
error[E0502]: cannot borrow `x` as mutable because it is also borrowed as immutable
|
|
||||||
--> $DIR/external-macro.rs:10:1
|
|
||||||
|
|
|
||||||
LL | no_use_pm::pm_rpit!{}
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
| |
|
|
||||||
| mutable borrow occurs here
|
|
||||||
| immutable borrow occurs here
|
|
||||||
| immutable borrow later used here
|
|
||||||
|
|
|
||||||
note: this call may capture more lifetimes than intended, because Rust 2024 has adjusted the `impl Trait` lifetime capture rules
|
|
||||||
--> $DIR/external-macro.rs:10:1
|
|
||||||
|
|
|
||||||
LL | no_use_pm::pm_rpit!{}
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
= note: this error originates in the macro `no_use_pm::pm_rpit` (in Nightly builds, run with -Z macro-backtrace for more info)
|
|
||||||
help: use the precise capturing `use<...>` syntax to make the captures explicit
|
|
||||||
|
|
|
||||||
LL | no_use_pm::pm_rpit!{} + use<>
|
|
||||||
| +++++++
|
|
||||||
|
|
||||||
error[E0502]: cannot borrow `x` as mutable because it is also borrowed as immutable
|
|
||||||
--> $DIR/external-macro.rs:13:1
|
|
||||||
|
|
|
||||||
LL | no_use_macro::macro_rpit!{}
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
| |
|
|
||||||
| mutable borrow occurs here
|
|
||||||
| immutable borrow occurs here
|
|
||||||
| immutable borrow later used here
|
|
||||||
|
|
|
||||||
note: this call may capture more lifetimes than intended, because Rust 2024 has adjusted the `impl Trait` lifetime capture rules
|
|
||||||
--> $DIR/external-macro.rs:13:1
|
|
||||||
|
|
|
||||||
LL | no_use_macro::macro_rpit!{}
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
= note: this error originates in the macro `no_use_macro::macro_rpit` (in Nightly builds, run with -Z macro-backtrace for more info)
|
|
||||||
help: use the precise capturing `use<...>` syntax to make the captures explicit
|
|
||||||
--> $DIR/auxiliary/no-use-macro.rs:7:60
|
|
||||||
|
|
|
||||||
LL | fn test_mbe(x: &Vec<i32>) -> impl std::fmt::Display + use<> {
|
|
||||||
| +++++++
|
|
||||||
|
|
||||||
error[E0502]: cannot borrow `x` as mutable because it is also borrowed as immutable
|
|
||||||
--> $DIR/external-macro.rs:21:5
|
|
||||||
|
|
|
||||||
LL | let element = test_pm(&x);
|
|
||||||
| -- immutable borrow occurs here
|
|
||||||
LL | x.push(2);
|
|
||||||
| ^^^^^^^^^ mutable borrow occurs here
|
|
||||||
LL |
|
|
||||||
LL | println!("{element}");
|
|
||||||
| --------- immutable borrow later used here
|
|
||||||
|
|
|
||||||
note: this call may capture more lifetimes than intended, because Rust 2024 has adjusted the `impl Trait` lifetime capture rules
|
|
||||||
--> $DIR/external-macro.rs:20:19
|
|
||||||
|
|
|
||||||
LL | let element = test_pm(&x);
|
|
||||||
| ^^^^^^^^^^^
|
|
||||||
help: use the precise capturing `use<...>` syntax to make the captures explicit
|
|
||||||
|
|
|
||||||
LL | no_use_pm::pm_rpit!{} + use<>
|
|
||||||
| +++++++
|
|
||||||
|
|
||||||
error[E0502]: cannot borrow `x` as mutable because it is also borrowed as immutable
|
|
||||||
--> $DIR/external-macro.rs:26:5
|
|
||||||
|
|
|
||||||
LL | let element = test_pm(&x);
|
|
||||||
| -- immutable borrow occurs here
|
|
||||||
...
|
|
||||||
LL | x.push(2);
|
|
||||||
| ^^^^^^^^^ mutable borrow occurs here
|
|
||||||
...
|
|
||||||
LL | }
|
|
||||||
| - immutable borrow might be used here, when `element` is dropped and runs the destructor for type `impl std::fmt::Display`
|
|
||||||
|
|
|
||||||
note: this call may capture more lifetimes than intended, because Rust 2024 has adjusted the `impl Trait` lifetime capture rules
|
|
||||||
--> $DIR/external-macro.rs:20:19
|
|
||||||
|
|
|
||||||
LL | let element = test_pm(&x);
|
|
||||||
| ^^^^^^^^^^^
|
|
||||||
help: use the precise capturing `use<...>` syntax to make the captures explicit
|
|
||||||
|
|
|
||||||
LL | no_use_pm::pm_rpit!{} + use<>
|
|
||||||
| +++++++
|
|
||||||
|
|
||||||
error: aborting due to 4 previous errors
|
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0502`.
|
|
Loading…
Add table
Add a link
Reference in a new issue