about summary refs log tree commit diff
diff options
context:
space:
mode:
authorWesley Wiser <wwiser@gmail.com>2020-10-17 15:47:27 -0400
committerWesley Wiser <wwiser@gmail.com>2020-10-17 16:07:00 -0400
commit1d07d696d22a6d5a1ea1a41e0408ea5e990b25ae (patch)
treeb8cc65203796fa58c407417821190153c5b45ea0
parentffeeb20398bb9a25c1f75599b942f57c85a2140d (diff)
downloadrust-1d07d696d22a6d5a1ea1a41e0408ea5e990b25ae.tar.gz
rust-1d07d696d22a6d5a1ea1a41e0408ea5e990b25ae.zip
Optimize const value interning for ZST types
Interning can skip any inhabited ZST type in general.
-rw-r--r--compiler/rustc_mir/src/interpret/intern.rs6
-rw-r--r--src/test/ui/issues/issue-68010-large-zst-consts.rs5
2 files changed, 11 insertions, 0 deletions
diff --git a/compiler/rustc_mir/src/interpret/intern.rs b/compiler/rustc_mir/src/interpret/intern.rs
index dd5e9c99774..945791eddc8 100644
--- a/compiler/rustc_mir/src/interpret/intern.rs
+++ b/compiler/rustc_mir/src/interpret/intern.rs
@@ -187,6 +187,12 @@ impl<'rt, 'mir, 'tcx: 'mir, M: CompileTimeMachine<'mir, 'tcx>> ValueVisitor<'mir
                 return walked;
             }
         }
+
+        // ZSTs do not need validation unless they're uninhabited
+        if mplace.layout.is_zst() && !mplace.layout.abi.is_uninhabited() {
+            return Ok(());
+        }
+
         self.walk_aggregate(mplace, fields)
     }
 
diff --git a/src/test/ui/issues/issue-68010-large-zst-consts.rs b/src/test/ui/issues/issue-68010-large-zst-consts.rs
new file mode 100644
index 00000000000..4f1bd45e90a
--- /dev/null
+++ b/src/test/ui/issues/issue-68010-large-zst-consts.rs
@@ -0,0 +1,5 @@
+// build-pass
+
+fn main() {
+    println!("{}", [(); std::usize::MAX].len());
+}