#[inline(always)]
fn noop<T>(_: &T) {}
+/// Helper to ensure that queries only return `Copy` types.
+#[inline(always)]
+fn copy<T: Copy>(x: &T) -> T {
+ *x
+}
+
macro_rules! query_helper_param_ty {
(DefId) => { impl IntoQueryParam<DefId> };
($K:ty) => { $K };
#[derive(Default)]
pub struct QueryCaches<$tcx> {
- $($(#[$attr])* pub $name: QueryCacheStore<query_storage::$name<$tcx>>,)*
+ $($(#[$attr])* pub $name: query_storage::$name<$tcx>,)*
}
impl<$tcx> TyCtxtEnsure<$tcx> {
let cached = try_get_cached(self.tcx, &self.tcx.query_caches.$name, &key, noop);
- let lookup = match cached {
+ match cached {
Ok(()) => return,
- Err(lookup) => lookup,
- };
+ Err(()) => (),
+ }
- self.tcx.queries.$name(self.tcx, DUMMY_SP, key, lookup, QueryMode::Ensure);
+ self.tcx.queries.$name(self.tcx, DUMMY_SP, key, QueryMode::Ensure);
})*
}
let key = key.into_query_param();
opt_remap_env_constness!([$($modifiers)*][key]);
- let cached = try_get_cached(self.tcx, &self.tcx.query_caches.$name, &key, Clone::clone);
+ let cached = try_get_cached(self.tcx, &self.tcx.query_caches.$name, &key, copy);
- let lookup = match cached {
+ match cached {
Ok(value) => return value,
- Err(lookup) => lookup,
- };
+ Err(()) => (),
+ }
- self.tcx.queries.$name(self.tcx, self.span, key, lookup, QueryMode::Get).unwrap()
+ self.tcx.queries.$name(self.tcx, self.span, key, QueryMode::Get).unwrap()
})*
}
tcx: TyCtxt<$tcx>,
span: Span,
key: query_keys::$name<$tcx>,
- lookup: QueryLookup,
mode: QueryMode,
) -> Option<query_stored::$name<$tcx>>;)*
}
}
}
+ impl<'a, P: Copy> IntoQueryParam<P> for &'a P {
+ #[inline(always)]
+ fn into_query_param(self) -> P {
+ *self
+ }
+ }
+
impl IntoQueryParam<DefId> for LocalDefId {
#[inline(always)]
fn into_query_param(self) -> DefId {