diff options
| author | Maybe Waffle <waffle.lapkin@gmail.com> | 2023-04-17 19:19:59 +0000 |
|---|---|---|
| committer | Maybe Waffle <waffle.lapkin@gmail.com> | 2023-04-17 19:19:59 +0000 |
| commit | c960a043e368c1e89974dbed244a3fdae222109a (patch) | |
| tree | 655c91647f49fc106101f0d0cd5bec4c665aa54e | |
| parent | e49122fb1ca87a6c3e3c22abb315fc75cfe8daed (diff) | |
Assure everyone that `has_type_flags` is fast
| -rw-r--r-- | compiler/rustc_middle/src/ty/visit.rs | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/compiler/rustc_middle/src/ty/visit.rs b/compiler/rustc_middle/src/ty/visit.rs index 24a1f04c7e3..1b07f52afca 100644 --- a/compiler/rustc_middle/src/ty/visit.rs +++ b/compiler/rustc_middle/src/ty/visit.rs @@ -33,6 +33,14 @@ pub trait TypeVisitableExt<'tcx>: TypeVisitable<TyCtxt<'tcx>> { } fn has_type_flags(&self, flags: TypeFlags) -> bool { + // N.B. Even though this uses a visitor, the visitor does not actually + // recurse through the whole `TypeVisitable` implementor type. + // + // Instead it stops on the first "level", visiting types, regions, + // consts and predicates just fetches their type flags. + // + // Thus this is a lot faster than it might seem and should be + // optimized to a simple field access. let res = self.visit_with(&mut HasTypeFlagsVisitor { flags }).break_value() == Some(FoundFlags); trace!(?self, ?flags, ?res, "has_type_flags"); |
