diff options
| author | b-naber <bn263@gmx.de> | 2022-04-12 18:14:28 +0200 |
|---|---|---|
| committer | b-naber <bn263@gmx.de> | 2022-05-16 15:58:15 +0200 |
| commit | 96b36d6eb21daaca2c2d04fd8d7c27bef5eb90c6 (patch) | |
| tree | 72d103dc5986ab6608c5976422d14002a2cb6020 /compiler/rustc_mir_build/src/thir/cx | |
| parent | 56d540e0571ac1b0633ce10644224c495aaf42a0 (diff) | |
| download | rust-96b36d6eb21daaca2c2d04fd8d7c27bef5eb90c6.tar.gz rust-96b36d6eb21daaca2c2d04fd8d7c27bef5eb90c6.zip | |
use GlobalId in eval_to_valtree query and introduce query for valtree_to_const_val
Diffstat (limited to 'compiler/rustc_mir_build/src/thir/cx')
| -rw-r--r-- | compiler/rustc_mir_build/src/thir/cx/mod.rs | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/compiler/rustc_mir_build/src/thir/cx/mod.rs b/compiler/rustc_mir_build/src/thir/cx/mod.rs index f17fe38b292..aafc368d3fd 100644 --- a/compiler/rustc_mir_build/src/thir/cx/mod.rs +++ b/compiler/rustc_mir_build/src/thir/cx/mod.rs @@ -5,6 +5,7 @@ use crate::thir::pattern::pat_from_hir; use crate::thir::util::UserAnnotatedTyHelpers; +use rustc_ast as ast; use rustc_data_structures::steal::Steal; use rustc_errors::ErrorGuaranteed; use rustc_hir as hir; @@ -12,8 +13,10 @@ use rustc_hir::def_id::{DefId, LocalDefId}; use rustc_hir::HirId; use rustc_hir::Node; use rustc_middle::middle::region; +use rustc_middle::mir::interpret::{LitToConstError, LitToConstInput}; +use rustc_middle::mir::ConstantKind; use rustc_middle::thir::*; -use rustc_middle::ty::{self, TyCtxt}; +use rustc_middle::ty::{self, Ty, TyCtxt}; use rustc_span::Span; crate fn thir_body<'tcx>( @@ -75,6 +78,24 @@ impl<'tcx> Cx<'tcx> { } } + #[instrument(skip(self), level = "debug")] + crate fn const_eval_literal( + &mut self, + lit: &'tcx ast::LitKind, + ty: Ty<'tcx>, + sp: Span, + neg: bool, + ) -> ConstantKind<'tcx> { + match self.tcx.at(sp).lit_to_mir_constant(LitToConstInput { lit, ty, neg }) { + Ok(c) => c, + Err(LitToConstError::Reported) => { + // create a dummy value and continue compiling + ConstantKind::Ty(self.tcx.const_error(ty)) + } + Err(LitToConstError::TypeError) => bug!("const_eval_literal: had type error"), + } + } + crate fn pattern_from_hir(&mut self, p: &hir::Pat<'_>) -> Pat<'tcx> { let p = match self.tcx.hir().get(p.hir_id) { Node::Pat(p) | Node::Binding(p) => p, |
