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
@ -188,11 +188,6 @@ fn generic_args_to_print(
|
||||
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.
|
||||
own_params.end -= generics
|
||||
.params
|
||||
|
@ -25,7 +25,7 @@ fn foo<'z>() where &'z (): Sized {
|
||||
let x: () = <i8 as Foo<'static, 'static, u32>>::bar::<'static, char>;
|
||||
//[verbose]~^ ERROR mismatched types
|
||||
//[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]~| expected unit type `()`
|
||||
//[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
|
||||
|
|
||||
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>;
|
||||
| -- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `()`, found fn item
|
||||
@ -28,7 +28,7 @@ LL | let x: () = <i8 as Foo<'static, 'static, u32>>::bar::<'static, char>;
|
||||
| expected due to this
|
||||
|
|
||||
= 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
|
||||
|
|
||||
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 [
|
||||
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
|
||||
@ -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 [
|
||||
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
|
||||
@ -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 [
|
||||
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
|
||||
@ -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 [
|
||||
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
|
||||
|
@ -6,7 +6,7 @@ LL | with_signature(x, |y| y)
|
||||
|
|
||||
= note: defining type: no_region::<'_#1r, T>::{closure#0} with closure substs [
|
||||
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
|
||||
|
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…
Reference in New Issue
Block a user