Skip to content

Commit fff06e5

Browse files
committed
use AllocId and Ty in ExprKind::StaticRef and delay ConstValue construction
1 parent 54ff25e commit fff06e5

File tree

4 files changed

+16
-18
lines changed

4 files changed

+16
-18
lines changed

compiler/rustc_middle/src/thir.rs

+8-2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ use rustc_index::newtype_index;
1717
use rustc_index::vec::IndexVec;
1818
use rustc_middle::infer::canonical::Canonical;
1919
use rustc_middle::middle::region;
20+
use rustc_middle::mir::interpret::AllocId;
2021
use rustc_middle::mir::{
2122
BinOp, BorrowKind, FakeReadCause, Field, Mutability, UnOp, UserTypeProjection,
2223
};
@@ -419,7 +420,8 @@ pub enum ExprKind<'tcx> {
419420
/// This is only distinguished from `Literal` so that we can register some
420421
/// info for diagnostics.
421422
StaticRef {
422-
literal: Const<'tcx>,
423+
alloc_id: AllocId,
424+
ty: Ty<'tcx>,
423425
def_id: DefId,
424426
},
425427
/// Inline assembly, i.e. `asm!()`.
@@ -715,7 +717,11 @@ impl<'tcx> fmt::Display for Pat<'tcx> {
715717
Some(&adt_def.variants[variant_index])
716718
}
717719
_ => self.ty.ty_adt_def().and_then(|adt| {
718-
if !adt.is_enum() { Some(adt.non_enum_variant()) } else { None }
720+
if !adt.is_enum() {
721+
Some(adt.non_enum_variant())
722+
} else {
723+
None
724+
}
719725
}),
720726
};
721727

compiler/rustc_middle/src/thir/visit.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ pub fn walk_expr<'a, 'tcx: 'a, V: Visitor<'a, 'tcx>>(visitor: &mut V, expr: &Exp
123123
}
124124
Closure { closure_id: _, substs: _, upvars: _, movability: _, fake_reads: _ } => {}
125125
Literal { literal, user_ty: _, const_id: _ } => visitor.visit_const(literal),
126-
StaticRef { literal, def_id: _ } => visitor.visit_const(literal),
126+
StaticRef { .. } => {}
127127
InlineAsm { ref operands, template: _, options: _, line_spans: _ } => {
128128
for op in &**operands {
129129
use InlineAsmOperand::*;

compiler/rustc_mir_build/src/build/expr/as_constant.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
//! See docs in build/expr/mod.rs
22
33
use crate::build::Builder;
4+
use rustc_middle::mir::interpret::{ConstValue, Scalar};
45
use rustc_middle::mir::*;
56
use rustc_middle::thir::*;
67
use rustc_middle::ty::CanonicalUserTypeAnnotation;
@@ -26,11 +27,10 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
2627
assert_eq!(literal.ty(), ty);
2728
Constant { span, user_ty, literal: literal.into() }
2829
}
29-
ExprKind::StaticRef { literal, .. } => {
30-
let const_val = literal.val.try_to_value().unwrap_or_else(|| {
31-
bug!("expected `ConstKind::Value`, but found {:?}", literal.val)
32-
});
33-
let literal = ConstantKind::Val(const_val, literal.ty);
30+
ExprKind::StaticRef { alloc_id, ty, .. } => {
31+
let const_val =
32+
ConstValue::Scalar(Scalar::from_pointer(alloc_id.into(), &this.tcx));
33+
let literal = ConstantKind::Val(const_val, ty);
3434

3535
Constant { span, user_ty: None, literal }
3636
}

compiler/rustc_mir_build/src/thir/cx/expr.rs

+2-10
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ use rustc_middle::hir::place::Place as HirPlace;
88
use rustc_middle::hir::place::PlaceBase as HirPlaceBase;
99
use rustc_middle::hir::place::ProjectionKind as HirProjectionKind;
1010
use rustc_middle::middle::region;
11-
use rustc_middle::mir::interpret::Scalar;
1211
use rustc_middle::mir::{BinOp, BorrowKind, Field, UnOp};
1312
use rustc_middle::thir::*;
1413
use rustc_middle::ty::adjustment::{
@@ -943,15 +942,8 @@ impl<'tcx> Cx<'tcx> {
943942
let kind = if self.tcx.is_thread_local_static(id) {
944943
ExprKind::ThreadLocalRef(id)
945944
} else {
946-
let ptr = self.tcx.create_static_alloc(id);
947-
ExprKind::StaticRef {
948-
literal: ty::Const::from_scalar(
949-
self.tcx,
950-
Scalar::from_pointer(ptr.into(), &self.tcx),
951-
ty,
952-
),
953-
def_id: id,
954-
}
945+
let alloc_id = self.tcx.create_static_alloc(id);
946+
ExprKind::StaticRef { alloc_id, ty, def_id: id }
955947
};
956948
ExprKind::Deref {
957949
arg: self.thir.exprs.push(Expr { ty, temp_lifetime, span: expr.span, kind }),

0 commit comments

Comments
 (0)