From 1d07d696d22a6d5a1ea1a41e0408ea5e990b25ae Mon Sep 17 00:00:00 2001 From: Wesley Wiser Date: Sat, 17 Oct 2020 15:47:27 -0400 Subject: [PATCH] Optimize const value interning for ZST types Interning can skip any inhabited ZST type in general. --- compiler/rustc_mir/src/interpret/intern.rs | 6 ++++++ src/test/ui/issues/issue-68010-large-zst-consts.rs | 5 +++++ 2 files changed, 11 insertions(+) create mode 100644 src/test/ui/issues/issue-68010-large-zst-consts.rs diff --git a/compiler/rustc_mir/src/interpret/intern.rs b/compiler/rustc_mir/src/interpret/intern.rs index dd5e9c9977437..945791eddc8f1 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 0000000000000..4f1bd45e90a19 --- /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()); +}