mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-25 08:13:41 +00:00
Rollup merge of #109665 - fee1-dead-contrib:rm-remap-queries, r=oli-obk
Remove `remap_env_constness` in queries This removes some of the complexities with const traits. #88119 used to be caused by this but was fixed by `param_env = param_env.without_const()`.
This commit is contained in:
commit
a5136f14ae
@ -112,9 +112,6 @@ struct QueryModifiers {
|
||||
/// Use a separate query provider for local and extern crates
|
||||
separate_provide_extern: Option<Ident>,
|
||||
|
||||
/// Always remap the ParamEnv's constness before hashing.
|
||||
remap_env_constness: Option<Ident>,
|
||||
|
||||
/// Generate a `feed` method to set the query's value from another query.
|
||||
feedable: Option<Ident>,
|
||||
}
|
||||
@ -130,7 +127,6 @@ fn parse_query_modifiers(input: ParseStream<'_>) -> Result<QueryModifiers> {
|
||||
let mut eval_always = None;
|
||||
let mut depth_limit = None;
|
||||
let mut separate_provide_extern = None;
|
||||
let mut remap_env_constness = None;
|
||||
let mut feedable = None;
|
||||
|
||||
while !input.is_empty() {
|
||||
@ -189,8 +185,6 @@ fn parse_query_modifiers(input: ParseStream<'_>) -> Result<QueryModifiers> {
|
||||
try_insert!(depth_limit = modifier);
|
||||
} else if modifier == "separate_provide_extern" {
|
||||
try_insert!(separate_provide_extern = modifier);
|
||||
} else if modifier == "remap_env_constness" {
|
||||
try_insert!(remap_env_constness = modifier);
|
||||
} else if modifier == "feedable" {
|
||||
try_insert!(feedable = modifier);
|
||||
} else {
|
||||
@ -211,7 +205,6 @@ fn parse_query_modifiers(input: ParseStream<'_>) -> Result<QueryModifiers> {
|
||||
eval_always,
|
||||
depth_limit,
|
||||
separate_provide_extern,
|
||||
remap_env_constness,
|
||||
feedable,
|
||||
})
|
||||
}
|
||||
@ -332,7 +325,6 @@ pub fn rustc_queries(input: TokenStream) -> TokenStream {
|
||||
eval_always,
|
||||
depth_limit,
|
||||
separate_provide_extern,
|
||||
remap_env_constness,
|
||||
);
|
||||
|
||||
if modifiers.cache.is_some() {
|
||||
|
@ -348,14 +348,6 @@ impl<'tcx, R> Canonical<'tcx, QueryResponse<'tcx, R>> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx, R> Canonical<'tcx, ty::ParamEnvAnd<'tcx, R>> {
|
||||
#[inline]
|
||||
pub fn without_const(mut self) -> Self {
|
||||
self.value = self.value.without_const();
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx, V> Canonical<'tcx, V> {
|
||||
/// Allows you to map the `value` of a canonical while keeping the
|
||||
/// same set of bound variables.
|
||||
|
@ -1094,7 +1094,6 @@ rustc_queries! {
|
||||
key: ty::ParamEnvAnd<'tcx, mir::ConstantKind<'tcx>>
|
||||
) -> Option<mir::DestructuredConstant<'tcx>> {
|
||||
desc { "destructuring MIR constant"}
|
||||
remap_env_constness
|
||||
}
|
||||
|
||||
/// Dereference a constant reference or raw pointer and turn the result into a constant
|
||||
@ -1103,7 +1102,6 @@ rustc_queries! {
|
||||
key: ty::ParamEnvAnd<'tcx, mir::ConstantKind<'tcx>>
|
||||
) -> mir::ConstantKind<'tcx> {
|
||||
desc { "dereferencing MIR constant" }
|
||||
remap_env_constness
|
||||
}
|
||||
|
||||
query const_caller_location(key: (rustc_span::Symbol, u32, u32)) -> ConstValue<'tcx> {
|
||||
@ -1346,32 +1344,26 @@ rustc_queries! {
|
||||
/// `ty.is_copy()`, etc, since that will prune the environment where possible.
|
||||
query is_copy_raw(env: ty::ParamEnvAnd<'tcx, Ty<'tcx>>) -> bool {
|
||||
desc { "computing whether `{}` is `Copy`", env.value }
|
||||
remap_env_constness
|
||||
}
|
||||
/// Query backing `Ty::is_sized`.
|
||||
query is_sized_raw(env: ty::ParamEnvAnd<'tcx, Ty<'tcx>>) -> bool {
|
||||
desc { "computing whether `{}` is `Sized`", env.value }
|
||||
remap_env_constness
|
||||
}
|
||||
/// Query backing `Ty::is_freeze`.
|
||||
query is_freeze_raw(env: ty::ParamEnvAnd<'tcx, Ty<'tcx>>) -> bool {
|
||||
desc { "computing whether `{}` is freeze", env.value }
|
||||
remap_env_constness
|
||||
}
|
||||
/// Query backing `Ty::is_unpin`.
|
||||
query is_unpin_raw(env: ty::ParamEnvAnd<'tcx, Ty<'tcx>>) -> bool {
|
||||
desc { "computing whether `{}` is `Unpin`", env.value }
|
||||
remap_env_constness
|
||||
}
|
||||
/// Query backing `Ty::needs_drop`.
|
||||
query needs_drop_raw(env: ty::ParamEnvAnd<'tcx, Ty<'tcx>>) -> bool {
|
||||
desc { "computing whether `{}` needs drop", env.value }
|
||||
remap_env_constness
|
||||
}
|
||||
/// Query backing `Ty::has_significant_drop_raw`.
|
||||
query has_significant_drop_raw(env: ty::ParamEnvAnd<'tcx, Ty<'tcx>>) -> bool {
|
||||
desc { "computing whether `{}` has a significant drop", env.value }
|
||||
remap_env_constness
|
||||
}
|
||||
|
||||
/// Query backing `Ty::is_structural_eq_shallow`.
|
||||
@ -1411,7 +1403,6 @@ rustc_queries! {
|
||||
) -> Result<ty::layout::TyAndLayout<'tcx>, ty::layout::LayoutError<'tcx>> {
|
||||
depth_limit
|
||||
desc { "computing layout of `{}`", key.value }
|
||||
remap_env_constness
|
||||
}
|
||||
|
||||
/// Compute a `FnAbi` suitable for indirect calls, i.e. to `fn` pointers.
|
||||
@ -1422,7 +1413,6 @@ rustc_queries! {
|
||||
key: ty::ParamEnvAnd<'tcx, (ty::PolyFnSig<'tcx>, &'tcx ty::List<Ty<'tcx>>)>
|
||||
) -> Result<&'tcx abi::call::FnAbi<'tcx, Ty<'tcx>>, ty::layout::FnAbiError<'tcx>> {
|
||||
desc { "computing call ABI of `{}` function pointers", key.value.0 }
|
||||
remap_env_constness
|
||||
}
|
||||
|
||||
/// Compute a `FnAbi` suitable for declaring/defining an `fn` instance, and for
|
||||
@ -1434,7 +1424,6 @@ rustc_queries! {
|
||||
key: ty::ParamEnvAnd<'tcx, (ty::Instance<'tcx>, &'tcx ty::List<Ty<'tcx>>)>
|
||||
) -> Result<&'tcx abi::call::FnAbi<'tcx, Ty<'tcx>>, ty::layout::FnAbiError<'tcx>> {
|
||||
desc { "computing call ABI of `{}`", key.value.0 }
|
||||
remap_env_constness
|
||||
}
|
||||
|
||||
query dylib_dependency_formats(_: CrateNum)
|
||||
@ -1937,7 +1926,6 @@ rustc_queries! {
|
||||
NoSolution,
|
||||
> {
|
||||
desc { "normalizing `{}`", goal.value.value }
|
||||
remap_env_constness
|
||||
}
|
||||
|
||||
/// Do not call this query directly: invoke `try_normalize_erasing_regions` instead.
|
||||
@ -1945,7 +1933,6 @@ rustc_queries! {
|
||||
goal: ParamEnvAnd<'tcx, GenericArg<'tcx>>
|
||||
) -> Result<GenericArg<'tcx>, NoSolution> {
|
||||
desc { "normalizing `{}`", goal.value }
|
||||
remap_env_constness
|
||||
}
|
||||
|
||||
query implied_outlives_bounds(
|
||||
@ -1955,7 +1942,6 @@ rustc_queries! {
|
||||
NoSolution,
|
||||
> {
|
||||
desc { "computing implied outlives bounds for `{}`", goal.value.value }
|
||||
remap_env_constness
|
||||
}
|
||||
|
||||
/// Do not call this query directly:
|
||||
@ -1967,7 +1953,6 @@ rustc_queries! {
|
||||
NoSolution,
|
||||
> {
|
||||
desc { "computing dropck types for `{}`", goal.value.value }
|
||||
remap_env_constness
|
||||
}
|
||||
|
||||
/// Do not call this query directly: invoke `infcx.predicate_may_hold()` or
|
||||
@ -1995,7 +1980,6 @@ rustc_queries! {
|
||||
NoSolution,
|
||||
> {
|
||||
desc { "evaluating `type_op_ascribe_user_type` `{:?}`", goal.value.value }
|
||||
remap_env_constness
|
||||
}
|
||||
|
||||
/// Do not call this query directly: part of the `Eq` type-op
|
||||
@ -2006,7 +1990,6 @@ rustc_queries! {
|
||||
NoSolution,
|
||||
> {
|
||||
desc { "evaluating `type_op_eq` `{:?}`", goal.value.value }
|
||||
remap_env_constness
|
||||
}
|
||||
|
||||
/// Do not call this query directly: part of the `Subtype` type-op
|
||||
@ -2017,7 +2000,6 @@ rustc_queries! {
|
||||
NoSolution,
|
||||
> {
|
||||
desc { "evaluating `type_op_subtype` `{:?}`", goal.value.value }
|
||||
remap_env_constness
|
||||
}
|
||||
|
||||
/// Do not call this query directly: part of the `ProvePredicate` type-op
|
||||
@ -2038,7 +2020,6 @@ rustc_queries! {
|
||||
NoSolution,
|
||||
> {
|
||||
desc { "normalizing `{}`", goal.value.value.value }
|
||||
remap_env_constness
|
||||
}
|
||||
|
||||
/// Do not call this query directly: part of the `Normalize` type-op
|
||||
@ -2049,7 +2030,6 @@ rustc_queries! {
|
||||
NoSolution,
|
||||
> {
|
||||
desc { "normalizing `{:?}`", goal.value.value.value }
|
||||
remap_env_constness
|
||||
}
|
||||
|
||||
/// Do not call this query directly: part of the `Normalize` type-op
|
||||
@ -2060,7 +2040,6 @@ rustc_queries! {
|
||||
NoSolution,
|
||||
> {
|
||||
desc { "normalizing `{:?}`", goal.value.value.value }
|
||||
remap_env_constness
|
||||
}
|
||||
|
||||
/// Do not call this query directly: part of the `Normalize` type-op
|
||||
@ -2071,7 +2050,6 @@ rustc_queries! {
|
||||
NoSolution,
|
||||
> {
|
||||
desc { "normalizing `{:?}`", goal.value.value.value }
|
||||
remap_env_constness
|
||||
}
|
||||
|
||||
query subst_and_check_impossible_predicates(key: (DefId, SubstsRef<'tcx>)) -> bool {
|
||||
@ -2093,7 +2071,6 @@ rustc_queries! {
|
||||
goal: CanonicalTyGoal<'tcx>
|
||||
) -> MethodAutoderefStepsResult<'tcx> {
|
||||
desc { "computing autoderef types for `{}`", goal.value.value }
|
||||
remap_env_constness
|
||||
}
|
||||
|
||||
query supported_target_features(_: CrateNum) -> &'tcx FxHashMap<String, Option<Symbol>> {
|
||||
@ -2138,7 +2115,6 @@ rustc_queries! {
|
||||
key: ty::ParamEnvAnd<'tcx, (DefId, SubstsRef<'tcx>)>
|
||||
) -> Result<Option<ty::Instance<'tcx>>, ErrorGuaranteed> {
|
||||
desc { "resolving instance `{}`", ty::Instance::new(key.value.0, key.value.1) }
|
||||
remap_env_constness
|
||||
}
|
||||
|
||||
query resolve_instance_of_const_arg(
|
||||
@ -2148,7 +2124,6 @@ rustc_queries! {
|
||||
"resolving instance of the const argument `{}`",
|
||||
ty::Instance::new(key.value.0.to_def_id(), key.value.2),
|
||||
}
|
||||
remap_env_constness
|
||||
}
|
||||
|
||||
query reveal_opaque_types_in_bounds(key: &'tcx ty::List<ty::Predicate<'tcx>>) -> &'tcx ty::List<ty::Predicate<'tcx>> {
|
||||
|
@ -1850,12 +1850,6 @@ impl<'tcx, T> ParamEnvAnd<'tcx, T> {
|
||||
pub fn into_parts(self) -> (ParamEnv<'tcx>, T) {
|
||||
(self.param_env, self.value)
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn without_const(mut self) -> Self {
|
||||
self.param_env = self.param_env.without_const();
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug, HashStable, Encodable, Decodable)]
|
||||
|
@ -202,16 +202,6 @@ macro_rules! separate_provide_extern_default {
|
||||
};
|
||||
}
|
||||
|
||||
macro_rules! opt_remap_env_constness {
|
||||
([][$name:ident]) => {};
|
||||
([(remap_env_constness) $($rest:tt)*][$name:ident]) => {
|
||||
let $name = $name.without_const();
|
||||
};
|
||||
([$other:tt $($modifiers:tt)*][$name:ident]) => {
|
||||
opt_remap_env_constness!([$($modifiers)*][$name])
|
||||
};
|
||||
}
|
||||
|
||||
macro_rules! define_callbacks {
|
||||
(
|
||||
$($(#[$attr:meta])*
|
||||
@ -353,7 +343,6 @@ macro_rules! define_callbacks {
|
||||
#[inline(always)]
|
||||
pub fn $name(self, key: query_helper_param_ty!($($K)*)) {
|
||||
let key = key.into_query_param();
|
||||
opt_remap_env_constness!([$($modifiers)*][key]);
|
||||
|
||||
match try_get_cached(self.tcx, &self.tcx.query_system.caches.$name, &key) {
|
||||
Some(_) => return,
|
||||
@ -372,7 +361,6 @@ macro_rules! define_callbacks {
|
||||
#[inline(always)]
|
||||
pub fn $name(self, key: query_helper_param_ty!($($K)*)) {
|
||||
let key = key.into_query_param();
|
||||
opt_remap_env_constness!([$($modifiers)*][key]);
|
||||
|
||||
match try_get_cached(self.tcx, &self.tcx.query_system.caches.$name, &key) {
|
||||
Some(_) => return,
|
||||
@ -402,7 +390,6 @@ macro_rules! define_callbacks {
|
||||
pub fn $name(self, key: query_helper_param_ty!($($K)*)) -> $V
|
||||
{
|
||||
let key = key.into_query_param();
|
||||
opt_remap_env_constness!([$($modifiers)*][key]);
|
||||
|
||||
restore::<$V>(match try_get_cached(self.tcx, &self.tcx.query_system.caches.$name, &key) {
|
||||
Some(value) => value,
|
||||
@ -492,7 +479,6 @@ macro_rules! define_feedable {
|
||||
#[inline(always)]
|
||||
pub fn $name(self, value: query_provided::$name<'tcx>) -> $V {
|
||||
let key = self.key().into_query_param();
|
||||
opt_remap_env_constness!([$($modifiers)*][key]);
|
||||
|
||||
let tcx = self.tcx;
|
||||
let erased = query_provided_to_value::$name(tcx, value);
|
||||
|
@ -32,14 +32,8 @@ impl<'tcx> super::QueryTypeOp<'tcx> for ProvePredicate<'tcx> {
|
||||
|
||||
fn perform_query(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
mut canonicalized: Canonical<'tcx, ParamEnvAnd<'tcx, Self>>,
|
||||
canonicalized: Canonical<'tcx, ParamEnvAnd<'tcx, Self>>,
|
||||
) -> Fallible<CanonicalQueryResponse<'tcx, ()>> {
|
||||
match canonicalized.value.value.predicate.kind().skip_binder() {
|
||||
ty::PredicateKind::Clause(ty::Clause::Trait(pred)) => {
|
||||
canonicalized.value.param_env.remap_constness_with(pred.constness);
|
||||
}
|
||||
_ => canonicalized.value.param_env = canonicalized.value.param_env.without_const(),
|
||||
}
|
||||
tcx.type_op_prove_predicate(canonicalized)
|
||||
}
|
||||
}
|
||||
|
@ -89,6 +89,7 @@ fn relate_mir_and_user_substs<'tcx>(
|
||||
def_id: hir::def_id::DefId,
|
||||
user_substs: UserSubsts<'tcx>,
|
||||
) -> Result<(), NoSolution> {
|
||||
let param_env = param_env.without_const();
|
||||
let UserSubsts { user_self_ty, substs } = user_substs;
|
||||
let tcx = ocx.infcx.tcx;
|
||||
let cause = ObligationCause::dummy_with_span(span);
|
||||
|
@ -0,0 +1,23 @@
|
||||
// check-pass
|
||||
|
||||
struct LazyLock<T> {
|
||||
data: (Option<T>, fn() -> T),
|
||||
}
|
||||
|
||||
impl<T> LazyLock<T> {
|
||||
pub const fn new(f: fn() -> T) -> LazyLock<T> {
|
||||
LazyLock { data: (None, f) }
|
||||
}
|
||||
}
|
||||
|
||||
struct A<T = i32>(Option<T>);
|
||||
|
||||
impl<T> Default for A<T> {
|
||||
fn default() -> Self {
|
||||
A(None)
|
||||
}
|
||||
}
|
||||
|
||||
static EMPTY_SET: LazyLock<A<i32>> = LazyLock::new(A::default);
|
||||
|
||||
fn main() {}
|
Loading…
Reference in New Issue
Block a user