treat literals in ExprKind::StaticRef as mir::ConstantKind::Val
This commit is contained in:
parent
1b14fd3b10
commit
d92df974fe
6 changed files with 30 additions and 21 deletions
|
@ -2534,7 +2534,7 @@ pub enum ConstantKind<'tcx> {
|
||||||
|
|
||||||
impl<'tcx> Constant<'tcx> {
|
impl<'tcx> Constant<'tcx> {
|
||||||
pub fn check_static_ptr(&self, tcx: TyCtxt<'_>) -> Option<DefId> {
|
pub fn check_static_ptr(&self, tcx: TyCtxt<'_>) -> Option<DefId> {
|
||||||
match self.literal.const_for_ty()?.val().try_to_scalar() {
|
match self.literal.try_to_scalar() {
|
||||||
Some(Scalar::Ptr(ptr, _size)) => match tcx.global_alloc(ptr.provenance) {
|
Some(Scalar::Ptr(ptr, _size)) => match tcx.global_alloc(ptr.provenance) {
|
||||||
GlobalAlloc::Static(def_id) => {
|
GlobalAlloc::Static(def_id) => {
|
||||||
assert!(!tcx.is_thread_local_static(def_id));
|
assert!(!tcx.is_thread_local_static(def_id));
|
||||||
|
|
|
@ -17,9 +17,8 @@ use rustc_middle::mir::interpret::{
|
||||||
use rustc_middle::mir::visit::Visitor;
|
use rustc_middle::mir::visit::Visitor;
|
||||||
use rustc_middle::mir::MirSource;
|
use rustc_middle::mir::MirSource;
|
||||||
use rustc_middle::mir::*;
|
use rustc_middle::mir::*;
|
||||||
use rustc_middle::ty::{self, TyCtxt, TypeFoldable, TypeVisitor};
|
use rustc_middle::ty::{self, TyCtxt};
|
||||||
use rustc_target::abi::Size;
|
use rustc_target::abi::Size;
|
||||||
use std::ops::ControlFlow;
|
|
||||||
|
|
||||||
const INDENT: &str = " ";
|
const INDENT: &str = " ";
|
||||||
/// Alignment for lining up comments following MIR statements
|
/// Alignment for lining up comments following MIR statements
|
||||||
|
@ -669,16 +668,27 @@ pub fn write_allocations<'tcx>(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
struct CollectAllocIds(BTreeSet<AllocId>);
|
struct CollectAllocIds(BTreeSet<AllocId>);
|
||||||
impl<'tcx> TypeVisitor<'tcx> for CollectAllocIds {
|
|
||||||
fn visit_const(&mut self, c: ty::Const<'tcx>) -> ControlFlow<Self::BreakTy> {
|
impl<'tcx> Visitor<'tcx> for CollectAllocIds {
|
||||||
|
fn visit_const(&mut self, c: ty::Const<'tcx>, _loc: Location) {
|
||||||
if let ty::ConstKind::Value(val) = c.val() {
|
if let ty::ConstKind::Value(val) = c.val() {
|
||||||
self.0.extend(alloc_ids_from_const(val));
|
self.0.extend(alloc_ids_from_const(val));
|
||||||
}
|
}
|
||||||
c.super_visit_with(self)
|
}
|
||||||
|
|
||||||
|
fn visit_constant(&mut self, c: &Constant<'tcx>, loc: Location) {
|
||||||
|
match c.literal {
|
||||||
|
ConstantKind::Ty(c) => self.visit_const(c, loc),
|
||||||
|
ConstantKind::Val(val, _) => {
|
||||||
|
self.0.extend(alloc_ids_from_const(val));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let mut visitor = CollectAllocIds(Default::default());
|
let mut visitor = CollectAllocIds(Default::default());
|
||||||
body.visit_with(&mut visitor);
|
visitor.visit_body(body);
|
||||||
|
|
||||||
// `seen` contains all seen allocations, including the ones we have *not* printed yet.
|
// `seen` contains all seen allocations, including the ones we have *not* printed yet.
|
||||||
// The protocol is to first `insert` into `seen`, and only if that returns `true`
|
// The protocol is to first `insert` into `seen`, and only if that returns `true`
|
||||||
// then push to `todo`.
|
// then push to `todo`.
|
||||||
|
|
|
@ -17,6 +17,7 @@ use rustc_index::newtype_index;
|
||||||
use rustc_index::vec::IndexVec;
|
use rustc_index::vec::IndexVec;
|
||||||
use rustc_middle::infer::canonical::Canonical;
|
use rustc_middle::infer::canonical::Canonical;
|
||||||
use rustc_middle::middle::region;
|
use rustc_middle::middle::region;
|
||||||
|
use rustc_middle::mir::interpret::AllocId;
|
||||||
use rustc_middle::mir::{
|
use rustc_middle::mir::{
|
||||||
BinOp, BorrowKind, FakeReadCause, Field, Mutability, UnOp, UserTypeProjection,
|
BinOp, BorrowKind, FakeReadCause, Field, Mutability, UnOp, UserTypeProjection,
|
||||||
};
|
};
|
||||||
|
@ -419,7 +420,8 @@ pub enum ExprKind<'tcx> {
|
||||||
/// This is only distinguished from `Literal` so that we can register some
|
/// This is only distinguished from `Literal` so that we can register some
|
||||||
/// info for diagnostics.
|
/// info for diagnostics.
|
||||||
StaticRef {
|
StaticRef {
|
||||||
literal: Const<'tcx>,
|
alloc_id: AllocId,
|
||||||
|
ty: Ty<'tcx>,
|
||||||
def_id: DefId,
|
def_id: DefId,
|
||||||
},
|
},
|
||||||
/// Inline assembly, i.e. `asm!()`.
|
/// Inline assembly, i.e. `asm!()`.
|
||||||
|
|
|
@ -123,7 +123,7 @@ pub fn walk_expr<'a, 'tcx: 'a, V: Visitor<'a, 'tcx>>(visitor: &mut V, expr: &Exp
|
||||||
}
|
}
|
||||||
Closure { closure_id: _, substs: _, upvars: _, movability: _, fake_reads: _ } => {}
|
Closure { closure_id: _, substs: _, upvars: _, movability: _, fake_reads: _ } => {}
|
||||||
Literal { literal, user_ty: _, const_id: _ } => visitor.visit_const(literal),
|
Literal { literal, user_ty: _, const_id: _ } => visitor.visit_const(literal),
|
||||||
StaticRef { literal, def_id: _ } => visitor.visit_const(literal),
|
StaticRef { .. } => {}
|
||||||
InlineAsm { ref operands, template: _, options: _, line_spans: _ } => {
|
InlineAsm { ref operands, template: _, options: _, line_spans: _ } => {
|
||||||
for op in &**operands {
|
for op in &**operands {
|
||||||
use InlineAsmOperand::*;
|
use InlineAsmOperand::*;
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
//! See docs in build/expr/mod.rs
|
//! See docs in build/expr/mod.rs
|
||||||
|
|
||||||
use crate::build::Builder;
|
use crate::build::Builder;
|
||||||
|
use rustc_middle::mir::interpret::{ConstValue, Scalar};
|
||||||
use rustc_middle::mir::*;
|
use rustc_middle::mir::*;
|
||||||
use rustc_middle::thir::*;
|
use rustc_middle::thir::*;
|
||||||
use rustc_middle::ty::CanonicalUserTypeAnnotation;
|
use rustc_middle::ty::CanonicalUserTypeAnnotation;
|
||||||
|
@ -26,8 +27,12 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
||||||
assert_eq!(literal.ty(), ty);
|
assert_eq!(literal.ty(), ty);
|
||||||
Constant { span, user_ty, literal: literal.into() }
|
Constant { span, user_ty, literal: literal.into() }
|
||||||
}
|
}
|
||||||
ExprKind::StaticRef { literal, .. } => {
|
ExprKind::StaticRef { alloc_id, ty, .. } => {
|
||||||
Constant { span, user_ty: None, literal: literal.into() }
|
let const_val =
|
||||||
|
ConstValue::Scalar(Scalar::from_pointer(alloc_id.into(), &this.tcx));
|
||||||
|
let literal = ConstantKind::Val(const_val, ty);
|
||||||
|
|
||||||
|
Constant { span, user_ty: None, literal }
|
||||||
}
|
}
|
||||||
ExprKind::ConstBlock { value } => {
|
ExprKind::ConstBlock { value } => {
|
||||||
Constant { span: span, user_ty: None, literal: value.into() }
|
Constant { span: span, user_ty: None, literal: value.into() }
|
||||||
|
|
|
@ -8,7 +8,6 @@ use rustc_middle::hir::place::Place as HirPlace;
|
||||||
use rustc_middle::hir::place::PlaceBase as HirPlaceBase;
|
use rustc_middle::hir::place::PlaceBase as HirPlaceBase;
|
||||||
use rustc_middle::hir::place::ProjectionKind as HirProjectionKind;
|
use rustc_middle::hir::place::ProjectionKind as HirProjectionKind;
|
||||||
use rustc_middle::middle::region;
|
use rustc_middle::middle::region;
|
||||||
use rustc_middle::mir::interpret::Scalar;
|
|
||||||
use rustc_middle::mir::{BinOp, BorrowKind, Field, UnOp};
|
use rustc_middle::mir::{BinOp, BorrowKind, Field, UnOp};
|
||||||
use rustc_middle::thir::*;
|
use rustc_middle::thir::*;
|
||||||
use rustc_middle::ty::adjustment::{
|
use rustc_middle::ty::adjustment::{
|
||||||
|
@ -941,15 +940,8 @@ impl<'tcx> Cx<'tcx> {
|
||||||
let kind = if self.tcx.is_thread_local_static(id) {
|
let kind = if self.tcx.is_thread_local_static(id) {
|
||||||
ExprKind::ThreadLocalRef(id)
|
ExprKind::ThreadLocalRef(id)
|
||||||
} else {
|
} else {
|
||||||
let ptr = self.tcx.create_static_alloc(id);
|
let alloc_id = self.tcx.create_static_alloc(id);
|
||||||
ExprKind::StaticRef {
|
ExprKind::StaticRef { alloc_id, ty, def_id: id }
|
||||||
literal: ty::Const::from_scalar(
|
|
||||||
self.tcx,
|
|
||||||
Scalar::from_pointer(ptr.into(), &self.tcx),
|
|
||||||
ty,
|
|
||||||
),
|
|
||||||
def_id: id,
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
ExprKind::Deref {
|
ExprKind::Deref {
|
||||||
arg: self.thir.exprs.push(Expr { ty, temp_lifetime, span: expr.span, kind }),
|
arg: self.thir.exprs.push(Expr { ty, temp_lifetime, span: expr.span, kind }),
|
||||||
|
|
Loading…
Add table
Reference in a new issue