about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--compiler/rustc_mir_dataflow/src/value_analysis.rs9
-rw-r--r--src/test/mir-opt/dataflow-const-prop/recursive.main.DataflowConstProp.diff169
-rw-r--r--src/test/mir-opt/dataflow-const-prop/recursive.rs1
3 files changed, 92 insertions, 87 deletions
diff --git a/compiler/rustc_mir_dataflow/src/value_analysis.rs b/compiler/rustc_mir_dataflow/src/value_analysis.rs
index 4d4a1ea553e..64e45083fc0 100644
--- a/compiler/rustc_mir_dataflow/src/value_analysis.rs
+++ b/compiler/rustc_mir_dataflow/src/value_analysis.rs
@@ -462,8 +462,8 @@ impl Map {
         filter: &mut impl FnMut(Ty<'tcx>) -> bool,
     ) {
         if filter(ty) {
-            self.register(local, projection)
-                .expect("projection should only contain convertible elements");
+            // Since downcasts are currently not allowed, this might fail.
+            let _ = self.register(local, projection);
         }
         if max_derefs > 0 {
             if let Some(ty::TypeAndMut { ty, .. }) = ty.builtin_deref(false) {
@@ -496,6 +496,11 @@ impl Map {
 
         // Apply the projection.
         for &elem in projection {
+            // For now, downcast is not allowed (see #101168).
+            match elem {
+                PlaceElem::Downcast(..) => return Err(()),
+                _ => (),
+            }
             let elem = elem.try_into()?;
             index = *self.projections.entry((index, elem)).or_insert_with(|| {
                 // Prepend new child to the linked list.
diff --git a/src/test/mir-opt/dataflow-const-prop/recursive.main.DataflowConstProp.diff b/src/test/mir-opt/dataflow-const-prop/recursive.main.DataflowConstProp.diff
index 953628cff06..f7c557c3edf 100644
--- a/src/test/mir-opt/dataflow-const-prop/recursive.main.DataflowConstProp.diff
+++ b/src/test/mir-opt/dataflow-const-prop/recursive.main.DataflowConstProp.diff
@@ -3,40 +3,40 @@
   
   fn main() -> () {
       let mut _0: ();                      // return place in scope 0 at $DIR/recursive.rs:+0:11: +0:11
-      let _1: S;                           // in scope 0 at $DIR/recursive.rs:+1:9: +1:10
-      let mut _3: &S;                      // in scope 0 at $DIR/recursive.rs:+2:20: +2:22
-      let _4: &S;                          // in scope 0 at $DIR/recursive.rs:+2:20: +2:22
-      let mut _6: &S;                      // in scope 0 at $DIR/recursive.rs:+3:20: +3:22
-      let _7: &S;                          // in scope 0 at $DIR/recursive.rs:+3:20: +3:22
-      let mut _9: isize;                   // in scope 0 at $DIR/recursive.rs:+5:9: +5:18
-      let mut _11: isize;                  // in scope 0 at $DIR/recursive.rs:+6:13: +6:22
-      let mut _13: isize;                  // in scope 0 at $DIR/recursive.rs:+7:17: +7:28
-      let mut _15: !;                      // in scope 0 at $DIR/recursive.rs:+8:22: +8:43
-      let mut _16: !;                      // in scope 0 at $DIR/recursive.rs:+10:18: +10:39
-      let mut _17: !;                      // in scope 0 at $DIR/recursive.rs:+12:14: +12:35
-      let mut _18: &S;                     // in scope 0 at $DIR/recursive.rs:+6:20: +6:21
-      let mut _19: &S;                     // in scope 0 at $DIR/recursive.rs:+6:20: +6:21
+      let _1: S;                           // in scope 0 at $DIR/recursive.rs:+2:9: +2:10
+      let mut _3: &S;                      // in scope 0 at $DIR/recursive.rs:+3:20: +3:22
+      let _4: &S;                          // in scope 0 at $DIR/recursive.rs:+3:20: +3:22
+      let mut _6: &S;                      // in scope 0 at $DIR/recursive.rs:+4:20: +4:22
+      let _7: &S;                          // in scope 0 at $DIR/recursive.rs:+4:20: +4:22
+      let mut _9: isize;                   // in scope 0 at $DIR/recursive.rs:+6:9: +6:18
+      let mut _11: isize;                  // in scope 0 at $DIR/recursive.rs:+7:13: +7:22
+      let mut _13: isize;                  // in scope 0 at $DIR/recursive.rs:+8:17: +8:28
+      let mut _15: !;                      // in scope 0 at $DIR/recursive.rs:+9:22: +9:43
+      let mut _16: !;                      // in scope 0 at $DIR/recursive.rs:+11:18: +11:39
+      let mut _17: !;                      // in scope 0 at $DIR/recursive.rs:+13:14: +13:35
+      let mut _18: &S;                     // in scope 0 at $DIR/recursive.rs:+7:20: +7:21
+      let mut _19: &S;                     // in scope 0 at $DIR/recursive.rs:+7:20: +7:21
       scope 1 {
-          debug a => _1;                   // in scope 1 at $DIR/recursive.rs:+1:9: +1:10
-          let _2: S;                       // in scope 1 at $DIR/recursive.rs:+2:9: +2:10
+          debug a => _1;                   // in scope 1 at $DIR/recursive.rs:+2:9: +2:10
+          let _2: S;                       // in scope 1 at $DIR/recursive.rs:+3:9: +3:10
           scope 2 {
-              debug b => _2;               // in scope 2 at $DIR/recursive.rs:+2:9: +2:10
-              let _5: S;                   // in scope 2 at $DIR/recursive.rs:+3:9: +3:10
+              debug b => _2;               // in scope 2 at $DIR/recursive.rs:+3:9: +3:10
+              let _5: S;                   // in scope 2 at $DIR/recursive.rs:+4:9: +4:10
               scope 3 {
-                  debug c => _5;           // in scope 3 at $DIR/recursive.rs:+3:9: +3:10
-                  let _8: u32;             // in scope 3 at $DIR/recursive.rs:+4:9: +4:10
-                  let _10: &S;             // in scope 3 at $DIR/recursive.rs:+5:16: +5:17
+                  debug c => _5;           // in scope 3 at $DIR/recursive.rs:+4:9: +4:10
+                  let _8: u32;             // in scope 3 at $DIR/recursive.rs:+5:9: +5:10
+                  let _10: &S;             // in scope 3 at $DIR/recursive.rs:+6:16: +6:17
                   scope 4 {
-                      debug d => _8;       // in scope 4 at $DIR/recursive.rs:+4:9: +4:10
+                      debug d => _8;       // in scope 4 at $DIR/recursive.rs:+5:9: +5:10
                   }
                   scope 5 {
-                      debug b => _10;      // in scope 5 at $DIR/recursive.rs:+5:16: +5:17
-                      let _12: &&S;        // in scope 5 at $DIR/recursive.rs:+6:20: +6:21
+                      debug b => _10;      // in scope 5 at $DIR/recursive.rs:+6:16: +6:17
+                      let _12: &&S;        // in scope 5 at $DIR/recursive.rs:+7:20: +7:21
                       scope 6 {
-                          debug a => _12;  // in scope 6 at $DIR/recursive.rs:+6:20: +6:21
-                          let _14: &u32;   // in scope 6 at $DIR/recursive.rs:+7:24: +7:27
+                          debug a => _12;  // in scope 6 at $DIR/recursive.rs:+7:20: +7:21
+                          let _14: &u32;   // in scope 6 at $DIR/recursive.rs:+8:24: +8:27
                           scope 7 {
-                              debug num => _14; // in scope 7 at $DIR/recursive.rs:+7:24: +7:27
+                              debug num => _14; // in scope 7 at $DIR/recursive.rs:+8:24: +8:27
                           }
                       }
                   }
@@ -45,89 +45,88 @@
       }
   
       bb0: {
-          StorageLive(_1);                 // scope 0 at $DIR/recursive.rs:+1:9: +1:10
-          Deinit(_1);                      // scope 0 at $DIR/recursive.rs:+1:13: +1:22
-          ((_1 as Num).0: u32) = const 0_u32; // scope 0 at $DIR/recursive.rs:+1:13: +1:22
-          discriminant(_1) = 1;            // scope 0 at $DIR/recursive.rs:+1:13: +1:22
-          StorageLive(_2);                 // scope 1 at $DIR/recursive.rs:+2:9: +2:10
-          StorageLive(_3);                 // scope 1 at $DIR/recursive.rs:+2:20: +2:22
-          StorageLive(_4);                 // scope 1 at $DIR/recursive.rs:+2:20: +2:22
-          _4 = &_1;                        // scope 1 at $DIR/recursive.rs:+2:20: +2:22
-          _3 = &(*_4);                     // scope 1 at $DIR/recursive.rs:+2:20: +2:22
-          Deinit(_2);                      // scope 1 at $DIR/recursive.rs:+2:13: +2:23
-          ((_2 as Rec).0: &S) = move _3;   // scope 1 at $DIR/recursive.rs:+2:13: +2:23
-          discriminant(_2) = 0;            // scope 1 at $DIR/recursive.rs:+2:13: +2:23
-          StorageDead(_3);                 // scope 1 at $DIR/recursive.rs:+2:22: +2:23
-          StorageDead(_4);                 // scope 1 at $DIR/recursive.rs:+2:23: +2:24
-          StorageLive(_5);                 // scope 2 at $DIR/recursive.rs:+3:9: +3:10
-          StorageLive(_6);                 // scope 2 at $DIR/recursive.rs:+3:20: +3:22
-          StorageLive(_7);                 // scope 2 at $DIR/recursive.rs:+3:20: +3:22
-          _7 = &_2;                        // scope 2 at $DIR/recursive.rs:+3:20: +3:22
-          _6 = &(*_7);                     // scope 2 at $DIR/recursive.rs:+3:20: +3:22
-          Deinit(_5);                      // scope 2 at $DIR/recursive.rs:+3:13: +3:23
-          ((_5 as Rec).0: &S) = move _6;   // scope 2 at $DIR/recursive.rs:+3:13: +3:23
-          discriminant(_5) = 0;            // scope 2 at $DIR/recursive.rs:+3:13: +3:23
-          StorageDead(_6);                 // scope 2 at $DIR/recursive.rs:+3:22: +3:23
-          StorageDead(_7);                 // scope 2 at $DIR/recursive.rs:+3:23: +3:24
-          StorageLive(_8);                 // scope 3 at $DIR/recursive.rs:+4:9: +4:10
-          _9 = discriminant(_5);           // scope 3 at $DIR/recursive.rs:+4:19: +4:20
-          switchInt(move _9) -> [0_isize: bb2, otherwise: bb1]; // scope 3 at $DIR/recursive.rs:+4:13: +4:20
+          StorageLive(_1);                 // scope 0 at $DIR/recursive.rs:+2:9: +2:10
+          Deinit(_1);                      // scope 0 at $DIR/recursive.rs:+2:13: +2:22
+          ((_1 as Num).0: u32) = const 0_u32; // scope 0 at $DIR/recursive.rs:+2:13: +2:22
+          discriminant(_1) = 1;            // scope 0 at $DIR/recursive.rs:+2:13: +2:22
+          StorageLive(_2);                 // scope 1 at $DIR/recursive.rs:+3:9: +3:10
+          StorageLive(_3);                 // scope 1 at $DIR/recursive.rs:+3:20: +3:22
+          StorageLive(_4);                 // scope 1 at $DIR/recursive.rs:+3:20: +3:22
+          _4 = &_1;                        // scope 1 at $DIR/recursive.rs:+3:20: +3:22
+          _3 = &(*_4);                     // scope 1 at $DIR/recursive.rs:+3:20: +3:22
+          Deinit(_2);                      // scope 1 at $DIR/recursive.rs:+3:13: +3:23
+          ((_2 as Rec).0: &S) = move _3;   // scope 1 at $DIR/recursive.rs:+3:13: +3:23
+          discriminant(_2) = 0;            // scope 1 at $DIR/recursive.rs:+3:13: +3:23
+          StorageDead(_3);                 // scope 1 at $DIR/recursive.rs:+3:22: +3:23
+          StorageDead(_4);                 // scope 1 at $DIR/recursive.rs:+3:23: +3:24
+          StorageLive(_5);                 // scope 2 at $DIR/recursive.rs:+4:9: +4:10
+          StorageLive(_6);                 // scope 2 at $DIR/recursive.rs:+4:20: +4:22
+          StorageLive(_7);                 // scope 2 at $DIR/recursive.rs:+4:20: +4:22
+          _7 = &_2;                        // scope 2 at $DIR/recursive.rs:+4:20: +4:22
+          _6 = &(*_7);                     // scope 2 at $DIR/recursive.rs:+4:20: +4:22
+          Deinit(_5);                      // scope 2 at $DIR/recursive.rs:+4:13: +4:23
+          ((_5 as Rec).0: &S) = move _6;   // scope 2 at $DIR/recursive.rs:+4:13: +4:23
+          discriminant(_5) = 0;            // scope 2 at $DIR/recursive.rs:+4:13: +4:23
+          StorageDead(_6);                 // scope 2 at $DIR/recursive.rs:+4:22: +4:23
+          StorageDead(_7);                 // scope 2 at $DIR/recursive.rs:+4:23: +4:24
+          StorageLive(_8);                 // scope 3 at $DIR/recursive.rs:+5:9: +5:10
+          _9 = discriminant(_5);           // scope 3 at $DIR/recursive.rs:+5:19: +5:20
+          switchInt(move _9) -> [0_isize: bb2, otherwise: bb1]; // scope 3 at $DIR/recursive.rs:+5:13: +5:20
       }
   
       bb1: {
-          StorageLive(_17);                // scope 3 at $DIR/recursive.rs:+12:14: +12:35
-          _17 = exit(const 0_i32);         // scope 3 at $DIR/recursive.rs:+12:14: +12:35
+          StorageLive(_17);                // scope 3 at $DIR/recursive.rs:+13:14: +13:35
+          _17 = exit(const 0_i32);         // scope 3 at $DIR/recursive.rs:+13:14: +13:35
                                            // mir::Constant
-                                           // + span: $DIR/recursive.rs:21:14: 21:32
+                                           // + span: $DIR/recursive.rs:22:14: 22:32
                                            // + literal: Const { ty: fn(i32) -> ! {exit}, val: Value(<ZST>) }
       }
   
       bb2: {
-          StorageLive(_10);                // scope 3 at $DIR/recursive.rs:+5:16: +5:17
-          _10 = ((_5 as Rec).0: &S);       // scope 3 at $DIR/recursive.rs:+5:16: +5:17
-          _11 = discriminant((*_10));      // scope 5 at $DIR/recursive.rs:+5:28: +5:29
-          switchInt(move _11) -> [0_isize: bb4, otherwise: bb3]; // scope 5 at $DIR/recursive.rs:+5:22: +5:29
+          StorageLive(_10);                // scope 3 at $DIR/recursive.rs:+6:16: +6:17
+          _10 = ((_5 as Rec).0: &S);       // scope 3 at $DIR/recursive.rs:+6:16: +6:17
+          _11 = discriminant((*_10));      // scope 5 at $DIR/recursive.rs:+6:28: +6:29
+          switchInt(move _11) -> [0_isize: bb4, otherwise: bb3]; // scope 5 at $DIR/recursive.rs:+6:22: +6:29
       }
   
       bb3: {
-          StorageLive(_16);                // scope 5 at $DIR/recursive.rs:+10:18: +10:39
-          _16 = exit(const 0_i32);         // scope 5 at $DIR/recursive.rs:+10:18: +10:39
+          StorageLive(_16);                // scope 5 at $DIR/recursive.rs:+11:18: +11:39
+          _16 = exit(const 0_i32);         // scope 5 at $DIR/recursive.rs:+11:18: +11:39
                                            // mir::Constant
-                                           // + span: $DIR/recursive.rs:19:18: 19:36
+                                           // + span: $DIR/recursive.rs:20:18: 20:36
                                            // + literal: Const { ty: fn(i32) -> ! {exit}, val: Value(<ZST>) }
       }
   
       bb4: {
-          StorageLive(_12);                // scope 5 at $DIR/recursive.rs:+6:20: +6:21
-          _12 = &(((*_10) as Rec).0: &S);  // scope 5 at $DIR/recursive.rs:+6:20: +6:21
-          _18 = deref_copy (*_12);         // scope 6 at $DIR/recursive.rs:+6:32: +6:33
-          _13 = discriminant((*_18));      // scope 6 at $DIR/recursive.rs:+6:32: +6:33
-          switchInt(move _13) -> [1_isize: bb6, otherwise: bb5]; // scope 6 at $DIR/recursive.rs:+6:26: +6:33
+          StorageLive(_12);                // scope 5 at $DIR/recursive.rs:+7:20: +7:21
+          _12 = &(((*_10) as Rec).0: &S);  // scope 5 at $DIR/recursive.rs:+7:20: +7:21
+          _18 = deref_copy (*_12);         // scope 6 at $DIR/recursive.rs:+7:32: +7:33
+          _13 = discriminant((*_18));      // scope 6 at $DIR/recursive.rs:+7:32: +7:33
+          switchInt(move _13) -> [1_isize: bb6, otherwise: bb5]; // scope 6 at $DIR/recursive.rs:+7:26: +7:33
       }
   
       bb5: {
-          StorageLive(_15);                // scope 6 at $DIR/recursive.rs:+8:22: +8:43
-          _15 = exit(const 0_i32);         // scope 6 at $DIR/recursive.rs:+8:22: +8:43
+          StorageLive(_15);                // scope 6 at $DIR/recursive.rs:+9:22: +9:43
+          _15 = exit(const 0_i32);         // scope 6 at $DIR/recursive.rs:+9:22: +9:43
                                            // mir::Constant
-                                           // + span: $DIR/recursive.rs:17:22: 17:40
+                                           // + span: $DIR/recursive.rs:18:22: 18:40
                                            // + literal: Const { ty: fn(i32) -> ! {exit}, val: Value(<ZST>) }
       }
   
       bb6: {
-          StorageLive(_14);                // scope 6 at $DIR/recursive.rs:+7:24: +7:27
-          _19 = deref_copy (*_12);         // scope 6 at $DIR/recursive.rs:+7:24: +7:27
-          _14 = &(((*_19) as Num).0: u32); // scope 6 at $DIR/recursive.rs:+7:24: +7:27
--         _8 = (*_14);                     // scope 7 at $DIR/recursive.rs:+7:32: +7:36
-+         _8 = const 0_u32;                // scope 7 at $DIR/recursive.rs:+7:32: +7:36
-          StorageDead(_14);                // scope 6 at $DIR/recursive.rs:+7:35: +7:36
-          StorageDead(_12);                // scope 5 at $DIR/recursive.rs:+9:13: +9:14
-          StorageDead(_10);                // scope 3 at $DIR/recursive.rs:+11:9: +11:10
-          _0 = const ();                   // scope 0 at $DIR/recursive.rs:+0:11: +14:2
-          StorageDead(_8);                 // scope 3 at $DIR/recursive.rs:+14:1: +14:2
-          StorageDead(_5);                 // scope 2 at $DIR/recursive.rs:+14:1: +14:2
-          StorageDead(_2);                 // scope 1 at $DIR/recursive.rs:+14:1: +14:2
-          StorageDead(_1);                 // scope 0 at $DIR/recursive.rs:+14:1: +14:2
-          return;                          // scope 0 at $DIR/recursive.rs:+14:2: +14:2
+          StorageLive(_14);                // scope 6 at $DIR/recursive.rs:+8:24: +8:27
+          _19 = deref_copy (*_12);         // scope 6 at $DIR/recursive.rs:+8:24: +8:27
+          _14 = &(((*_19) as Num).0: u32); // scope 6 at $DIR/recursive.rs:+8:24: +8:27
+          _8 = (*_14);                     // scope 7 at $DIR/recursive.rs:+8:32: +8:36
+          StorageDead(_14);                // scope 6 at $DIR/recursive.rs:+8:35: +8:36
+          StorageDead(_12);                // scope 5 at $DIR/recursive.rs:+10:13: +10:14
+          StorageDead(_10);                // scope 3 at $DIR/recursive.rs:+12:9: +12:10
+          _0 = const ();                   // scope 0 at $DIR/recursive.rs:+0:11: +15:2
+          StorageDead(_8);                 // scope 3 at $DIR/recursive.rs:+15:1: +15:2
+          StorageDead(_5);                 // scope 2 at $DIR/recursive.rs:+15:1: +15:2
+          StorageDead(_2);                 // scope 1 at $DIR/recursive.rs:+15:1: +15:2
+          StorageDead(_1);                 // scope 0 at $DIR/recursive.rs:+15:1: +15:2
+          return;                          // scope 0 at $DIR/recursive.rs:+15:2: +15:2
       }
   }
   
diff --git a/src/test/mir-opt/dataflow-const-prop/recursive.rs b/src/test/mir-opt/dataflow-const-prop/recursive.rs
index 0eda1239ecd..d7ca182b9fc 100644
--- a/src/test/mir-opt/dataflow-const-prop/recursive.rs
+++ b/src/test/mir-opt/dataflow-const-prop/recursive.rs
@@ -7,6 +7,7 @@ enum S<'a> {
 
 // EMIT_MIR recursive.main.DataflowConstProp.diff
 fn main() {
+    // FIXME: This currently does not work, because downcasts are rejected.
     let a = S::Num(0);
     let b = S::Rec(&a);
     let c = S::Rec(&b);