diff options
| author | bors <bors@rust-lang.org> | 2024-01-22 02:34:55 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2024-01-22 02:34:55 +0000 |
| commit | a58ec8ff03b3269b20104eb7eae407be48ab95a7 (patch) | |
| tree | 8baf819e5870a3c624795baf7e6e9cca32892b87 /compiler/rustc_mir_transform/src | |
| parent | ef71f1047e04438181d7cb925a833e2ada6ab390 (diff) | |
| parent | ad25f0eb2c75c0fcfd5c81258d6913342849e50c (diff) | |
| download | rust-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.rs | 2 | ||||
| -rw-r--r-- | compiler/rustc_mir_transform/src/pass_manager.rs | 16 |
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 { |
