From def0e9b8a495fa2a44e1d2cd948f7d4b6d81344f Mon Sep 17 00:00:00 2001 From: Camelid Date: Sun, 10 Jan 2021 19:55:54 -0800 Subject: [PATCH 1/3] Fix ICE with `ReadPointerAsBytes` validation error --- compiler/rustc_mir/src/interpret/validity.rs | 6 +++- src/test/ui/issues/issue-79690.rs | 29 ++++++++++++++++++++ src/test/ui/issues/issue-79690.stderr | 11 ++++++++ 3 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 src/test/ui/issues/issue-79690.rs create mode 100644 src/test/ui/issues/issue-79690.stderr diff --git a/compiler/rustc_mir/src/interpret/validity.rs b/compiler/rustc_mir/src/interpret/validity.rs index 423d1270ac865..0b7492631c41d 100644 --- a/compiler/rustc_mir/src/interpret/validity.rs +++ b/compiler/rustc_mir/src/interpret/validity.rs @@ -515,7 +515,11 @@ impl<'rt, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> ValidityVisitor<'rt, 'mir, ' Ok(true) } ty::Float(_) | ty::Int(_) | ty::Uint(_) => { - let value = self.ecx.read_scalar(value)?; + let value = try_validation!( + self.ecx.read_scalar(value), + self.path, + err_unsup!(ReadPointerAsBytes) => { "read of part of a pointer" }, + ); // NOTE: Keep this in sync with the array optimization for int/float // types below! if self.ctfe_mode.is_some() { diff --git a/src/test/ui/issues/issue-79690.rs b/src/test/ui/issues/issue-79690.rs new file mode 100644 index 0000000000000..6a38b3c8c2c71 --- /dev/null +++ b/src/test/ui/issues/issue-79690.rs @@ -0,0 +1,29 @@ +union Transmute { + t: T, + u: U, +} +trait Bar { + fn bar(&self) -> u32; +} +struct Foo { + foo: u32, + bar: bool, +} +impl Bar for Foo { + fn bar(&self) -> u32 { + self.foo + } +} +#[derive(Copy, Clone)] +struct Fat<'a>(&'a Foo, &'static VTable); +struct VTable { + size: Foo, +} +const FOO: &dyn Bar = &Foo { + foo: 128, + bar: false, +}; +const G: Fat = unsafe { Transmute { t: FOO }.u }; +//~^ ERROR it is undefined behavior to use this value + +fn main() {} diff --git a/src/test/ui/issues/issue-79690.stderr b/src/test/ui/issues/issue-79690.stderr new file mode 100644 index 0000000000000..c7f9c6a55e712 --- /dev/null +++ b/src/test/ui/issues/issue-79690.stderr @@ -0,0 +1,11 @@ +error[E0080]: it is undefined behavior to use this value + --> $DIR/issue-79690.rs:26:1 + | +LL | const G: Fat = unsafe { Transmute { t: FOO }.u }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered read of part of a pointer at .1..size.foo + | + = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rustc repository if you believe it should not be considered undefined behavior. + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0080`. From a7b7a435ea14cd0d2b83ea8a229e7d9cc4c651f1 Mon Sep 17 00:00:00 2001 From: Camelid Date: Sun, 10 Jan 2021 20:40:47 -0800 Subject: [PATCH 2/3] Move test to `src/test/ui/consts/` Apparently `tidy` has a hard limit of 2830 tests in the `src/test/ui/issues/` directory, and this test hit that limit. `src/test/ui/consts/` is probably a better location anyway. --- src/test/ui/{issues => consts}/issue-79690.rs | 0 src/test/ui/{issues => consts}/issue-79690.stderr | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename src/test/ui/{issues => consts}/issue-79690.rs (100%) rename src/test/ui/{issues => consts}/issue-79690.stderr (100%) diff --git a/src/test/ui/issues/issue-79690.rs b/src/test/ui/consts/issue-79690.rs similarity index 100% rename from src/test/ui/issues/issue-79690.rs rename to src/test/ui/consts/issue-79690.rs diff --git a/src/test/ui/issues/issue-79690.stderr b/src/test/ui/consts/issue-79690.stderr similarity index 100% rename from src/test/ui/issues/issue-79690.stderr rename to src/test/ui/consts/issue-79690.stderr From 2be19932335f76cb4a97c275038a019751fbba6a Mon Sep 17 00:00:00 2001 From: Camelid Date: Sun, 24 Jan 2021 19:38:10 -0800 Subject: [PATCH 3/3] Ignore test on 32-bit architectures --- src/test/ui/consts/issue-79690.rs | 3 +++ src/test/ui/consts/issue-79690.stderr | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/test/ui/consts/issue-79690.rs b/src/test/ui/consts/issue-79690.rs index 6a38b3c8c2c71..a2e7b97b3187d 100644 --- a/src/test/ui/consts/issue-79690.rs +++ b/src/test/ui/consts/issue-79690.rs @@ -1,3 +1,6 @@ +// ignore-32bit +// This test gives a different error on 32-bit architectures. + union Transmute { t: T, u: U, diff --git a/src/test/ui/consts/issue-79690.stderr b/src/test/ui/consts/issue-79690.stderr index c7f9c6a55e712..918dd4c20f96c 100644 --- a/src/test/ui/consts/issue-79690.stderr +++ b/src/test/ui/consts/issue-79690.stderr @@ -1,5 +1,5 @@ error[E0080]: it is undefined behavior to use this value - --> $DIR/issue-79690.rs:26:1 + --> $DIR/issue-79690.rs:29:1 | LL | const G: Fat = unsafe { Transmute { t: FOO }.u }; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered read of part of a pointer at .1..size.foo