about summary refs log tree commit diff
path: root/compiler/rustc_const_eval/src
diff options
context:
space:
mode:
authorJakob Degen <jakob.e.degen@gmail.com>2022-03-24 18:25:37 -0400
committerJakob Degen <jakob.e.degen@gmail.com>2022-04-11 15:18:53 -0400
commit2f4a7a074299a1450f02365de2d80a8c13f03510 (patch)
treea3f9c507b1c1518f6d42c15b02eaab7a6753bfa6 /compiler/rustc_const_eval/src
parentdae5c842fca09a4da272ec003285a8867cf906eb (diff)
downloadrust-2f4a7a074299a1450f02365de2d80a8c13f03510.tar.gz
rust-2f4a7a074299a1450f02365de2d80a8c13f03510.zip
Adjust computation of place types to detect more invalid places
Diffstat (limited to 'compiler/rustc_const_eval/src')
-rw-r--r--compiler/rustc_const_eval/src/transform/validate.rs10
1 files changed, 9 insertions, 1 deletions
diff --git a/compiler/rustc_const_eval/src/transform/validate.rs b/compiler/rustc_const_eval/src/transform/validate.rs
index 58a7f6d1be0..af58bcabdf2 100644
--- a/compiler/rustc_const_eval/src/transform/validate.rs
+++ b/compiler/rustc_const_eval/src/transform/validate.rs
@@ -3,8 +3,8 @@
 use rustc_index::bit_set::BitSet;
 use rustc_infer::infer::TyCtxtInferExt;
 use rustc_middle::mir::interpret::Scalar;
-use rustc_middle::mir::traversal;
 use rustc_middle::mir::visit::{PlaceContext, Visitor};
+use rustc_middle::mir::{traversal, Place};
 use rustc_middle::mir::{
     AggregateKind, BasicBlock, Body, BorrowKind, Local, Location, MirPass, MirPhase, Operand,
     PlaceElem, PlaceRef, ProjectionElem, Rvalue, SourceScope, Statement, StatementKind, Terminator,
@@ -240,6 +240,14 @@ impl<'a, 'tcx> Visitor<'tcx> for TypeChecker<'a, 'tcx> {
         self.super_projection_elem(local, proj_base, elem, context, location);
     }
 
+    fn visit_place(&mut self, place: &Place<'tcx>, _: PlaceContext, location: Location) {
+        // Set off any `bug!`s in the type computation code
+        let ty = place.ty(&self.body.local_decls, self.tcx);
+        if ty.variant_index.is_some() {
+            self.fail(location, "Top level places may not have their variant index set!");
+        }
+    }
+
     fn visit_statement(&mut self, statement: &Statement<'tcx>, location: Location) {
         match &statement.kind {
             StatementKind::Assign(box (dest, rvalue)) => {