Skip to content

Commit

Permalink
Auto merge of rust-lang#130415 - matthiaskrgr:rollup-xhsu9oq, r=matth…
Browse files Browse the repository at this point in the history
…iaskrgr

Rollup of 3 pull requests

Successful merges:

 - rust-lang#130151 (Use a small runner for msvc-ext2 job)
 - rust-lang#130394 (const: don't ICE when encountering a mutable ref to immutable memory)
 - rust-lang#130409 (tests: more ice tests)

r? `@ghost`
`@rustbot` modify labels: rollup
  • Loading branch information
bors committed Sep 15, 2024
2 parents 04a3187 + 0406f12 commit d696a27
Show file tree
Hide file tree
Showing 16 changed files with 135 additions and 38 deletions.
10 changes: 2 additions & 8 deletions compiler/rustc_const_eval/src/interpret/validity.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,14 @@ use hir::def::DefKind;
use rustc_ast::Mutability;
use rustc_data_structures::fx::FxHashSet;
use rustc_hir as hir;
use rustc_middle::bug;
use rustc_middle::mir::interpret::ValidationErrorKind::{self, *};
use rustc_middle::mir::interpret::{
alloc_range, ExpectedKind, InterpError, InvalidMetaKind, Misalignment, PointerKind, Provenance,
UnsupportedOpInfo, ValidationErrorInfo,
};
use rustc_middle::ty::layout::{LayoutCx, LayoutOf, TyAndLayout};
use rustc_middle::ty::{self, Ty, TyCtxt};
use rustc_middle::{bug, span_bug};
use rustc_span::symbol::{sym, Symbol};
use rustc_target::abi::{
Abi, FieldIdx, FieldsShape, Scalar as ScalarAbi, Size, VariantIdx, Variants, WrappingRange,
Expand Down Expand Up @@ -617,13 +617,7 @@ impl<'rt, 'tcx, M: Machine<'tcx>> ValidityVisitor<'rt, 'tcx, M> {
if ptr_expected_mutbl == Mutability::Mut
&& alloc_actual_mutbl == Mutability::Not
{
if !self.ecx.tcx.sess.opts.unstable_opts.unleash_the_miri_inside_of_you
{
span_bug!(
self.ecx.tcx.span,
"the static const safety checks accepted mutable references they should not have accepted"
);
}
// This can actually occur with transmutes.
throw_validation_failure!(self.path, MutableRefToImmutable);
}
// In a const, everything must be completely immutable.
Expand Down
6 changes: 5 additions & 1 deletion src/ci/github-actions/jobs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@ runners:
os: macos-14
<<: *base-job

- &job-windows
os: windows-2022
<<: *base-job

- &job-windows-8c
os: windows-2022-8core-32gb
<<: *base-job
Expand Down Expand Up @@ -388,7 +392,7 @@ auto:
python x.py miri --stage 2 library/alloc --test-args notest &&
python x.py miri --stage 2 library/std --test-args notest
RUST_CONFIGURE_ARGS: --build=x86_64-pc-windows-msvc --enable-lld
<<: *job-windows-8c
<<: *job-windows

# 32/64-bit MinGW builds.
#
Expand Down
21 changes: 21 additions & 0 deletions tests/crashes/129262.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
//@ known-bug: rust-lang/rust#129262
//@ compile-flags: -Zvalidate-mir --edition=2018 --crate-type=lib -Copt-level=3

#![feature(async_closure)]

fn main() {}

fn needs_fn_mut<T>(mut x: impl FnMut() -> T) {
x();
}

fn hello(x: Ty) {
needs_fn_mut(async || {
x.hello();
});
}

struct Ty;
impl Ty {
fn hello(self) {}
}
9 changes: 9 additions & 0 deletions tests/crashes/129850.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
//@ known-bug: rust-lang/rust#129850

pub trait Foo2 {
fn bar<'a: 'a>(&'a mut self) -> impl Sized + use<'static>;
}

impl Foo2 for () {
fn bar<'a: 'a>(&'a mut self) -> impl Sized + 'a {}
}
6 changes: 6 additions & 0 deletions tests/crashes/130104.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
//@ known-bug: rust-lang/rust#130104

fn main() {
let non_secure_function =
core::mem::transmute::<fn() -> _, extern "C-cmse-nonsecure-call" fn() -> _>;
}
15 changes: 15 additions & 0 deletions tests/crashes/130310.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
//@ known-bug: rust-lang/rust#130310

use std::marker::PhantomData;

#[repr(C)]
struct A<T> {
a: *const A<A<T>>,
p: PhantomData<T>,
}

extern "C" {
fn f(a: *const A<()>);
}

fn main() {}
10 changes: 10 additions & 0 deletions tests/crashes/130346.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
//@ known-bug: rust-lang/rust#130346

#![feature(non_lifetime_binders)]
#![allow(unused)]

trait A<T>: Iterator<Item = T> {}

fn demo(x: &mut impl for<U> A<U>) {
let _: Option<u32> = x.next(); // Removing this line stops the ICE
}
9 changes: 9 additions & 0 deletions tests/crashes/130372-1.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
//@ known-bug: rust-lang/rust#130372

pub fn variadic_fn(n: usize, mut args: ...) {}

reuse variadic_fn;

fn main() {
variadic_fn();
}
11 changes: 11 additions & 0 deletions tests/crashes/130372-2.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
//@ known-bug: rust-lang/rust#130372

pub fn test_va_copy(_: u64, mut ap: ...) {}

pub fn main() {
unsafe {
test_va_copy();

call(x);
}
}
7 changes: 7 additions & 0 deletions tests/crashes/130372-3.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
//@ known-bug: rust-lang/rust#130372

fn bar() -> impl Fn() {
wrap()
}

fn wrap(...: impl ...) -> impl Fn() {}
5 changes: 5 additions & 0 deletions tests/crashes/130399.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
//@ known-bug: rust-lang/rust#130399

fn elided(main: &()) -> impl Sized + use<main> {}

fn main() {}
14 changes: 0 additions & 14 deletions tests/ui/consts/const-eval/transmute-const.64bit.stderr

This file was deleted.

1 change: 0 additions & 1 deletion tests/ui/consts/const-eval/transmute-const.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
//@ stderr-per-bitwidth
use std::mem;

static FOO: bool = unsafe { mem::transmute(3u8) };
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
error[E0080]: it is undefined behavior to use this value
--> $DIR/transmute-const.rs:4:1
--> $DIR/transmute-const.rs:3:1
|
LL | static FOO: bool = unsafe { mem::transmute(3u8) };
| ^^^^^^^^^^^^^^^^ constructing invalid value: encountered 0x03, but expected a boolean
Expand Down
10 changes: 10 additions & 0 deletions tests/ui/consts/const-mut-refs/mut_ref_in_final.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
//@ normalize-stderr-test: "(the raw bytes of the constant) \(size: [0-9]*, align: [0-9]*\)" -> "$1 (size: $$SIZE, align: $$ALIGN)"
//@ normalize-stderr-test: "( 0x[0-9a-f][0-9a-f] │)? ([0-9a-f][0-9a-f] |__ |╾─*ALLOC[0-9]+(\+[a-z0-9]+)?(<imm>)?─*╼ )+ *│.*" -> " HEX_DUMP"
//@ normalize-stderr-test: "HEX_DUMP\s*\n\s*HEX_DUMP" -> "HEX_DUMP"

use std::cell::UnsafeCell;
use std::mem;

const NULL: *mut i32 = std::ptr::null_mut();
const A: *const i32 = &4;
Expand All @@ -17,6 +22,11 @@ const B3: Option<&mut i32> = Some(&mut 42); //~ ERROR temporary value dropped wh
const fn helper(x: &mut i32) -> Option<&mut i32> { Some(x) }
const B4: Option<&mut i32> = helper(&mut 42); //~ ERROR temporary value dropped while borrowed

// Not ok, since it points to read-only memory.
const IMMUT_MUT_REF: &mut u16 = unsafe { mem::transmute(&13) };
//~^ ERROR undefined behavior to use this value
//~| pointing to read-only memory

// Ok, because no references to mutable data exist here, since the `{}` moves
// its value and then takes a reference to that.
const C: *const i32 = &{
Expand Down
37 changes: 24 additions & 13 deletions tests/ui/consts/const-mut-refs/mut_ref_in_final.stderr
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
error[E0764]: mutable references are not allowed in the final value of constants
--> $DIR/mut_ref_in_final.rs:9:21
--> $DIR/mut_ref_in_final.rs:14:21
|
LL | const B: *mut i32 = &mut 4;
| ^^^^^^

error[E0716]: temporary value dropped while borrowed
--> $DIR/mut_ref_in_final.rs:15:40
--> $DIR/mut_ref_in_final.rs:20:40
|
LL | const B3: Option<&mut i32> = Some(&mut 42);
| ----------^^-
Expand All @@ -15,7 +15,7 @@ LL | const B3: Option<&mut i32> = Some(&mut 42);
| using this value as a constant requires that borrow lasts for `'static`

error[E0716]: temporary value dropped while borrowed
--> $DIR/mut_ref_in_final.rs:18:42
--> $DIR/mut_ref_in_final.rs:23:42
|
LL | const B4: Option<&mut i32> = helper(&mut 42);
| ------------^^-
Expand All @@ -24,8 +24,19 @@ LL | const B4: Option<&mut i32> = helper(&mut 42);
| | creates a temporary value which is freed while still in use
| using this value as a constant requires that borrow lasts for `'static`

error[E0080]: it is undefined behavior to use this value
--> $DIR/mut_ref_in_final.rs:26:1
|
LL | const IMMUT_MUT_REF: &mut u16 = unsafe { mem::transmute(&13) };
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ constructing invalid value: encountered mutable reference or box pointing to read-only memory
|
= 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.
= note: the raw bytes of the constant (size: $SIZE, align: $ALIGN) {
HEX_DUMP
}

error[E0716]: temporary value dropped while borrowed
--> $DIR/mut_ref_in_final.rs:40:65
--> $DIR/mut_ref_in_final.rs:50:65
|
LL | const FOO: NotAMutex<&mut i32> = NotAMutex(UnsafeCell::new(&mut 42));
| -------------------------------^^--
Expand All @@ -35,7 +46,7 @@ LL | const FOO: NotAMutex<&mut i32> = NotAMutex(UnsafeCell::new(&mut 42));
| using this value as a constant requires that borrow lasts for `'static`

error[E0716]: temporary value dropped while borrowed
--> $DIR/mut_ref_in_final.rs:43:67
--> $DIR/mut_ref_in_final.rs:53:67
|
LL | static FOO2: NotAMutex<&mut i32> = NotAMutex(UnsafeCell::new(&mut 42));
| -------------------------------^^--
Expand All @@ -45,7 +56,7 @@ LL | static FOO2: NotAMutex<&mut i32> = NotAMutex(UnsafeCell::new(&mut 42));
| using this value as a static requires that borrow lasts for `'static`

error[E0716]: temporary value dropped while borrowed
--> $DIR/mut_ref_in_final.rs:46:71
--> $DIR/mut_ref_in_final.rs:56:71
|
LL | static mut FOO3: NotAMutex<&mut i32> = NotAMutex(UnsafeCell::new(&mut 42));
| -------------------------------^^--
Expand All @@ -55,30 +66,30 @@ LL | static mut FOO3: NotAMutex<&mut i32> = NotAMutex(UnsafeCell::new(&mut 42));
| using this value as a static requires that borrow lasts for `'static`

error[E0764]: mutable references are not allowed in the final value of statics
--> $DIR/mut_ref_in_final.rs:59:53
--> $DIR/mut_ref_in_final.rs:69:53
|
LL | static RAW_MUT_CAST_S: SyncPtr<i32> = SyncPtr { x : &mut 42 as *mut _ as *const _ };
| ^^^^^^^

error[E0764]: mutable references are not allowed in the final value of statics
--> $DIR/mut_ref_in_final.rs:61:54
--> $DIR/mut_ref_in_final.rs:71:54
|
LL | static RAW_MUT_COERCE_S: SyncPtr<i32> = SyncPtr { x: &mut 0 };
| ^^^^^^

error[E0764]: mutable references are not allowed in the final value of constants
--> $DIR/mut_ref_in_final.rs:63:52
--> $DIR/mut_ref_in_final.rs:73:52
|
LL | const RAW_MUT_CAST_C: SyncPtr<i32> = SyncPtr { x : &mut 42 as *mut _ as *const _ };
| ^^^^^^^

error[E0764]: mutable references are not allowed in the final value of constants
--> $DIR/mut_ref_in_final.rs:65:53
--> $DIR/mut_ref_in_final.rs:75:53
|
LL | const RAW_MUT_COERCE_C: SyncPtr<i32> = SyncPtr { x: &mut 0 };
| ^^^^^^

error: aborting due to 10 previous errors
error: aborting due to 11 previous errors

Some errors have detailed explanations: E0716, E0764.
For more information about an error, try `rustc --explain E0716`.
Some errors have detailed explanations: E0080, E0716, E0764.
For more information about an error, try `rustc --explain E0080`.

0 comments on commit d696a27

Please sign in to comment.