diff --git a/src/librustc_middle/ty/query/mod.rs b/src/librustc_middle/ty/query/mod.rs
index 9986eb88dc32..9f04cff4d2fb 100644
--- a/src/librustc_middle/ty/query/mod.rs
+++ b/src/librustc_middle/ty/query/mod.rs
@@ -189,3 +189,23 @@ pub fn force_from_dep_node<'tcx>(tcx: TyCtxt<'tcx>, dep_node: &DepNode) -> bool
pub(crate) fn try_load_from_on_disk_cache<'tcx>(tcx: TyCtxt<'tcx>, dep_node: &DepNode) {
rustc_dep_node_try_load_from_on_disk_cache!(dep_node, tcx)
}
+
+/// An analogue of the `Into` trait that's intended only for query paramaters.
+///
+/// This exists to allow queries to accept either `DefId` or `LocalDefId` while requiring that the
+/// user call `to_def_id` to convert between them everywhere else.
+pub trait IntoQueryParam
{
+ fn into_query_param(self) -> P;
+}
+
+impl
IntoQueryParam
for P {
+ fn into_query_param(self) -> P {
+ self
+ }
+}
+
+impl IntoQueryParam for LocalDefId {
+ fn into_query_param(self) -> DefId {
+ self.to_def_id()
+ }
+}
diff --git a/src/librustc_middle/ty/query/plumbing.rs b/src/librustc_middle/ty/query/plumbing.rs
index f3a49438f5b2..068322b08b7a 100644
--- a/src/librustc_middle/ty/query/plumbing.rs
+++ b/src/librustc_middle/ty/query/plumbing.rs
@@ -243,7 +243,7 @@ macro_rules! define_queries {
}
macro_rules! query_helper_param_ty {
- (DefId) => { impl Into };
+ (DefId) => { impl IntoQueryParam };
($K:ty) => { $K };
}
@@ -386,7 +386,7 @@ macro_rules! define_queries_inner {
$($(#[$attr])*
#[inline(always)]
pub fn $name(self, key: query_helper_param_ty!($($K)*)) {
- ensure_query::, _>(self.tcx, key.into())
+ ensure_query::, _>(self.tcx, key.into_query_param())
})*
}
@@ -464,7 +464,7 @@ macro_rules! define_queries_inner {
$($(#[$attr])*
#[inline(always)]
pub fn $name(self, key: query_helper_param_ty!($($K)*)) -> $V {
- get_query::, _>(self.tcx, self.span, key.into())
+ get_query::, _>(self.tcx, self.span, key.into_query_param())
})*
}