about summary refs log tree commit diff
diff options
context:
space:
mode:
authorNicholas Nethercote <n.nethercote@gmail.com>2025-05-21 13:28:08 +1000
committerNicholas Nethercote <n.nethercote@gmail.com>2025-05-21 18:59:04 +1000
commit1cc0e38fdc4d2ec8c9c130d7ffc9c30d100885a2 (patch)
treeb12090a853518ebdb1176f347bdfa9d4ea60d221
parent59372f2c81ba74554d9a71b12a4ed7f29adb33a2 (diff)
downloadrust-1cc0e38fdc4d2ec8c9c130d7ffc9c30d100885a2.tar.gz
rust-1cc0e38fdc4d2ec8c9c130d7ffc9c30d100885a2.zip
Avoid creating an empty identifer in `Symbol::to_ident_string`.
Because that causes an assertion failure in debug builds.

Fixes #140884.
-rw-r--r--compiler/rustc_span/src/symbol.rs3
-rw-r--r--tests/crashes/140884.rs6
-rw-r--r--tests/ui/extern/extern-empty-string-issue-140884.rs3
-rw-r--r--tests/ui/extern/extern-empty-string-issue-140884.stderr15
4 files changed, 20 insertions, 7 deletions
diff --git a/compiler/rustc_span/src/symbol.rs b/compiler/rustc_span/src/symbol.rs
index efae6250b07..fbe3b4ca6f5 100644
--- a/compiler/rustc_span/src/symbol.rs
+++ b/compiler/rustc_span/src/symbol.rs
@@ -2592,7 +2592,8 @@ impl Symbol {
     /// (`token_to_string`, `Ident::to_string`), except that symbols don't keep the rawness flag
     /// or edition, so we have to guess the rawness using the global edition.
     pub fn to_ident_string(self) -> String {
-        Ident::with_dummy_span(self).to_string()
+        // Avoid creating an empty identifier, because that asserts in debug builds.
+        if self == kw::Empty { String::new() } else { Ident::with_dummy_span(self).to_string() }
     }
 }
 
diff --git a/tests/crashes/140884.rs b/tests/crashes/140884.rs
deleted file mode 100644
index 6840760933a..00000000000
--- a/tests/crashes/140884.rs
+++ /dev/null
@@ -1,6 +0,0 @@
-//@ known-bug: #140884
-//@ needs-rustc-debug-assertions
-
-fn a() {
-    extern "" {}
-}
diff --git a/tests/ui/extern/extern-empty-string-issue-140884.rs b/tests/ui/extern/extern-empty-string-issue-140884.rs
new file mode 100644
index 00000000000..10291513d34
--- /dev/null
+++ b/tests/ui/extern/extern-empty-string-issue-140884.rs
@@ -0,0 +1,3 @@
+extern "" {} //~ ERROR invalid ABI: found ``
+
+fn main() {}
diff --git a/tests/ui/extern/extern-empty-string-issue-140884.stderr b/tests/ui/extern/extern-empty-string-issue-140884.stderr
new file mode 100644
index 00000000000..accae0c0f7c
--- /dev/null
+++ b/tests/ui/extern/extern-empty-string-issue-140884.stderr
@@ -0,0 +1,15 @@
+error[E0703]: invalid ABI: found ``
+  --> $DIR/extern-empty-string-issue-140884.rs:1:8
+   |
+LL | extern "" {}
+   |        ^^ invalid ABI
+   |
+   = note: invoke `rustc --print=calling-conventions` for a full list of supported calling conventions
+help: there's a similarly named valid ABI `C`
+   |
+LL | extern "C" {}
+   |         +
+
+error: aborting due to 1 previous error
+
+For more information about this error, try `rustc --explain E0703`.