about summary refs log tree commit diff
path: root/compiler/rustc_mir_transform/src
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2024-01-22 02:34:55 +0000
committerbors <bors@rust-lang.org>2024-01-22 02:34:55 +0000
commita58ec8ff03b3269b20104eb7eae407be48ab95a7 (patch)
tree8baf819e5870a3c624795baf7e6e9cca32892b87 /compiler/rustc_mir_transform/src
parentef71f1047e04438181d7cb925a833e2ada6ab390 (diff)
parentad25f0eb2c75c0fcfd5c81258d6913342849e50c (diff)
downloadrust-a58ec8ff03b3269b20104eb7eae407be48ab95a7.tar.gz
rust-a58ec8ff03b3269b20104eb7eae407be48ab95a7.zip
Auto merge of #120161 - cjgillot:static-pass-name, r=tmiasko
Make MIR pass name a compile-time constant.

Post-processing a compile-time string at runtime is a bit silly. This PR makes CTFE do it all.
Diffstat (limited to 'compiler/rustc_mir_transform/src')
-rw-r--r--compiler/rustc_mir_transform/src/lib.rs2
-rw-r--r--compiler/rustc_mir_transform/src/pass_manager.rs16
2 files changed, 16 insertions, 2 deletions
diff --git a/compiler/rustc_mir_transform/src/lib.rs b/compiler/rustc_mir_transform/src/lib.rs
index 19bfed4333c..a78a3fd594d 100644
--- a/compiler/rustc_mir_transform/src/lib.rs
+++ b/compiler/rustc_mir_transform/src/lib.rs
@@ -2,9 +2,11 @@
 #![deny(rustc::diagnostic_outside_of_impl)]
 #![feature(assert_matches)]
 #![feature(box_patterns)]
+#![feature(const_type_name)]
 #![feature(cow_is_borrowed)]
 #![feature(decl_macro)]
 #![feature(impl_trait_in_assoc_type)]
+#![feature(inline_const)]
 #![feature(is_sorted)]
 #![feature(let_chains)]
 #![feature(map_try_insert)]
diff --git a/compiler/rustc_mir_transform/src/pass_manager.rs b/compiler/rustc_mir_transform/src/pass_manager.rs
index f4c572aec12..c1ef2b9f887 100644
--- a/compiler/rustc_mir_transform/src/pass_manager.rs
+++ b/compiler/rustc_mir_transform/src/pass_manager.rs
@@ -7,8 +7,20 @@ use crate::{lint::lint_body, validate, MirPass};
 /// Just like `MirPass`, except it cannot mutate `Body`.
 pub trait MirLint<'tcx> {
     fn name(&self) -> &'static str {
-        let name = std::any::type_name::<Self>();
-        if let Some((_, tail)) = name.rsplit_once(':') { tail } else { name }
+        // FIXME Simplify the implementation once more `str` methods get const-stable.
+        const {
+            let name = std::any::type_name::<Self>();
+            let bytes = name.as_bytes();
+            let mut i = bytes.len();
+            while i > 0 && bytes[i - 1] != b':' {
+                i = i - 1;
+            }
+            let (_, bytes) = bytes.split_at(i);
+            match std::str::from_utf8(bytes) {
+                Ok(name) => name,
+                Err(_) => name,
+            }
+        }
     }
 
     fn is_enabled(&self, _sess: &Session) -> bool {