Fix inconsistent symbol mangling with -Zverbose
Always skip arguments that are the defaults of their respective parameters, to avoid generating inconsistent symbols for builds with `-Zverbose` flag and without it.
This commit is contained in:
parent
bfb2856f27
commit
3158372dea
6 changed files with 23 additions and 13 deletions
|
@ -188,11 +188,6 @@ pub trait Printer<'tcx>: Sized {
|
||||||
own_params.start = 1;
|
own_params.start = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we're in verbose mode, then print default-equal args too
|
|
||||||
if self.tcx().sess.verbose() {
|
|
||||||
return &substs[own_params];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Don't print args that are the defaults of their respective parameters.
|
// Don't print args that are the defaults of their respective parameters.
|
||||||
own_params.end -= generics
|
own_params.end -= generics
|
||||||
.params
|
.params
|
||||||
|
|
|
@ -25,7 +25,7 @@ fn foo<'z>() where &'z (): Sized {
|
||||||
let x: () = <i8 as Foo<'static, 'static, u32>>::bar::<'static, char>;
|
let x: () = <i8 as Foo<'static, 'static, u32>>::bar::<'static, char>;
|
||||||
//[verbose]~^ ERROR mismatched types
|
//[verbose]~^ ERROR mismatched types
|
||||||
//[verbose]~| expected unit type `()`
|
//[verbose]~| expected unit type `()`
|
||||||
//[verbose]~| found fn item `fn() {<i8 as Foo<ReStatic, ReStatic, u32>>::bar::<ReStatic, char>}`
|
//[verbose]~| found fn item `fn() {<i8 as Foo<ReStatic, ReStatic>>::bar::<ReStatic, char>}`
|
||||||
//[normal]~^^^^ ERROR mismatched types
|
//[normal]~^^^^ ERROR mismatched types
|
||||||
//[normal]~| expected unit type `()`
|
//[normal]~| expected unit type `()`
|
||||||
//[normal]~| found fn item `fn() {<i8 as Foo<'static, 'static>>::bar::<'static, char>}`
|
//[normal]~| found fn item `fn() {<i8 as Foo<'static, 'static>>::bar::<'static, char>}`
|
||||||
|
|
|
@ -20,7 +20,7 @@ error[E0308]: mismatched types
|
||||||
--> $DIR/substs-ppaux.rs:25:17
|
--> $DIR/substs-ppaux.rs:25:17
|
||||||
|
|
|
|
||||||
LL | fn bar<'a, T>() where T: 'a {}
|
LL | fn bar<'a, T>() where T: 'a {}
|
||||||
| --------------------------- fn() {<i8 as Foo<ReStatic, ReStatic, u32>>::bar::<ReStatic, char>} defined here
|
| --------------------------- fn() {<i8 as Foo<ReStatic, ReStatic>>::bar::<ReStatic, char>} defined here
|
||||||
...
|
...
|
||||||
LL | let x: () = <i8 as Foo<'static, 'static, u32>>::bar::<'static, char>;
|
LL | let x: () = <i8 as Foo<'static, 'static, u32>>::bar::<'static, char>;
|
||||||
| -- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `()`, found fn item
|
| -- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `()`, found fn item
|
||||||
|
@ -28,7 +28,7 @@ LL | let x: () = <i8 as Foo<'static, 'static, u32>>::bar::<'static, char>;
|
||||||
| expected due to this
|
| expected due to this
|
||||||
|
|
|
|
||||||
= note: expected unit type `()`
|
= note: expected unit type `()`
|
||||||
found fn item `fn() {<i8 as Foo<ReStatic, ReStatic, u32>>::bar::<ReStatic, char>}`
|
found fn item `fn() {<i8 as Foo<ReStatic, ReStatic>>::bar::<ReStatic, char>}`
|
||||||
help: use parentheses to call this function
|
help: use parentheses to call this function
|
||||||
|
|
|
|
||||||
LL | let x: () = <i8 as Foo<'static, 'static, u32>>::bar::<'static, char>();
|
LL | let x: () = <i8 as Foo<'static, 'static, u32>>::bar::<'static, char>();
|
||||||
|
|
|
@ -6,7 +6,7 @@ LL | with_signature(x, |mut y| Box::new(y.next()))
|
||||||
|
|
|
|
||||||
= note: defining type: no_region::<'_#1r, T>::{closure#0} with closure substs [
|
= note: defining type: no_region::<'_#1r, T>::{closure#0} with closure substs [
|
||||||
i32,
|
i32,
|
||||||
extern "rust-call" fn((std::boxed::Box<T, std::alloc::Global>,)) -> std::boxed::Box<(dyn Anything + '_#2r), std::alloc::Global>,
|
extern "rust-call" fn((std::boxed::Box<T>,)) -> std::boxed::Box<(dyn Anything + '_#2r)>,
|
||||||
(),
|
(),
|
||||||
]
|
]
|
||||||
= note: number of external vids: 3
|
= note: number of external vids: 3
|
||||||
|
@ -42,7 +42,7 @@ LL | with_signature(x, |mut y| Box::new(y.next()))
|
||||||
|
|
|
|
||||||
= note: defining type: correct_region::<'_#1r, T>::{closure#0} with closure substs [
|
= note: defining type: correct_region::<'_#1r, T>::{closure#0} with closure substs [
|
||||||
i32,
|
i32,
|
||||||
extern "rust-call" fn((std::boxed::Box<T, std::alloc::Global>,)) -> std::boxed::Box<(dyn Anything + '_#2r), std::alloc::Global>,
|
extern "rust-call" fn((std::boxed::Box<T>,)) -> std::boxed::Box<(dyn Anything + '_#2r)>,
|
||||||
(),
|
(),
|
||||||
]
|
]
|
||||||
= note: number of external vids: 3
|
= note: number of external vids: 3
|
||||||
|
@ -69,7 +69,7 @@ LL | with_signature(x, |mut y| Box::new(y.next()))
|
||||||
|
|
|
|
||||||
= note: defining type: wrong_region::<'_#1r, '_#2r, T>::{closure#0} with closure substs [
|
= note: defining type: wrong_region::<'_#1r, '_#2r, T>::{closure#0} with closure substs [
|
||||||
i32,
|
i32,
|
||||||
extern "rust-call" fn((std::boxed::Box<T, std::alloc::Global>,)) -> std::boxed::Box<(dyn Anything + '_#3r), std::alloc::Global>,
|
extern "rust-call" fn((std::boxed::Box<T>,)) -> std::boxed::Box<(dyn Anything + '_#3r)>,
|
||||||
(),
|
(),
|
||||||
]
|
]
|
||||||
= note: number of external vids: 4
|
= note: number of external vids: 4
|
||||||
|
@ -105,7 +105,7 @@ LL | with_signature(x, |mut y| Box::new(y.next()))
|
||||||
|
|
|
|
||||||
= note: defining type: outlives_region::<'_#1r, '_#2r, T>::{closure#0} with closure substs [
|
= note: defining type: outlives_region::<'_#1r, '_#2r, T>::{closure#0} with closure substs [
|
||||||
i32,
|
i32,
|
||||||
extern "rust-call" fn((std::boxed::Box<T, std::alloc::Global>,)) -> std::boxed::Box<(dyn Anything + '_#3r), std::alloc::Global>,
|
extern "rust-call" fn((std::boxed::Box<T>,)) -> std::boxed::Box<(dyn Anything + '_#3r)>,
|
||||||
(),
|
(),
|
||||||
]
|
]
|
||||||
= note: number of external vids: 4
|
= note: number of external vids: 4
|
||||||
|
|
|
@ -6,7 +6,7 @@ LL | with_signature(x, |y| y)
|
||||||
|
|
|
|
||||||
= note: defining type: no_region::<'_#1r, T>::{closure#0} with closure substs [
|
= note: defining type: no_region::<'_#1r, T>::{closure#0} with closure substs [
|
||||||
i32,
|
i32,
|
||||||
extern "rust-call" fn((std::boxed::Box<T, std::alloc::Global>,)) -> std::boxed::Box<(dyn std::fmt::Debug + '_#2r), std::alloc::Global>,
|
extern "rust-call" fn((std::boxed::Box<T>,)) -> std::boxed::Box<(dyn std::fmt::Debug + '_#2r)>,
|
||||||
(),
|
(),
|
||||||
]
|
]
|
||||||
= note: number of external vids: 3
|
= note: number of external vids: 3
|
||||||
|
|
15
src/test/ui/symbol-names/verbose.rs
Normal file
15
src/test/ui/symbol-names/verbose.rs
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
// Regression test for issue #57596, where -Zverbose flag unintentionally
|
||||||
|
// affected produced symbols making it impossible to link between crates
|
||||||
|
// with a different value of the flag (for symbols involving generic
|
||||||
|
// arguments equal to defaults of their respective parameters).
|
||||||
|
//
|
||||||
|
// build-pass
|
||||||
|
// compile-flags: -Zverbose
|
||||||
|
|
||||||
|
pub fn error(msg: String) -> Box<dyn std::error::Error> {
|
||||||
|
msg.into()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
error(String::new());
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue