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
4 changed files with 87 additions and 0 deletions
|
@ -629,6 +629,9 @@ impl fmt::Write for SymbolPrinter<'_, '_> {
|
||||||
// for ':' and '-'
|
// for ':' and '-'
|
||||||
'-' | ':' => self.path.temp_buf.push('.'),
|
'-' | ':' => 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
|
// These are legal symbols
|
||||||
'a'..='z' | 'A'..='Z' | '0'..='9' | '_' | '.' | '$' => self.path.temp_buf.push(c),
|
'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…
Add table
Add a link
Reference in a new issue