Rollup merge of #126410 - RalfJung:smir-const-operand, r=oli-obk
smir: merge identical Constant and ConstOperand types The first commit renames the const operand visitor functions on regular MIR to match the type name, that was forgotten in the original rename. The second commit changes stable MIR, fixing https://github.com/rust-lang/project-stable-mir/issues/71. Previously there were two different smir types for the MIR type `ConstOperand`, one used in `Operand` and one in `VarDebugInfoContents`. Maybe we should have done this with https://github.com/rust-lang/rust/pull/125967, so there's only a single breaking change... but I saw that PR too late. Fixes https://github.com/rust-lang/project-stable-mir/issues/71
This commit is contained in:
commit
be1d42776d
16 changed files with 52 additions and 55 deletions
|
@ -113,7 +113,7 @@ impl<'a, 'tcx> MutVisitor<'tcx> for RegionRenumberer<'a, 'tcx> {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[instrument(skip(self), level = "debug")]
|
#[instrument(skip(self), level = "debug")]
|
||||||
fn visit_constant(&mut self, constant: &mut ConstOperand<'tcx>, location: Location) {
|
fn visit_const_operand(&mut self, constant: &mut ConstOperand<'tcx>, location: Location) {
|
||||||
let const_ = constant.const_;
|
let const_ = constant.const_;
|
||||||
constant.const_ = self.renumber_regions(const_, || RegionCtxt::Location(location));
|
constant.const_ = self.renumber_regions(const_, || RegionCtxt::Location(location));
|
||||||
debug!("constant: {:#?}", constant);
|
debug!("constant: {:#?}", constant);
|
||||||
|
|
|
@ -301,10 +301,10 @@ impl<'a, 'b, 'tcx> Visitor<'tcx> for TypeVerifier<'a, 'b, 'tcx> {
|
||||||
self.sanitize_place(place, location, context);
|
self.sanitize_place(place, location, context);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn visit_constant(&mut self, constant: &ConstOperand<'tcx>, location: Location) {
|
fn visit_const_operand(&mut self, constant: &ConstOperand<'tcx>, location: Location) {
|
||||||
debug!(?constant, ?location, "visit_constant");
|
debug!(?constant, ?location, "visit_const_operand");
|
||||||
|
|
||||||
self.super_constant(constant, location);
|
self.super_const_operand(constant, location);
|
||||||
let ty = self.sanitize_type(constant, constant.const_.ty());
|
let ty = self.sanitize_type(constant, constant.const_.ty());
|
||||||
|
|
||||||
self.cx.infcx.tcx.for_each_free_region(&ty, |live_region| {
|
self.cx.infcx.tcx.for_each_free_region(&ty, |live_region| {
|
||||||
|
|
|
@ -1287,7 +1287,7 @@ fn use_verbose(ty: Ty<'_>, fn_def: bool) -> bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> Visitor<'tcx> for ExtraComments<'tcx> {
|
impl<'tcx> Visitor<'tcx> for ExtraComments<'tcx> {
|
||||||
fn visit_constant(&mut self, constant: &ConstOperand<'tcx>, _location: Location) {
|
fn visit_const_operand(&mut self, constant: &ConstOperand<'tcx>, _location: Location) {
|
||||||
let ConstOperand { span, user_ty, const_ } = constant;
|
let ConstOperand { span, user_ty, const_ } = constant;
|
||||||
if use_verbose(const_.ty(), true) {
|
if use_verbose(const_.ty(), true) {
|
||||||
self.push("mir::ConstOperand");
|
self.push("mir::ConstOperand");
|
||||||
|
@ -1415,7 +1415,7 @@ pub fn write_allocations<'tcx>(
|
||||||
struct CollectAllocIds(BTreeSet<AllocId>);
|
struct CollectAllocIds(BTreeSet<AllocId>);
|
||||||
|
|
||||||
impl<'tcx> Visitor<'tcx> for CollectAllocIds {
|
impl<'tcx> Visitor<'tcx> for CollectAllocIds {
|
||||||
fn visit_constant(&mut self, c: &ConstOperand<'tcx>, _: Location) {
|
fn visit_const_operand(&mut self, c: &ConstOperand<'tcx>, _: Location) {
|
||||||
match c.const_ {
|
match c.const_ {
|
||||||
Const::Ty(_, _) | Const::Unevaluated(..) => {}
|
Const::Ty(_, _) | Const::Unevaluated(..) => {}
|
||||||
Const::Val(val, _) => {
|
Const::Val(val, _) => {
|
||||||
|
|
|
@ -184,12 +184,12 @@ macro_rules! make_mir_visitor {
|
||||||
|
|
||||||
/// This is called for every constant in the MIR body and every `required_consts`
|
/// This is called for every constant in the MIR body and every `required_consts`
|
||||||
/// (i.e., including consts that have been dead-code-eliminated).
|
/// (i.e., including consts that have been dead-code-eliminated).
|
||||||
fn visit_constant(
|
fn visit_const_operand(
|
||||||
&mut self,
|
&mut self,
|
||||||
constant: & $($mutability)? ConstOperand<'tcx>,
|
constant: & $($mutability)? ConstOperand<'tcx>,
|
||||||
location: Location,
|
location: Location,
|
||||||
) {
|
) {
|
||||||
self.super_constant(constant, location);
|
self.super_const_operand(constant, location);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn visit_ty_const(
|
fn visit_ty_const(
|
||||||
|
@ -597,7 +597,7 @@ macro_rules! make_mir_visitor {
|
||||||
}
|
}
|
||||||
InlineAsmOperand::Const { value }
|
InlineAsmOperand::Const { value }
|
||||||
| InlineAsmOperand::SymFn { value } => {
|
| InlineAsmOperand::SymFn { value } => {
|
||||||
self.visit_constant(value, location);
|
self.visit_const_operand(value, location);
|
||||||
}
|
}
|
||||||
InlineAsmOperand::Out { place: None, .. }
|
InlineAsmOperand::Out { place: None, .. }
|
||||||
| InlineAsmOperand::SymStatic { def_id: _ }
|
| InlineAsmOperand::SymStatic { def_id: _ }
|
||||||
|
@ -788,7 +788,7 @@ macro_rules! make_mir_visitor {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
Operand::Constant(constant) => {
|
Operand::Constant(constant) => {
|
||||||
self.visit_constant(constant, location);
|
self.visit_const_operand(constant, location);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -867,7 +867,7 @@ macro_rules! make_mir_visitor {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
match value {
|
match value {
|
||||||
VarDebugInfoContents::Const(c) => self.visit_constant(c, location),
|
VarDebugInfoContents::Const(c) => self.visit_const_operand(c, location),
|
||||||
VarDebugInfoContents::Place(place) =>
|
VarDebugInfoContents::Place(place) =>
|
||||||
self.visit_place(
|
self.visit_place(
|
||||||
place,
|
place,
|
||||||
|
@ -882,7 +882,7 @@ macro_rules! make_mir_visitor {
|
||||||
_scope: $(& $mutability)? SourceScope
|
_scope: $(& $mutability)? SourceScope
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
fn super_constant(
|
fn super_const_operand(
|
||||||
&mut self,
|
&mut self,
|
||||||
constant: & $($mutability)? ConstOperand<'tcx>,
|
constant: & $($mutability)? ConstOperand<'tcx>,
|
||||||
location: Location
|
location: Location
|
||||||
|
@ -1057,7 +1057,7 @@ macro_rules! super_body {
|
||||||
|
|
||||||
for const_ in &$($mutability)? $body.required_consts {
|
for const_ in &$($mutability)? $body.required_consts {
|
||||||
let location = Location::START;
|
let location = Location::START;
|
||||||
$self.visit_constant(const_, location);
|
$self.visit_const_operand(const_, location);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -706,9 +706,9 @@ impl<'tcx> Visitor<'tcx> for ConstPropagator<'_, 'tcx> {
|
||||||
self.super_operand(operand, location);
|
self.super_operand(operand, location);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn visit_constant(&mut self, constant: &ConstOperand<'tcx>, location: Location) {
|
fn visit_const_operand(&mut self, constant: &ConstOperand<'tcx>, location: Location) {
|
||||||
trace!("visit_constant: {:?}", constant);
|
trace!("visit_const_operand: {:?}", constant);
|
||||||
self.super_constant(constant, location);
|
self.super_const_operand(constant, location);
|
||||||
self.eval_constant(constant);
|
self.eval_constant(constant);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -956,7 +956,7 @@ impl<'a, 'tcx> MutVisitor<'tcx> for Promoter<'a, 'tcx> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn visit_constant(&mut self, constant: &mut ConstOperand<'tcx>, _location: Location) {
|
fn visit_const_operand(&mut self, constant: &mut ConstOperand<'tcx>, _location: Location) {
|
||||||
if constant.const_.is_required_const() {
|
if constant.const_.is_required_const() {
|
||||||
self.promoted.required_consts.push(*constant);
|
self.promoted.required_consts.push(*constant);
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,7 @@ impl<'a, 'tcx> RequiredConstsVisitor<'a, 'tcx> {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> Visitor<'tcx> for RequiredConstsVisitor<'_, 'tcx> {
|
impl<'tcx> Visitor<'tcx> for RequiredConstsVisitor<'_, 'tcx> {
|
||||||
fn visit_constant(&mut self, constant: &ConstOperand<'tcx>, _: Location) {
|
fn visit_const_operand(&mut self, constant: &ConstOperand<'tcx>, _: Location) {
|
||||||
if constant.const_.is_required_const() {
|
if constant.const_.is_required_const() {
|
||||||
self.required_consts.push(*constant);
|
self.required_consts.push(*constant);
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,14 +49,14 @@ impl<'tcx> MutVisitor<'tcx> for RevealAllVisitor<'tcx> {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn visit_constant(&mut self, constant: &mut ConstOperand<'tcx>, location: Location) {
|
fn visit_const_operand(&mut self, constant: &mut ConstOperand<'tcx>, location: Location) {
|
||||||
// We have to use `try_normalize_erasing_regions` here, since it's
|
// We have to use `try_normalize_erasing_regions` here, since it's
|
||||||
// possible that we visit impossible-to-satisfy where clauses here,
|
// possible that we visit impossible-to-satisfy where clauses here,
|
||||||
// see #91745
|
// see #91745
|
||||||
if let Ok(c) = self.tcx.try_normalize_erasing_regions(self.param_env, constant.const_) {
|
if let Ok(c) = self.tcx.try_normalize_erasing_regions(self.param_env, constant.const_) {
|
||||||
constant.const_ = c;
|
constant.const_ = c;
|
||||||
}
|
}
|
||||||
self.super_constant(constant, location);
|
self.super_const_operand(constant, location);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
|
|
|
@ -799,7 +799,7 @@ impl<'a, 'tcx> MirVisitor<'tcx> for MirUsedCollector<'a, 'tcx> {
|
||||||
/// This does not walk the MIR of the constant as that is not needed for codegen, all we need is
|
/// This does not walk the MIR of the constant as that is not needed for codegen, all we need is
|
||||||
/// to ensure that the constant evaluates successfully and walk the result.
|
/// to ensure that the constant evaluates successfully and walk the result.
|
||||||
#[instrument(skip(self), level = "debug")]
|
#[instrument(skip(self), level = "debug")]
|
||||||
fn visit_constant(&mut self, constant: &mir::ConstOperand<'tcx>, location: Location) {
|
fn visit_const_operand(&mut self, constant: &mir::ConstOperand<'tcx>, location: Location) {
|
||||||
// No `super_constant` as we don't care about `visit_ty`/`visit_ty_const`.
|
// No `super_constant` as we don't care about `visit_ty`/`visit_ty_const`.
|
||||||
let Some(val) = self.eval_constant(constant) else { return };
|
let Some(val) = self.eval_constant(constant) else { return };
|
||||||
collect_const_value(self.tcx, val, self.used_items);
|
collect_const_value(self.tcx, val, self.used_items);
|
||||||
|
|
|
@ -261,7 +261,7 @@ impl<'a, 'tcx> Visitor<'tcx> for MarkUsedGenericParams<'a, 'tcx> {
|
||||||
self.super_local_decl(local, local_decl);
|
self.super_local_decl(local, local_decl);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn visit_constant(&mut self, ct: &mir::ConstOperand<'tcx>, location: Location) {
|
fn visit_const_operand(&mut self, ct: &mir::ConstOperand<'tcx>, location: Location) {
|
||||||
match ct.const_ {
|
match ct.const_ {
|
||||||
mir::Const::Ty(_, c) => {
|
mir::Const::Ty(_, c) => {
|
||||||
c.visit_with(self);
|
c.visit_with(self);
|
||||||
|
|
|
@ -52,7 +52,11 @@ impl<'tcx> BodyBuilder<'tcx> {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> MutVisitor<'tcx> for BodyBuilder<'tcx> {
|
impl<'tcx> MutVisitor<'tcx> for BodyBuilder<'tcx> {
|
||||||
fn visit_constant(&mut self, constant: &mut mir::ConstOperand<'tcx>, location: mir::Location) {
|
fn visit_const_operand(
|
||||||
|
&mut self,
|
||||||
|
constant: &mut mir::ConstOperand<'tcx>,
|
||||||
|
location: mir::Location,
|
||||||
|
) {
|
||||||
let const_ = constant.const_;
|
let const_ = constant.const_;
|
||||||
let val = match const_.eval(self.tcx, ty::ParamEnv::reveal_all(), constant.span) {
|
let val = match const_.eval(self.tcx, ty::ParamEnv::reveal_all(), constant.span) {
|
||||||
Ok(v) => v,
|
Ok(v) => v,
|
||||||
|
@ -63,7 +67,7 @@ impl<'tcx> MutVisitor<'tcx> for BodyBuilder<'tcx> {
|
||||||
};
|
};
|
||||||
let ty = constant.ty();
|
let ty = constant.ty();
|
||||||
constant.const_ = mir::Const::Val(val, ty);
|
constant.const_ = mir::Const::Val(val, ty);
|
||||||
self.super_constant(constant, location);
|
self.super_const_operand(constant, location);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn tcx(&self) -> TyCtxt<'tcx> {
|
fn tcx(&self) -> TyCtxt<'tcx> {
|
||||||
|
|
|
@ -328,13 +328,13 @@ impl<'tcx> Stable<'tcx> for mir::Operand<'tcx> {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> Stable<'tcx> for mir::ConstOperand<'tcx> {
|
impl<'tcx> Stable<'tcx> for mir::ConstOperand<'tcx> {
|
||||||
type T = stable_mir::mir::Constant;
|
type T = stable_mir::mir::ConstOperand;
|
||||||
|
|
||||||
fn stable(&self, tables: &mut Tables<'_>) -> Self::T {
|
fn stable(&self, tables: &mut Tables<'_>) -> Self::T {
|
||||||
stable_mir::mir::Constant {
|
stable_mir::mir::ConstOperand {
|
||||||
span: self.span.stable(tables),
|
span: self.span.stable(tables),
|
||||||
user_ty: self.user_ty.map(|u| u.as_usize()).or(None),
|
user_ty: self.user_ty.map(|u| u.as_usize()).or(None),
|
||||||
literal: self.const_.stable(tables),
|
const_: self.const_.stable(tables),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -637,7 +637,7 @@ pub enum AggregateKind {
|
||||||
pub enum Operand {
|
pub enum Operand {
|
||||||
Copy(Place),
|
Copy(Place),
|
||||||
Move(Place),
|
Move(Place),
|
||||||
Constant(Constant),
|
Constant(ConstOperand),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Eq, PartialEq)]
|
#[derive(Clone, Eq, PartialEq)]
|
||||||
|
@ -653,6 +653,13 @@ impl From<Local> for Place {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, Eq, PartialEq)]
|
||||||
|
pub struct ConstOperand {
|
||||||
|
pub span: Span,
|
||||||
|
pub user_ty: Option<UserTypeAnnotationIndex>,
|
||||||
|
pub const_: MirConst,
|
||||||
|
}
|
||||||
|
|
||||||
/// Debug information pertaining to a user variable.
|
/// Debug information pertaining to a user variable.
|
||||||
#[derive(Clone, Debug, Eq, PartialEq)]
|
#[derive(Clone, Debug, Eq, PartialEq)]
|
||||||
pub struct VarDebugInfo {
|
pub struct VarDebugInfo {
|
||||||
|
@ -714,13 +721,6 @@ pub enum VarDebugInfoContents {
|
||||||
Const(ConstOperand),
|
Const(ConstOperand),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, Eq, PartialEq)]
|
|
||||||
pub struct ConstOperand {
|
|
||||||
pub span: Span,
|
|
||||||
pub user_ty: Option<UserTypeAnnotationIndex>,
|
|
||||||
pub const_: MirConst,
|
|
||||||
}
|
|
||||||
|
|
||||||
// In MIR ProjectionElem is parameterized on the second Field argument and the Index argument. This
|
// In MIR ProjectionElem is parameterized on the second Field argument and the Index argument. This
|
||||||
// is so it can be used for both Places (for which the projection elements are of type
|
// is so it can be used for both Places (for which the projection elements are of type
|
||||||
// ProjectionElem<Local, Ty>) and user-provided type annotations (for which the projection elements
|
// ProjectionElem<Local, Ty>) and user-provided type annotations (for which the projection elements
|
||||||
|
@ -829,13 +829,6 @@ pub type FieldIdx = usize;
|
||||||
|
|
||||||
type UserTypeAnnotationIndex = usize;
|
type UserTypeAnnotationIndex = usize;
|
||||||
|
|
||||||
#[derive(Clone, Debug, Eq, PartialEq)]
|
|
||||||
pub struct Constant {
|
|
||||||
pub span: Span,
|
|
||||||
pub user_ty: Option<UserTypeAnnotationIndex>,
|
|
||||||
pub literal: MirConst,
|
|
||||||
}
|
|
||||||
|
|
||||||
/// The possible branch sites of a [TerminatorKind::SwitchInt].
|
/// The possible branch sites of a [TerminatorKind::SwitchInt].
|
||||||
#[derive(Clone, Debug, Eq, PartialEq)]
|
#[derive(Clone, Debug, Eq, PartialEq)]
|
||||||
pub struct SwitchTargets {
|
pub struct SwitchTargets {
|
||||||
|
@ -1001,9 +994,9 @@ impl Operand {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Constant {
|
impl ConstOperand {
|
||||||
pub fn ty(&self) -> Ty {
|
pub fn ty(&self) -> Ty {
|
||||||
self.literal.ty()
|
self.const_.ty()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -310,7 +310,7 @@ fn pretty_operand(operand: &Operand) -> String {
|
||||||
Operand::Move(mv) => {
|
Operand::Move(mv) => {
|
||||||
format!("move {:?}", mv)
|
format!("move {:?}", mv)
|
||||||
}
|
}
|
||||||
Operand::Constant(cnst) => pretty_mir_const(&cnst.literal),
|
Operand::Constant(cnst) => pretty_mir_const(&cnst.const_),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -108,8 +108,8 @@ pub trait MirVisitor {
|
||||||
self.super_ty(ty)
|
self.super_ty(ty)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn visit_constant(&mut self, constant: &Constant, location: Location) {
|
fn visit_const_operand(&mut self, constant: &ConstOperand, location: Location) {
|
||||||
self.super_constant(constant, location)
|
self.super_const_operand(constant, location)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn visit_mir_const(&mut self, constant: &MirConst, location: Location) {
|
fn visit_mir_const(&mut self, constant: &MirConst, location: Location) {
|
||||||
|
@ -366,7 +366,7 @@ pub trait MirVisitor {
|
||||||
self.visit_place(place, PlaceContext::NON_MUTATING, location)
|
self.visit_place(place, PlaceContext::NON_MUTATING, location)
|
||||||
}
|
}
|
||||||
Operand::Constant(constant) => {
|
Operand::Constant(constant) => {
|
||||||
self.visit_constant(constant, location);
|
self.visit_const_operand(constant, location);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -380,10 +380,10 @@ pub trait MirVisitor {
|
||||||
let _ = ty;
|
let _ = ty;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn super_constant(&mut self, constant: &Constant, location: Location) {
|
fn super_const_operand(&mut self, constant: &ConstOperand, location: Location) {
|
||||||
let Constant { span, user_ty: _, literal } = constant;
|
let ConstOperand { span, user_ty: _, const_ } = constant;
|
||||||
self.visit_span(span);
|
self.visit_span(span);
|
||||||
self.visit_mir_const(literal, location);
|
self.visit_mir_const(const_, location);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn super_mir_const(&mut self, constant: &MirConst, location: Location) {
|
fn super_mir_const(&mut self, constant: &MirConst, location: Location) {
|
||||||
|
|
|
@ -21,7 +21,7 @@ extern crate stable_mir;
|
||||||
use rustc_smir::rustc_internal;
|
use rustc_smir::rustc_internal;
|
||||||
use stable_mir::mir::alloc::GlobalAlloc;
|
use stable_mir::mir::alloc::GlobalAlloc;
|
||||||
use stable_mir::mir::mono::Instance;
|
use stable_mir::mir::mono::Instance;
|
||||||
use stable_mir::mir::{Body, Constant, Operand, Rvalue, StatementKind, TerminatorKind};
|
use stable_mir::mir::{Body, ConstOperand, Operand, Rvalue, StatementKind, TerminatorKind};
|
||||||
use stable_mir::ty::{ConstantKind, MirConst};
|
use stable_mir::ty::{ConstantKind, MirConst};
|
||||||
use stable_mir::{CrateDef, CrateItems, ItemKind};
|
use stable_mir::{CrateDef, CrateItems, ItemKind};
|
||||||
use std::convert::TryFrom;
|
use std::convert::TryFrom;
|
||||||
|
@ -72,7 +72,7 @@ fn check_msg(body: &Body, expected: &str) {
|
||||||
.unwrap()
|
.unwrap()
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
let ConstantKind::Allocated(alloc) = msg_const.literal.kind() else {
|
let ConstantKind::Allocated(alloc) = msg_const.const_.kind() else {
|
||||||
unreachable!()
|
unreachable!()
|
||||||
};
|
};
|
||||||
assert_eq!(alloc.provenance.ptrs.len(), 1);
|
assert_eq!(alloc.provenance.ptrs.len(), 1);
|
||||||
|
@ -96,8 +96,8 @@ fn change_panic_msg(mut body: Body, new_msg: &str) -> Body {
|
||||||
match &mut bb.terminator.kind {
|
match &mut bb.terminator.kind {
|
||||||
TerminatorKind::Call { args, .. } => {
|
TerminatorKind::Call { args, .. } => {
|
||||||
let new_const = MirConst::from_str(new_msg);
|
let new_const = MirConst::from_str(new_msg);
|
||||||
args[0] = Operand::Constant(Constant {
|
args[0] = Operand::Constant(ConstOperand {
|
||||||
literal: new_const,
|
const_: new_const,
|
||||||
span: bb.terminator.span,
|
span: bb.terminator.span,
|
||||||
user_ty: None,
|
user_ty: None,
|
||||||
});
|
});
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue