mirror of
https://github.com/rust-lang/rust.git
synced 2025-02-27 22:34:14 +00:00
Rollup merge of #61195 - davidtwco:seg-fault-mangler, r=eddyb
Special-case `.llvm` in mangler Fixes #60925 and fixes #53912. r? @michaelwoerister cc @eddyb
This commit is contained in:
commit
dae331d921
@ -629,6 +629,9 @@ impl fmt::Write for SymbolPrinter<'_, '_> {
|
||||
// for ':' and '-'
|
||||
'-' | ':' => self.path.temp_buf.push('.'),
|
||||
|
||||
// Avoid segmentation fault on some platforms, see #60925.
|
||||
'm' if self.path.temp_buf.ends_with(".llv") => self.path.temp_buf.push_str("$6d$"),
|
||||
|
||||
// These are legal symbols
|
||||
'a'..='z' | 'A'..='Z' | '0'..='9' | '_' | '.' | '$' => self.path.temp_buf.push(c),
|
||||
|
||||
|
37
src/test/ui/issue-53912.rs
Normal file
37
src/test/ui/issue-53912.rs
Normal file
@ -0,0 +1,37 @@
|
||||
// compile-pass
|
||||
|
||||
// This test is the same code as in ui/symbol-names/issue-60925.rs but this checks that the
|
||||
// reproduction compiles successfully and doesn't segfault, whereas that test just checks that the
|
||||
// symbol mangling fix produces the correct result.
|
||||
|
||||
fn dummy() {}
|
||||
|
||||
mod llvm {
|
||||
pub(crate) struct Foo;
|
||||
}
|
||||
mod foo {
|
||||
pub(crate) struct Foo<T>(T);
|
||||
|
||||
impl Foo<::llvm::Foo> {
|
||||
pub(crate) fn foo() {
|
||||
for _ in 0..0 {
|
||||
for _ in &[::dummy()] {
|
||||
::dummy();
|
||||
::dummy();
|
||||
::dummy();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) fn foo() {
|
||||
Foo::foo();
|
||||
Foo::foo();
|
||||
}
|
||||
}
|
||||
|
||||
pub fn foo() {
|
||||
foo::foo();
|
||||
}
|
||||
|
||||
fn main() {}
|
39
src/test/ui/symbol-names/issue-60925.rs
Normal file
39
src/test/ui/symbol-names/issue-60925.rs
Normal file
@ -0,0 +1,39 @@
|
||||
#![feature(rustc_attrs)]
|
||||
|
||||
// This test is the same code as in ui/issue-53912.rs but this test checks that the symbol mangling
|
||||
// fix produces the correct result, whereas that test just checks that the reproduction compiles
|
||||
// successfully and doesn't segfault
|
||||
|
||||
fn dummy() {}
|
||||
|
||||
mod llvm {
|
||||
pub(crate) struct Foo;
|
||||
}
|
||||
mod foo {
|
||||
pub(crate) struct Foo<T>(T);
|
||||
|
||||
impl Foo<::llvm::Foo> {
|
||||
#[rustc_symbol_name]
|
||||
//~^ ERROR _ZN11issue_609253foo36Foo$LT$issue_60925..llv$6d$..Foo$GT$3foo17h059a991a004536adE
|
||||
pub(crate) fn foo() {
|
||||
for _ in 0..0 {
|
||||
for _ in &[::dummy()] {
|
||||
::dummy();
|
||||
::dummy();
|
||||
::dummy();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) fn foo() {
|
||||
Foo::foo();
|
||||
Foo::foo();
|
||||
}
|
||||
}
|
||||
|
||||
pub fn foo() {
|
||||
foo::foo();
|
||||
}
|
||||
|
||||
fn main() {}
|
8
src/test/ui/symbol-names/issue-60925.stderr
Normal file
8
src/test/ui/symbol-names/issue-60925.stderr
Normal file
@ -0,0 +1,8 @@
|
||||
error: symbol-name(_ZN11issue_609253foo36Foo$LT$issue_60925..llv$6d$..Foo$GT$3foo17h059a991a004536adE)
|
||||
--> $DIR/issue-60925.rs:16:9
|
||||
|
|
||||
LL | #[rustc_symbol_name]
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
Loading…
Reference in New Issue
Block a user