address review
This commit is contained in:
parent
0a6815a924
commit
773d8b2e15
@ -358,6 +358,7 @@ dependencies = [
|
||||
"libgit2-sys",
|
||||
"log",
|
||||
"memchr",
|
||||
"num_cpus",
|
||||
"opener",
|
||||
"openssl",
|
||||
"os_info",
|
||||
|
@ -11,9 +11,6 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||
/// Evaluates a constant without providing any substitutions. This is useful to evaluate consts
|
||||
/// that can't take any generic arguments like statics, const items or enum discriminants. If a
|
||||
/// generic parameter is used within the constant `ErrorHandled::ToGeneric` will be returned.
|
||||
///
|
||||
/// Note: Returns a `ConstValue`, which isn't supposed to be used in the type system. In order to
|
||||
/// evaluate to a type-system level constant value use `const_eval_poly_for_typeck`.
|
||||
#[instrument(skip(self), level = "debug")]
|
||||
pub fn const_eval_poly(self, def_id: DefId) -> EvalToConstValueResult<'tcx> {
|
||||
// In some situations def_id will have substitutions within scope, but they aren't allowed
|
||||
@ -26,23 +23,6 @@ pub fn const_eval_poly(self, def_id: DefId) -> EvalToConstValueResult<'tcx> {
|
||||
let param_env = self.param_env(def_id).with_reveal_all_normalized(self);
|
||||
self.const_eval_global_id(param_env, cid, None)
|
||||
}
|
||||
|
||||
/// Evaluates a constant without providing any substitutions. This is useful to evaluate consts
|
||||
/// that can't take any generic arguments like statics, const items or enum discriminants. If a
|
||||
/// generic parameter is used within the constant `ErrorHandled::ToGeneric` will be returned.
|
||||
#[instrument(skip(self), level = "debug")]
|
||||
pub fn const_eval_poly_for_typeck(self, def_id: DefId) -> EvalToValTreeResult<'tcx> {
|
||||
// In some situations def_id will have substitutions within scope, but they aren't allowed
|
||||
// to be used. So we can't use `Instance::mono`, instead we feed unresolved substitutions
|
||||
// into `const_eval` which will return `ErrorHandled::ToGeneric` if any of them are
|
||||
// encountered.
|
||||
let substs = InternalSubsts::identity_for_item(self, def_id);
|
||||
let instance = ty::Instance::new(def_id, substs);
|
||||
let cid = GlobalId { instance, promoted: None };
|
||||
let param_env = self.param_env(def_id).with_reveal_all_normalized(self);
|
||||
self.const_eval_global_id_for_typeck(param_env, cid, None)
|
||||
}
|
||||
|
||||
/// Resolves and evaluates a constant.
|
||||
///
|
||||
/// The constant can be located on a trait like `<A as B>::C`, in which case the given
|
||||
|
@ -111,6 +111,10 @@ pub fn from_u64(i: u64) -> Self {
|
||||
pub fn from_machine_usize(i: u64, cx: &impl HasDataLayout) -> Self {
|
||||
ConstValue::Scalar(Scalar::from_machine_usize(i, cx))
|
||||
}
|
||||
|
||||
pub fn zst() -> Self {
|
||||
Self::Scalar(Scalar::ZST)
|
||||
}
|
||||
}
|
||||
|
||||
/// A `Scalar` represents an immediate, primitive value existing outside of a
|
||||
|
@ -2405,7 +2405,7 @@ pub fn function_handle(
|
||||
Operand::Constant(Box::new(Constant {
|
||||
span,
|
||||
user_ty: None,
|
||||
literal: ConstantKind::Ty(ty::Const::zero_sized(tcx, ty)),
|
||||
literal: ConstantKind::Val(ConstValue::zst(), ty),
|
||||
}))
|
||||
}
|
||||
|
||||
@ -2981,16 +2981,6 @@ pub fn ty(&self) -> Ty<'tcx> {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn try_val(&self, tcx: TyCtxt<'tcx>) -> Option<ConstValue<'tcx>> {
|
||||
match self {
|
||||
ConstantKind::Ty(c) => match c.kind() {
|
||||
ty::ConstKind::Value(v) => Some(tcx.valtree_to_const_val((c.ty(), v))),
|
||||
_ => None,
|
||||
},
|
||||
ConstantKind::Val(v, _) => Some(*v),
|
||||
}
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn try_to_value(self, tcx: TyCtxt<'tcx>) -> Option<interpret::ConstValue<'tcx>> {
|
||||
match self {
|
||||
@ -3548,6 +3538,7 @@ fn comma_sep<'tcx>(fmt: &mut Formatter<'_>, elems: Vec<ConstantKind<'tcx>>) -> f
|
||||
Ok(())
|
||||
}
|
||||
|
||||
// FIXME: Move that into `mir/pretty.rs`.
|
||||
fn pretty_print_const_value<'tcx>(
|
||||
ct: ConstValue<'tcx>,
|
||||
ty: Ty<'tcx>,
|
||||
|
@ -1530,7 +1530,9 @@ fn pretty_print_const_valtree(
|
||||
}
|
||||
|
||||
// fallback
|
||||
if valtree != ty::ValTree::zst() {
|
||||
if valtree == ty::ValTree::zst() {
|
||||
p!(write("<ZST>"));
|
||||
} else {
|
||||
p!(write("{:?}", valtree));
|
||||
}
|
||||
if print_ty {
|
||||
|
@ -2,9 +2,9 @@
|
||||
pub(crate) use crate::build::expr::as_constant::lit_to_mir_constant;
|
||||
use crate::build::expr::as_place::PlaceBuilder;
|
||||
use crate::build::scope::DropKind;
|
||||
use crate::thir::constant::parse_float_into_scalar;
|
||||
use crate::thir::pattern::pat_from_hir;
|
||||
use rustc_data_structures::fx::FxHashMap;
|
||||
use rustc_apfloat::ieee::{Double, Single};
|
||||
use rustc_errors::ErrorGuaranteed;
|
||||
use rustc_hir as hir;
|
||||
use rustc_hir::def_id::{DefId, LocalDefId};
|
||||
@ -15,6 +15,7 @@
|
||||
use rustc_middle::hir::place::PlaceBase as HirPlaceBase;
|
||||
use rustc_middle::middle::region;
|
||||
use rustc_middle::mir::interpret::ConstValue;
|
||||
use rustc_middle::mir::interpret::Scalar;
|
||||
use rustc_middle::mir::*;
|
||||
use rustc_middle::thir::{BindingMode, Expr, ExprId, LintLevel, LocalVarId, PatKind, Thir};
|
||||
use rustc_middle::ty::subst::Subst;
|
||||
@ -1093,6 +1094,62 @@ fn parse_float_into_constval<'tcx>(
|
||||
parse_float_into_scalar(num, float_ty, neg).map(ConstValue::Scalar)
|
||||
}
|
||||
|
||||
pub(crate) fn parse_float_into_scalar(
|
||||
num: Symbol,
|
||||
float_ty: ty::FloatTy,
|
||||
neg: bool,
|
||||
) -> Option<Scalar> {
|
||||
let num = num.as_str();
|
||||
match float_ty {
|
||||
ty::FloatTy::F32 => {
|
||||
let Ok(rust_f) = num.parse::<f32>() else { return None };
|
||||
let mut f = num.parse::<Single>().unwrap_or_else(|e| {
|
||||
panic!("apfloat::ieee::Single failed to parse `{}`: {:?}", num, e)
|
||||
});
|
||||
|
||||
assert!(
|
||||
u128::from(rust_f.to_bits()) == f.to_bits(),
|
||||
"apfloat::ieee::Single gave different result for `{}`: \
|
||||
{}({:#x}) vs Rust's {}({:#x})",
|
||||
rust_f,
|
||||
f,
|
||||
f.to_bits(),
|
||||
Single::from_bits(rust_f.to_bits().into()),
|
||||
rust_f.to_bits()
|
||||
);
|
||||
|
||||
if neg {
|
||||
f = -f;
|
||||
}
|
||||
|
||||
Some(Scalar::from_f32(f))
|
||||
}
|
||||
ty::FloatTy::F64 => {
|
||||
let Ok(rust_f) = num.parse::<f64>() else { return None };
|
||||
let mut f = num.parse::<Double>().unwrap_or_else(|e| {
|
||||
panic!("apfloat::ieee::Double failed to parse `{}`: {:?}", num, e)
|
||||
});
|
||||
|
||||
assert!(
|
||||
u128::from(rust_f.to_bits()) == f.to_bits(),
|
||||
"apfloat::ieee::Double gave different result for `{}`: \
|
||||
{}({:#x}) vs Rust's {}({:#x})",
|
||||
rust_f,
|
||||
f,
|
||||
f.to_bits(),
|
||||
Double::from_bits(rust_f.to_bits().into()),
|
||||
rust_f.to_bits()
|
||||
);
|
||||
|
||||
if neg {
|
||||
f = -f;
|
||||
}
|
||||
|
||||
Some(Scalar::from_f64(f))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// Builder methods are broken up into modules, depending on what kind
|
||||
// of thing is being lowered. Note that they use the `unpack` macro
|
||||
|
@ -1,9 +1,6 @@
|
||||
use rustc_apfloat::ieee::{Double, Single};
|
||||
use rustc_apfloat::Float;
|
||||
use rustc_ast as ast;
|
||||
use rustc_middle::mir::interpret::{LitToConstError, LitToConstInput, Scalar};
|
||||
use rustc_middle::mir::interpret::{LitToConstError, LitToConstInput};
|
||||
use rustc_middle::ty::{self, ParamEnv, ScalarInt, TyCtxt};
|
||||
use rustc_span::symbol::Symbol;
|
||||
|
||||
pub(crate) fn lit_to_const<'tcx>(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
@ -45,9 +42,6 @@ pub(crate) fn lit_to_const<'tcx>(
|
||||
trunc(if neg { (*n as i128).overflowing_neg().0 as u128 } else { *n })?;
|
||||
ty::ValTree::from_scalar_int(scalar_int)
|
||||
}
|
||||
(ast::LitKind::Float(n, _), ty::Float(fty)) => {
|
||||
parse_float_into_valtree(*n, *fty, neg).ok_or(LitToConstError::Reported)?
|
||||
}
|
||||
(ast::LitKind::Bool(b), ty::Bool) => ty::ValTree::from_scalar_int((*b).into()),
|
||||
(ast::LitKind::Char(c), ty::Char) => ty::ValTree::from_scalar_int((*c).into()),
|
||||
(ast::LitKind::Err(_), _) => return Err(LitToConstError::Reported),
|
||||
@ -56,67 +50,3 @@ pub(crate) fn lit_to_const<'tcx>(
|
||||
|
||||
Ok(ty::Const::from_value(tcx, valtree, ty))
|
||||
}
|
||||
|
||||
pub(crate) fn parse_float_into_scalar(
|
||||
num: Symbol,
|
||||
float_ty: ty::FloatTy,
|
||||
neg: bool,
|
||||
) -> Option<Scalar> {
|
||||
let num = num.as_str();
|
||||
match float_ty {
|
||||
ty::FloatTy::F32 => {
|
||||
let Ok(rust_f) = num.parse::<f32>() else { return None };
|
||||
let mut f = num.parse::<Single>().unwrap_or_else(|e| {
|
||||
panic!("apfloat::ieee::Single failed to parse `{}`: {:?}", num, e)
|
||||
});
|
||||
|
||||
assert!(
|
||||
u128::from(rust_f.to_bits()) == f.to_bits(),
|
||||
"apfloat::ieee::Single gave different result for `{}`: \
|
||||
{}({:#x}) vs Rust's {}({:#x})",
|
||||
rust_f,
|
||||
f,
|
||||
f.to_bits(),
|
||||
Single::from_bits(rust_f.to_bits().into()),
|
||||
rust_f.to_bits()
|
||||
);
|
||||
|
||||
if neg {
|
||||
f = -f;
|
||||
}
|
||||
|
||||
Some(Scalar::from_f32(f))
|
||||
}
|
||||
ty::FloatTy::F64 => {
|
||||
let Ok(rust_f) = num.parse::<f64>() else { return None };
|
||||
let mut f = num.parse::<Double>().unwrap_or_else(|e| {
|
||||
panic!("apfloat::ieee::Double failed to parse `{}`: {:?}", num, e)
|
||||
});
|
||||
|
||||
assert!(
|
||||
u128::from(rust_f.to_bits()) == f.to_bits(),
|
||||
"apfloat::ieee::Double gave different result for `{}`: \
|
||||
{}({:#x}) vs Rust's {}({:#x})",
|
||||
rust_f,
|
||||
f,
|
||||
f.to_bits(),
|
||||
Double::from_bits(rust_f.to_bits().into()),
|
||||
rust_f.to_bits()
|
||||
);
|
||||
|
||||
if neg {
|
||||
f = -f;
|
||||
}
|
||||
|
||||
Some(Scalar::from_f64(f))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn parse_float_into_valtree<'tcx>(
|
||||
num: Symbol,
|
||||
float_ty: ty::FloatTy,
|
||||
neg: bool,
|
||||
) -> Option<ty::ValTree<'tcx>> {
|
||||
parse_float_into_scalar(num, float_ty, neg).map(|s| ty::ValTree::Leaf(s.try_to_int().unwrap()))
|
||||
}
|
||||
|
@ -626,9 +626,8 @@ fn print_const(mut self, ct: ty::Const<'tcx>) -> Result<Self::Const, Self::Error
|
||||
let _ = write!(self.out, "{:x}_", bits);
|
||||
}
|
||||
|
||||
// HACK(eddyb) because `ty::Const` only supports sized values (for now),
|
||||
// we can't use dereference the const + supporting `str`, we have to specially
|
||||
// handle `&str` and include both `&` ("R") and `str` ("e") prefixes.
|
||||
// FIXME(valtrees): Remove the special case for `str`
|
||||
// here and fully support unsized constants.
|
||||
ty::Ref(_, inner_ty, mutbl) => {
|
||||
self.push(match mutbl {
|
||||
hir::Mutability::Not => "R",
|
||||
|
@ -15,6 +15,8 @@
|
||||
use rustc_hir as hir;
|
||||
use rustc_hir::def::{DefKind, Res};
|
||||
use rustc_hir::def_id::{DefId, LOCAL_CRATE};
|
||||
use rustc_middle::mir;
|
||||
use rustc_middle::mir::interpret::ConstValue;
|
||||
use rustc_middle::ty::subst::{GenericArgKind, SubstsRef};
|
||||
use rustc_middle::ty::{self, DefIdTree, TyCtxt};
|
||||
use rustc_span::symbol::{kw, sym, Symbol};
|
||||
@ -263,13 +265,13 @@ pub(crate) fn print_const(cx: &DocContext<'_>, n: ty::Const<'_>) -> String {
|
||||
}
|
||||
|
||||
pub(crate) fn print_evaluated_const(tcx: TyCtxt<'_>, def_id: DefId) -> Option<String> {
|
||||
tcx.const_eval_poly_for_typeck(def_id).ok().and_then(|val| {
|
||||
tcx.const_eval_poly(def_id).ok().and_then(|val| {
|
||||
let ty = tcx.type_of(def_id);
|
||||
match (val, ty.kind()) {
|
||||
(_, &ty::Ref(..)) => None,
|
||||
(Some(ty::ValTree::Branch(_)), &ty::Adt(_, _)) => None,
|
||||
(Some(ty::ValTree::Leaf(_)), _) => {
|
||||
let const_ = ty::Const::from_value(tcx, val.unwrap(), ty);
|
||||
(ConstValue::Scalar(_), &ty::Adt(_, _)) => None,
|
||||
(ConstValue::Scalar(_), _) => {
|
||||
let const_ = mir::ConstantKind::from_value(val, ty);
|
||||
Some(print_const_with_custom_print_scalar(tcx, const_))
|
||||
}
|
||||
_ => None,
|
||||
@ -303,19 +305,18 @@ fn format_integer_with_underscore_sep(num: &str) -> String {
|
||||
.collect()
|
||||
}
|
||||
|
||||
fn print_const_with_custom_print_scalar(tcx: TyCtxt<'_>, ct: ty::Const<'_>) -> String {
|
||||
fn print_const_with_custom_print_scalar(tcx: TyCtxt<'_>, ct: mir::ConstantKind<'_>) -> String {
|
||||
// Use a slightly different format for integer types which always shows the actual value.
|
||||
// For all other types, fallback to the original `pretty_print_const`.
|
||||
match (ct.kind(), ct.ty().kind()) {
|
||||
(ty::ConstKind::Value(ty::ValTree::Leaf(int)), ty::Uint(ui)) => {
|
||||
match (ct, ct.ty().kind()) {
|
||||
(mir::ConstantKind::Val(ConstValue::Scalar(int), _), ty::Uint(ui)) => {
|
||||
format!("{}{}", format_integer_with_underscore_sep(&int.to_string()), ui.name_str())
|
||||
}
|
||||
(ty::ConstKind::Value(ty::ValTree::Leaf(int)), ty::Int(i)) => {
|
||||
(mir::ConstantKind::Val(ConstValue::Scalar(int), _), ty::Int(i)) => {
|
||||
let ty = tcx.lift(ct.ty()).unwrap();
|
||||
let size = tcx.layout_of(ty::ParamEnv::empty().and(ty)).unwrap().size;
|
||||
let data = int.assert_bits(size);
|
||||
let sign_extended_data = size.sign_extend(data) as i128;
|
||||
|
||||
format!(
|
||||
"{}{}",
|
||||
format_integer_with_underscore_sep(&sign_extended_data.to_string()),
|
||||
|
@ -19,10 +19,10 @@ fn main() -> () {
|
||||
StorageLive(_1); // scope 0 at $DIR/box_expr.rs:7:9: 7:10
|
||||
_2 = SizeOf(S); // scope 2 at $DIR/box_expr.rs:7:13: 7:25
|
||||
_3 = AlignOf(S); // scope 2 at $DIR/box_expr.rs:7:13: 7:25
|
||||
_4 = : unsafe fn(usize, usize) -> *mut u8 {alloc::alloc::exchange_malloc}(move _2, move _3) -> bb1; // scope 2 at $DIR/box_expr.rs:7:13: 7:25
|
||||
_4 = alloc::alloc::exchange_malloc(move _2, move _3) -> bb1; // scope 2 at $DIR/box_expr.rs:7:13: 7:25
|
||||
// mir::Constant
|
||||
// + span: $DIR/box_expr.rs:7:13: 7:25
|
||||
// + literal: Const { ty: unsafe fn(usize, usize) -> *mut u8 {alloc::alloc::exchange_malloc}, val: Value(ValTree::Branch(..)) }
|
||||
// + literal: Const { ty: unsafe fn(usize, usize) -> *mut u8 {alloc::alloc::exchange_malloc}, val: Value(Scalar(<ZST>)) }
|
||||
}
|
||||
|
||||
bb1: {
|
||||
|
@ -22,13 +22,13 @@
|
||||
StorageLive(_3); // scope 0 at $DIR/boxes.rs:12:14: 12:22
|
||||
- _4 = SizeOf(i32); // scope 2 at $DIR/boxes.rs:12:14: 12:22
|
||||
- _5 = AlignOf(i32); // scope 2 at $DIR/boxes.rs:12:14: 12:22
|
||||
- _6 = : unsafe fn(usize, usize) -> *mut u8 {alloc::alloc::exchange_malloc}(move _4, move _5) -> bb1; // scope 2 at $DIR/boxes.rs:12:14: 12:22
|
||||
- _6 = alloc::alloc::exchange_malloc(move _4, move _5) -> bb1; // scope 2 at $DIR/boxes.rs:12:14: 12:22
|
||||
+ _4 = const 4_usize; // scope 2 at $DIR/boxes.rs:12:14: 12:22
|
||||
+ _5 = const 4_usize; // scope 2 at $DIR/boxes.rs:12:14: 12:22
|
||||
+ _6 = : unsafe fn(usize, usize) -> *mut u8 {alloc::alloc::exchange_malloc}(const 4_usize, const 4_usize) -> bb1; // scope 2 at $DIR/boxes.rs:12:14: 12:22
|
||||
+ _6 = alloc::alloc::exchange_malloc(const 4_usize, const 4_usize) -> bb1; // scope 2 at $DIR/boxes.rs:12:14: 12:22
|
||||
// mir::Constant
|
||||
// + span: $DIR/boxes.rs:12:14: 12:22
|
||||
// + literal: Const { ty: unsafe fn(usize, usize) -> *mut u8 {alloc::alloc::exchange_malloc}, val: Value(ValTree::Branch(..)) }
|
||||
// + literal: Const { ty: unsafe fn(usize, usize) -> *mut u8 {alloc::alloc::exchange_malloc}, val: Value(Scalar(<ZST>)) }
|
||||
}
|
||||
|
||||
bb1: {
|
||||
|
@ -16,10 +16,10 @@
|
||||
StorageLive(_1); // scope 0 at $DIR/derefer_inline_test.rs:10:5: 10:12
|
||||
_2 = SizeOf(std::boxed::Box<u32>); // scope 1 at $DIR/derefer_inline_test.rs:10:5: 10:12
|
||||
_3 = AlignOf(std::boxed::Box<u32>); // scope 1 at $DIR/derefer_inline_test.rs:10:5: 10:12
|
||||
_4 = : unsafe fn(usize, usize) -> *mut u8 {alloc::alloc::exchange_malloc}(move _2, move _3) -> bb1; // scope 1 at $DIR/derefer_inline_test.rs:10:5: 10:12
|
||||
_4 = alloc::alloc::exchange_malloc(move _2, move _3) -> bb1; // scope 1 at $DIR/derefer_inline_test.rs:10:5: 10:12
|
||||
// mir::Constant
|
||||
// + span: $DIR/derefer_inline_test.rs:10:5: 10:12
|
||||
// + literal: Const { ty: unsafe fn(usize, usize) -> *mut u8 {alloc::alloc::exchange_malloc}, val: Value(ValTree::Branch(..)) }
|
||||
// + literal: Const { ty: unsafe fn(usize, usize) -> *mut u8 {alloc::alloc::exchange_malloc}, val: Value(Scalar(<ZST>)) }
|
||||
}
|
||||
|
||||
bb1: {
|
||||
@ -56,10 +56,10 @@
|
||||
}
|
||||
|
||||
bb7 (cleanup): {
|
||||
_6 = : unsafe fn(Unique::<Box<u32>>, std::alloc::Global) {alloc::alloc::box_free::<Box<u32>, std::alloc::Global>}(move (_5.0: std::ptr::Unique<std::boxed::Box<u32>>), move (_5.1: std::alloc::Global)) -> bb6; // scope 0 at $DIR/derefer_inline_test.rs:10:11: 10:12
|
||||
_6 = alloc::alloc::box_free::<Box<u32>, std::alloc::Global>(move (_5.0: std::ptr::Unique<std::boxed::Box<u32>>), move (_5.1: std::alloc::Global)) -> bb6; // scope 0 at $DIR/derefer_inline_test.rs:10:11: 10:12
|
||||
// mir::Constant
|
||||
// + span: $DIR/derefer_inline_test.rs:10:11: 10:12
|
||||
// + literal: Const { ty: unsafe fn(Unique<Box<u32>>, std::alloc::Global) {alloc::alloc::box_free::<Box<u32>, std::alloc::Global>}, val: Value(ValTree::Branch(..)) }
|
||||
// + literal: Const { ty: unsafe fn(Unique<Box<u32>>, std::alloc::Global) {alloc::alloc::box_free::<Box<u32>, std::alloc::Global>}, val: Value(Scalar(<ZST>)) }
|
||||
}
|
||||
|
||||
bb8 (cleanup): {
|
||||
|
@ -23,10 +23,10 @@
|
||||
StorageLive(_1); // scope 0 at $DIR/inline-into-box-place.rs:8:9: 8:11
|
||||
_2 = SizeOf(std::vec::Vec<u32>); // scope 2 at $DIR/inline-into-box-place.rs:8:29: 8:43
|
||||
_3 = AlignOf(std::vec::Vec<u32>); // scope 2 at $DIR/inline-into-box-place.rs:8:29: 8:43
|
||||
_4 = : unsafe fn(usize, usize) -> *mut u8 {alloc::alloc::exchange_malloc}(move _2, move _3) -> bb1; // scope 2 at $DIR/inline-into-box-place.rs:8:29: 8:43
|
||||
_4 = alloc::alloc::exchange_malloc(move _2, move _3) -> bb1; // scope 2 at $DIR/inline-into-box-place.rs:8:29: 8:43
|
||||
// mir::Constant
|
||||
// + span: $DIR/inline-into-box-place.rs:8:29: 8:43
|
||||
// + literal: Const { ty: unsafe fn(usize, usize) -> *mut u8 {alloc::alloc::exchange_malloc}, val: Value(ValTree::Branch(..)) }
|
||||
// + literal: Const { ty: unsafe fn(usize, usize) -> *mut u8 {alloc::alloc::exchange_malloc}, val: Value(Scalar(<ZST>)) }
|
||||
}
|
||||
|
||||
bb1: {
|
||||
@ -71,10 +71,10 @@
|
||||
- }
|
||||
-
|
||||
- bb5 (cleanup): {
|
||||
- _6 = : unsafe fn(Unique::<Vec<u32>>, std::alloc::Global) {alloc::alloc::box_free::<Vec<u32>, std::alloc::Global>}(move (_5.0: std::ptr::Unique<std::vec::Vec<u32>>), move (_5.1: std::alloc::Global)) -> bb4; // scope 0 at $DIR/inline-into-box-place.rs:8:42: 8:43
|
||||
- _6 = alloc::alloc::box_free::<Vec<u32>, std::alloc::Global>(move (_5.0: std::ptr::Unique<std::vec::Vec<u32>>), move (_5.1: std::alloc::Global)) -> bb4; // scope 0 at $DIR/inline-into-box-place.rs:8:42: 8:43
|
||||
- // mir::Constant
|
||||
- // + span: $DIR/inline-into-box-place.rs:8:42: 8:43
|
||||
- // + literal: Const { ty: unsafe fn(Unique<Vec<u32>>, std::alloc::Global) {alloc::alloc::box_free::<Vec<u32>, std::alloc::Global>}, val: Value(ValTree::Branch(..)) }
|
||||
- // + literal: Const { ty: unsafe fn(Unique<Vec<u32>>, std::alloc::Global) {alloc::alloc::box_free::<Vec<u32>, std::alloc::Global>}, val: Value(Scalar(<ZST>)) }
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -31,10 +31,10 @@ fn test() -> Option<Box<u32>> {
|
||||
StorageLive(_1); // scope 0 at $DIR/issue-62289.rs:9:10: 9:21
|
||||
_2 = SizeOf(u32); // scope 1 at $DIR/issue-62289.rs:9:10: 9:21
|
||||
_3 = AlignOf(u32); // scope 1 at $DIR/issue-62289.rs:9:10: 9:21
|
||||
_4 = : unsafe fn(usize, usize) -> *mut u8 {alloc::alloc::exchange_malloc}(move _2, move _3) -> bb1; // scope 1 at $DIR/issue-62289.rs:9:10: 9:21
|
||||
_4 = alloc::alloc::exchange_malloc(move _2, move _3) -> bb1; // scope 1 at $DIR/issue-62289.rs:9:10: 9:21
|
||||
// mir::Constant
|
||||
// + span: $DIR/issue-62289.rs:9:10: 9:21
|
||||
// + literal: Const { ty: unsafe fn(usize, usize) -> *mut u8 {alloc::alloc::exchange_malloc}, val: Value(ValTree::Branch(..)) }
|
||||
// + literal: Const { ty: unsafe fn(usize, usize) -> *mut u8 {alloc::alloc::exchange_malloc}, val: Value(Scalar(<ZST>)) }
|
||||
}
|
||||
|
||||
bb1: {
|
||||
|
@ -8,10 +8,10 @@ fn std::ptr::drop_in_place(_1: *mut Test) -> () {
|
||||
bb0: {
|
||||
Retag([raw] _1); // scope 0 at $SRC_DIR/core/src/ptr/mod.rs:LL:COL
|
||||
_2 = &mut (*_1); // scope 0 at $SRC_DIR/core/src/ptr/mod.rs:LL:COL
|
||||
_3 = : for<'r> fn(&'r mut Test) {<Test as Drop>::drop}(move _2) -> bb1; // scope 0 at $SRC_DIR/core/src/ptr/mod.rs:LL:COL
|
||||
_3 = <Test as Drop>::drop(move _2) -> bb1; // scope 0 at $SRC_DIR/core/src/ptr/mod.rs:LL:COL
|
||||
// mir::Constant
|
||||
// + span: $SRC_DIR/core/src/ptr/mod.rs:LL:COL
|
||||
// + literal: Const { ty: for<'r> fn(&'r mut Test) {<Test as Drop>::drop}, val: Value(ValTree::Branch(..)) }
|
||||
// + literal: Const { ty: for<'r> fn(&'r mut Test) {<Test as Drop>::drop}, val: Value(Scalar(<ZST>)) }
|
||||
}
|
||||
|
||||
bb1: {
|
||||
|
@ -30,10 +30,10 @@ fn move_out_by_subslice() -> () {
|
||||
StorageLive(_2); // scope 0 at $DIR/uniform_array_move_out.rs:11:14: 11:19
|
||||
_3 = SizeOf(i32); // scope 2 at $DIR/uniform_array_move_out.rs:11:14: 11:19
|
||||
_4 = AlignOf(i32); // scope 2 at $DIR/uniform_array_move_out.rs:11:14: 11:19
|
||||
_5 = : unsafe fn(usize, usize) -> *mut u8 {alloc::alloc::exchange_malloc}(move _3, move _4) -> [return: bb1, unwind: bb12]; // scope 2 at $DIR/uniform_array_move_out.rs:11:14: 11:19
|
||||
_5 = alloc::alloc::exchange_malloc(move _3, move _4) -> [return: bb1, unwind: bb12]; // scope 2 at $DIR/uniform_array_move_out.rs:11:14: 11:19
|
||||
// mir::Constant
|
||||
// + span: $DIR/uniform_array_move_out.rs:11:14: 11:19
|
||||
// + literal: Const { ty: unsafe fn(usize, usize) -> *mut u8 {alloc::alloc::exchange_malloc}, val: Value(ValTree::Branch(..)) }
|
||||
// + literal: Const { ty: unsafe fn(usize, usize) -> *mut u8 {alloc::alloc::exchange_malloc}, val: Value(Scalar(<ZST>)) }
|
||||
}
|
||||
|
||||
bb1: {
|
||||
@ -49,10 +49,10 @@ fn move_out_by_subslice() -> () {
|
||||
StorageLive(_7); // scope 0 at $DIR/uniform_array_move_out.rs:11:21: 11:26
|
||||
_8 = SizeOf(i32); // scope 3 at $DIR/uniform_array_move_out.rs:11:21: 11:26
|
||||
_9 = AlignOf(i32); // scope 3 at $DIR/uniform_array_move_out.rs:11:21: 11:26
|
||||
_10 = : unsafe fn(usize, usize) -> *mut u8 {alloc::alloc::exchange_malloc}(move _8, move _9) -> [return: bb3, unwind: bb11]; // scope 3 at $DIR/uniform_array_move_out.rs:11:21: 11:26
|
||||
_10 = alloc::alloc::exchange_malloc(move _8, move _9) -> [return: bb3, unwind: bb11]; // scope 3 at $DIR/uniform_array_move_out.rs:11:21: 11:26
|
||||
// mir::Constant
|
||||
// + span: $DIR/uniform_array_move_out.rs:11:21: 11:26
|
||||
// + literal: Const { ty: unsafe fn(usize, usize) -> *mut u8 {alloc::alloc::exchange_malloc}, val: Value(ValTree::Branch(..)) }
|
||||
// + literal: Const { ty: unsafe fn(usize, usize) -> *mut u8 {alloc::alloc::exchange_malloc}, val: Value(Scalar(<ZST>)) }
|
||||
}
|
||||
|
||||
bb3: {
|
||||
|
@ -30,10 +30,10 @@ fn move_out_from_end() -> () {
|
||||
StorageLive(_2); // scope 0 at $DIR/uniform_array_move_out.rs:5:14: 5:19
|
||||
_3 = SizeOf(i32); // scope 2 at $DIR/uniform_array_move_out.rs:5:14: 5:19
|
||||
_4 = AlignOf(i32); // scope 2 at $DIR/uniform_array_move_out.rs:5:14: 5:19
|
||||
_5 = : unsafe fn(usize, usize) -> *mut u8 {alloc::alloc::exchange_malloc}(move _3, move _4) -> [return: bb1, unwind: bb12]; // scope 2 at $DIR/uniform_array_move_out.rs:5:14: 5:19
|
||||
_5 = alloc::alloc::exchange_malloc(move _3, move _4) -> [return: bb1, unwind: bb12]; // scope 2 at $DIR/uniform_array_move_out.rs:5:14: 5:19
|
||||
// mir::Constant
|
||||
// + span: $DIR/uniform_array_move_out.rs:5:14: 5:19
|
||||
// + literal: Const { ty: unsafe fn(usize, usize) -> *mut u8 {alloc::alloc::exchange_malloc}, val: Value(ValTree::Branch(..)) }
|
||||
// + literal: Const { ty: unsafe fn(usize, usize) -> *mut u8 {alloc::alloc::exchange_malloc}, val: Value(Scalar(<ZST>)) }
|
||||
}
|
||||
|
||||
bb1: {
|
||||
@ -49,10 +49,10 @@ fn move_out_from_end() -> () {
|
||||
StorageLive(_7); // scope 0 at $DIR/uniform_array_move_out.rs:5:21: 5:26
|
||||
_8 = SizeOf(i32); // scope 3 at $DIR/uniform_array_move_out.rs:5:21: 5:26
|
||||
_9 = AlignOf(i32); // scope 3 at $DIR/uniform_array_move_out.rs:5:21: 5:26
|
||||
_10 = : unsafe fn(usize, usize) -> *mut u8 {alloc::alloc::exchange_malloc}(move _8, move _9) -> [return: bb3, unwind: bb11]; // scope 3 at $DIR/uniform_array_move_out.rs:5:21: 5:26
|
||||
_10 = alloc::alloc::exchange_malloc(move _8, move _9) -> [return: bb3, unwind: bb11]; // scope 3 at $DIR/uniform_array_move_out.rs:5:21: 5:26
|
||||
// mir::Constant
|
||||
// + span: $DIR/uniform_array_move_out.rs:5:21: 5:26
|
||||
// + literal: Const { ty: unsafe fn(usize, usize) -> *mut u8 {alloc::alloc::exchange_malloc}, val: Value(ValTree::Branch(..)) }
|
||||
// + literal: Const { ty: unsafe fn(usize, usize) -> *mut u8 {alloc::alloc::exchange_malloc}, val: Value(Scalar(<ZST>)) }
|
||||
}
|
||||
|
||||
bb3: {
|
||||
|
@ -31,9 +31,9 @@ fn std::ptr::drop_in_place(_1: *mut Vec<i32>) -> () {
|
||||
|
||||
bb6: {
|
||||
_2 = &mut (*_1); // scope 0 at $SRC_DIR/core/src/ptr/mod.rs:LL:COL
|
||||
_3 = : for<'r> fn(&'r mut Vec::<i32>) {<Vec<i32> as Drop>::drop}(move _2) -> [return: bb5, unwind: bb4]; // scope 0 at $SRC_DIR/core/src/ptr/mod.rs:LL:COL
|
||||
_3 = <Vec<i32> as Drop>::drop(move _2) -> [return: bb5, unwind: bb4]; // scope 0 at $SRC_DIR/core/src/ptr/mod.rs:LL:COL
|
||||
// mir::Constant
|
||||
// + span: $SRC_DIR/core/src/ptr/mod.rs:LL:COL
|
||||
// + literal: Const { ty: for<'r> fn(&'r mut Vec<i32>) {<Vec<i32> as Drop>::drop}, val: Value(ValTree::Branch(..)) }
|
||||
// + literal: Const { ty: for<'r> fn(&'r mut Vec<i32>) {<Vec<i32> as Drop>::drop}, val: Value(Scalar(<ZST>)) }
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
// check-pass
|
||||
// build-pass
|
||||
|
||||
fn main() {
|
||||
let _ = &[(); usize::MAX];
|
||||
|
@ -1,4 +1,4 @@
|
||||
// check-pass
|
||||
// build-pass
|
||||
|
||||
fn main() {
|
||||
println!("{}", [(); usize::MAX].len());
|
||||
|
@ -50,7 +50,7 @@ fn check_item(&mut self, cx: &LateContext<'tcx>, item: &'tcx Item<'_>) {
|
||||
.tcx
|
||||
.const_eval_poly(def_id.to_def_id())
|
||||
.ok()
|
||||
.and_then(|val| Some(rustc_middle::mir::ConstantKind::from_value(val, ty)));
|
||||
.map(|val| rustc_middle::mir::ConstantKind::from_value(val, ty));
|
||||
if let Some(Constant::Int(val)) = constant.and_then(|c| miri_to_const(cx.tcx, c)) {
|
||||
if let ty::Adt(adt, _) = ty.kind() {
|
||||
if adt.is_enum() {
|
||||
|
@ -430,7 +430,7 @@ fn fetch_path(&mut self, qpath: &QPath<'_>, id: HirId, ty: Ty<'tcx>) -> Option<C
|
||||
None,
|
||||
)
|
||||
.ok()
|
||||
.and_then(|val| Some(rustc_middle::mir::ConstantKind::from_value(val, ty)))?;
|
||||
.map(|val| rustc_middle::mir::ConstantKind::from_value(val, ty))?;
|
||||
let result = miri_to_const(self.lcx.tcx, result);
|
||||
if result.is_some() {
|
||||
self.needed_resolution = true;
|
||||
@ -581,16 +581,6 @@ fn binop(&mut self, op: BinOp, left: &Expr<'_>, right: &Expr<'_>) -> Option<Cons
|
||||
}
|
||||
}
|
||||
|
||||
fn try_const_to_constant<'tcx>(tcx: TyCtxt<'tcx>, c: ty::Const<'tcx>) -> Option<Constant> {
|
||||
match c.kind() {
|
||||
ty::ConstKind::Value(valtree) => {
|
||||
let const_val = tcx.valtree_to_const_val((c.ty(), valtree));
|
||||
miri_to_const(tcx, mir::ConstantKind::from_value(const_val, c.ty()))
|
||||
},
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn miri_to_const<'tcx>(tcx: TyCtxt<'tcx>, result: mir::ConstantKind<'tcx>) -> Option<Constant> {
|
||||
use rustc_middle::mir::interpret::ConstValue;
|
||||
match result {
|
||||
@ -629,8 +619,8 @@ pub fn miri_to_const<'tcx>(tcx: TyCtxt<'tcx>, result: mir::ConstantKind<'tcx>) -
|
||||
},
|
||||
mir::ConstantKind::Val(ConstValue::ByRef { alloc, offset: _ }, _) => match result.ty().kind() {
|
||||
ty::Array(sub_type, len) => match sub_type.kind() {
|
||||
ty::Float(FloatTy::F32) => match try_const_to_constant(tcx, *len) {
|
||||
Some(Constant::Int(len)) => alloc
|
||||
ty::Float(FloatTy::F32) => match len.try_eval_usize(tcx, ty::ParamEnv::empty()) {
|
||||
Some(len) => alloc
|
||||
.inner()
|
||||
.inspect_with_uninit_and_ptr_outside_interpreter(0..(4 * len as usize))
|
||||
.to_owned()
|
||||
@ -644,8 +634,8 @@ pub fn miri_to_const<'tcx>(tcx: TyCtxt<'tcx>, result: mir::ConstantKind<'tcx>) -
|
||||
.map(Constant::Vec),
|
||||
_ => None,
|
||||
},
|
||||
ty::Float(FloatTy::F64) => match try_const_to_constant(tcx, *len) {
|
||||
Some(Constant::Int(len)) => alloc
|
||||
ty::Float(FloatTy::F64) => match len.try_eval_usize(tcx, ty::ParamEnv::empty()) {
|
||||
Some(len) => alloc
|
||||
.inner()
|
||||
.inspect_with_uninit_and_ptr_outside_interpreter(0..(8 * len as usize))
|
||||
.to_owned()
|
||||
|
Loading…
Reference in New Issue
Block a user