Use ConstCx in more places
This commit is contained in:
parent
6a3fb269ed
commit
f0f7a59eaa
@ -42,7 +42,10 @@ use rustc_trait_selection::traits::{self, ObligationCause, PredicateObligations}
|
|||||||
use crate::dataflow::move_paths::MoveData;
|
use crate::dataflow::move_paths::MoveData;
|
||||||
use crate::dataflow::MaybeInitializedPlaces;
|
use crate::dataflow::MaybeInitializedPlaces;
|
||||||
use crate::dataflow::ResultsCursor;
|
use crate::dataflow::ResultsCursor;
|
||||||
use crate::transform::promote_consts::should_suggest_const_in_array_repeat_expressions_attribute;
|
use crate::transform::{
|
||||||
|
check_consts::ConstCx,
|
||||||
|
promote_consts::should_suggest_const_in_array_repeat_expressions_attribute,
|
||||||
|
};
|
||||||
|
|
||||||
use crate::borrow_check::{
|
use crate::borrow_check::{
|
||||||
borrow_set::BorrowSet,
|
borrow_set::BorrowSet,
|
||||||
@ -1984,14 +1987,17 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
|
|||||||
let span = body.source_info(location).span;
|
let span = body.source_info(location).span;
|
||||||
let ty = operand.ty(body, tcx);
|
let ty = operand.ty(body, tcx);
|
||||||
if !self.infcx.type_is_copy_modulo_regions(self.param_env, ty, span) {
|
if !self.infcx.type_is_copy_modulo_regions(self.param_env, ty, span) {
|
||||||
|
let ccx = ConstCx::new_with_param_env(
|
||||||
|
tcx,
|
||||||
|
self.mir_def_id,
|
||||||
|
body,
|
||||||
|
self.param_env,
|
||||||
|
);
|
||||||
// To determine if `const_in_array_repeat_expressions` feature gate should
|
// To determine if `const_in_array_repeat_expressions` feature gate should
|
||||||
// be mentioned, need to check if the rvalue is promotable.
|
// be mentioned, need to check if the rvalue is promotable.
|
||||||
let should_suggest =
|
let should_suggest =
|
||||||
should_suggest_const_in_array_repeat_expressions_attribute(
|
should_suggest_const_in_array_repeat_expressions_attribute(
|
||||||
tcx,
|
ccx, operand,
|
||||||
self.mir_def_id,
|
|
||||||
body,
|
|
||||||
operand,
|
|
||||||
);
|
);
|
||||||
debug!("check_rvalue: should_suggest={:?}", should_suggest);
|
debug!("check_rvalue: should_suggest={:?}", should_suggest);
|
||||||
|
|
||||||
|
@ -31,6 +31,15 @@ pub struct ConstCx<'mir, 'tcx> {
|
|||||||
impl ConstCx<'mir, 'tcx> {
|
impl ConstCx<'mir, 'tcx> {
|
||||||
pub fn new(tcx: TyCtxt<'tcx>, def_id: DefId, body: &'mir mir::Body<'tcx>) -> Self {
|
pub fn new(tcx: TyCtxt<'tcx>, def_id: DefId, body: &'mir mir::Body<'tcx>) -> Self {
|
||||||
let param_env = tcx.param_env(def_id);
|
let param_env = tcx.param_env(def_id);
|
||||||
|
Self::new_with_param_env(tcx, def_id, body, param_env)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn new_with_param_env(
|
||||||
|
tcx: TyCtxt<'tcx>,
|
||||||
|
def_id: DefId,
|
||||||
|
body: &'mir mir::Body<'tcx>,
|
||||||
|
param_env: ty::ParamEnv<'tcx>,
|
||||||
|
) -> Self {
|
||||||
let const_kind = ConstKind::for_item(tcx, def_id);
|
let const_kind = ConstKind::for_item(tcx, def_id);
|
||||||
|
|
||||||
ConstCx { body, tcx, def_id, param_env, const_kind }
|
ConstCx { body, tcx, def_id, param_env, const_kind }
|
||||||
|
@ -1147,22 +1147,19 @@ pub fn promote_candidates<'tcx>(
|
|||||||
/// Feature attribute should be suggested if `operand` can be promoted and the feature is not
|
/// Feature attribute should be suggested if `operand` can be promoted and the feature is not
|
||||||
/// enabled.
|
/// enabled.
|
||||||
crate fn should_suggest_const_in_array_repeat_expressions_attribute<'tcx>(
|
crate fn should_suggest_const_in_array_repeat_expressions_attribute<'tcx>(
|
||||||
tcx: TyCtxt<'tcx>,
|
ccx: ConstCx<'_, 'tcx>,
|
||||||
mir_def_id: DefId,
|
|
||||||
body: &Body<'tcx>,
|
|
||||||
operand: &Operand<'tcx>,
|
operand: &Operand<'tcx>,
|
||||||
) -> bool {
|
) -> bool {
|
||||||
let mut rpo = traversal::reverse_postorder(&body);
|
let mut rpo = traversal::reverse_postorder(&ccx.body);
|
||||||
let (temps, _) = collect_temps_and_candidates(tcx, &body, &mut rpo);
|
let (temps, _) = collect_temps_and_candidates(ccx.tcx, &ccx.body, &mut rpo);
|
||||||
let validator =
|
let validator = Validator { ccx, temps: &temps, explicit: false };
|
||||||
Validator { ccx: ConstCx::new(tcx, mir_def_id, body), temps: &temps, explicit: false };
|
|
||||||
|
|
||||||
let should_promote = validator.validate_operand(operand).is_ok();
|
let should_promote = validator.validate_operand(operand).is_ok();
|
||||||
let feature_flag = tcx.features().const_in_array_repeat_expressions;
|
let feature_flag = validator.ccx.tcx.features().const_in_array_repeat_expressions;
|
||||||
debug!(
|
debug!(
|
||||||
"should_suggest_const_in_array_repeat_expressions_flag: mir_def_id={:?} \
|
"should_suggest_const_in_array_repeat_expressions_flag: def_id={:?} \
|
||||||
should_promote={:?} feature_flag={:?}",
|
should_promote={:?} feature_flag={:?}",
|
||||||
mir_def_id, should_promote, feature_flag
|
validator.ccx.def_id, should_promote, feature_flag
|
||||||
);
|
);
|
||||||
should_promote && !feature_flag
|
should_promote && !feature_flag
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user