Rollup merge of #120883 - RalfJung:extern-static-err, r=oli-obk
interpret: rename ReadExternStatic → ExternStatic This error shows up for reads and writes, so `ReadExternStatic` is misleading.
This commit is contained in:
commit
09bbcd6667
@ -98,6 +98,8 @@ const_eval_error = {$error_kind ->
|
|||||||
const_eval_exact_div_has_remainder =
|
const_eval_exact_div_has_remainder =
|
||||||
exact_div: {$a} cannot be divided by {$b} without remainder
|
exact_div: {$a} cannot be divided by {$b} without remainder
|
||||||
|
|
||||||
|
const_eval_extern_static =
|
||||||
|
cannot access extern static ({$did})
|
||||||
const_eval_fn_ptr_call =
|
const_eval_fn_ptr_call =
|
||||||
function pointers need an RFC before allowed to be called in {const_eval_const_context}s
|
function pointers need an RFC before allowed to be called in {const_eval_const_context}s
|
||||||
const_eval_for_loop_into_iter_non_const =
|
const_eval_for_loop_into_iter_non_const =
|
||||||
@ -302,8 +304,6 @@ const_eval_raw_ptr_to_int =
|
|||||||
.note = at compile-time, pointers do not have an integer value
|
.note = at compile-time, pointers do not have an integer value
|
||||||
.note2 = avoiding this restriction via `transmute`, `union`, or raw pointers leads to compile-time undefined behavior
|
.note2 = avoiding this restriction via `transmute`, `union`, or raw pointers leads to compile-time undefined behavior
|
||||||
|
|
||||||
const_eval_read_extern_static =
|
|
||||||
cannot read from extern static ({$did})
|
|
||||||
const_eval_read_pointer_as_int =
|
const_eval_read_pointer_as_int =
|
||||||
unable to turn pointer into integer
|
unable to turn pointer into integer
|
||||||
const_eval_realloc_or_alloc_with_offset =
|
const_eval_realloc_or_alloc_with_offset =
|
||||||
|
@ -799,7 +799,7 @@ fn diagnostic_message(&self) -> DiagnosticMessage {
|
|||||||
UnsupportedOpInfo::ReadPartialPointer(_) => const_eval_partial_pointer_copy,
|
UnsupportedOpInfo::ReadPartialPointer(_) => const_eval_partial_pointer_copy,
|
||||||
UnsupportedOpInfo::ReadPointerAsInt(_) => const_eval_read_pointer_as_int,
|
UnsupportedOpInfo::ReadPointerAsInt(_) => const_eval_read_pointer_as_int,
|
||||||
UnsupportedOpInfo::ThreadLocalStatic(_) => const_eval_thread_local_static,
|
UnsupportedOpInfo::ThreadLocalStatic(_) => const_eval_thread_local_static,
|
||||||
UnsupportedOpInfo::ReadExternStatic(_) => const_eval_read_extern_static,
|
UnsupportedOpInfo::ExternStatic(_) => const_eval_extern_static,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fn add_args<G: EmissionGuarantee>(self, _: &DiagCtxt, builder: &mut DiagnosticBuilder<'_, G>) {
|
fn add_args<G: EmissionGuarantee>(self, _: &DiagCtxt, builder: &mut DiagnosticBuilder<'_, G>) {
|
||||||
@ -818,7 +818,7 @@ fn add_args<G: EmissionGuarantee>(self, _: &DiagCtxt, builder: &mut DiagnosticBu
|
|||||||
OverwritePartialPointer(ptr) | ReadPartialPointer(ptr) => {
|
OverwritePartialPointer(ptr) | ReadPartialPointer(ptr) => {
|
||||||
builder.arg("ptr", ptr);
|
builder.arg("ptr", ptr);
|
||||||
}
|
}
|
||||||
ThreadLocalStatic(did) | ReadExternStatic(did) => {
|
ThreadLocalStatic(did) | ExternStatic(did) => {
|
||||||
builder.arg("did", format!("{did:?}"));
|
builder.arg("did", format!("{did:?}"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -557,7 +557,7 @@ fn get_global_alloc(
|
|||||||
if self.tcx.is_foreign_item(def_id) {
|
if self.tcx.is_foreign_item(def_id) {
|
||||||
// This is unreachable in Miri, but can happen in CTFE where we actually *do* support
|
// This is unreachable in Miri, but can happen in CTFE where we actually *do* support
|
||||||
// referencing arbitrary (declared) extern statics.
|
// referencing arbitrary (declared) extern statics.
|
||||||
throw_unsup!(ReadExternStatic(def_id));
|
throw_unsup!(ExternStatic(def_id));
|
||||||
}
|
}
|
||||||
|
|
||||||
// We don't give a span -- statics don't need that, they cannot be generic or associated.
|
// We don't give a span -- statics don't need that, they cannot be generic or associated.
|
||||||
|
@ -470,7 +470,7 @@ pub enum UnsupportedOpInfo {
|
|||||||
/// Accessing thread local statics
|
/// Accessing thread local statics
|
||||||
ThreadLocalStatic(DefId),
|
ThreadLocalStatic(DefId),
|
||||||
/// Accessing an unsupported extern static.
|
/// Accessing an unsupported extern static.
|
||||||
ReadExternStatic(DefId),
|
ExternStatic(DefId),
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Error information for when the program exhausted the resources granted to it
|
/// Error information for when the program exhausted the resources granted to it
|
||||||
|
24
tests/ui/consts/miri_unleashed/extern-static.rs
Normal file
24
tests/ui/consts/miri_unleashed/extern-static.rs
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
// compile-flags: -Zunleash-the-miri-inside-of-you
|
||||||
|
#![feature(thread_local)]
|
||||||
|
#![allow(static_mut_ref)]
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
static mut DATA: u8;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make sure we catch accessing extern static.
|
||||||
|
static TEST_READ: () = {
|
||||||
|
unsafe { let _val = DATA; }
|
||||||
|
//~^ ERROR could not evaluate static initializer
|
||||||
|
//~| NOTE cannot access extern static
|
||||||
|
};
|
||||||
|
static TEST_WRITE: () = {
|
||||||
|
unsafe { DATA = 0; }
|
||||||
|
//~^ ERROR could not evaluate static initializer
|
||||||
|
//~| NOTE cannot access extern static
|
||||||
|
};
|
||||||
|
|
||||||
|
// Just creating a reference is fine, as long as we are not reading or writing.
|
||||||
|
static TEST_REF: &u8 = unsafe { &DATA };
|
||||||
|
|
||||||
|
fn main() {}
|
15
tests/ui/consts/miri_unleashed/extern-static.stderr
Normal file
15
tests/ui/consts/miri_unleashed/extern-static.stderr
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
error[E0080]: could not evaluate static initializer
|
||||||
|
--> $DIR/extern-static.rs:11:25
|
||||||
|
|
|
||||||
|
LL | unsafe { let _val = DATA; }
|
||||||
|
| ^^^^ cannot access extern static (DefId(0:4 ~ extern_static[c41e]::{extern#0}::DATA))
|
||||||
|
|
||||||
|
error[E0080]: could not evaluate static initializer
|
||||||
|
--> $DIR/extern-static.rs:16:14
|
||||||
|
|
|
||||||
|
LL | unsafe { DATA = 0; }
|
||||||
|
| ^^^^^^^^ cannot access extern static (DefId(0:4 ~ extern_static[c41e]::{extern#0}::DATA))
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0080`.
|
@ -14,6 +14,8 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Make sure we catch taking a reference to thread-local storage.
|
// Make sure we catch taking a reference to thread-local storage.
|
||||||
|
// The actual pointer depends on the thread, so even just taking a reference already does not make
|
||||||
|
// sense at compile-time.
|
||||||
static TEST_BAD_REF: () = {
|
static TEST_BAD_REF: () = {
|
||||||
unsafe { let _val = &A; }
|
unsafe { let _val = &A; }
|
||||||
//~^ ERROR could not evaluate static initializer
|
//~^ ERROR could not evaluate static initializer
|
||||||
|
@ -5,7 +5,7 @@ LL | unsafe { let _val = A; }
|
|||||||
| ^ cannot access thread local static (DefId(0:4 ~ tls[ca29]::A))
|
| ^ cannot access thread local static (DefId(0:4 ~ tls[ca29]::A))
|
||||||
|
|
||||||
error[E0080]: could not evaluate static initializer
|
error[E0080]: could not evaluate static initializer
|
||||||
--> $DIR/tls.rs:18:26
|
--> $DIR/tls.rs:20:26
|
||||||
|
|
|
|
||||||
LL | unsafe { let _val = &A; }
|
LL | unsafe { let _val = &A; }
|
||||||
| ^ cannot access thread local static (DefId(0:4 ~ tls[ca29]::A))
|
| ^ cannot access thread local static (DefId(0:4 ~ tls[ca29]::A))
|
||||||
@ -18,7 +18,7 @@ help: skipping check that does not even have a feature gate
|
|||||||
LL | unsafe { let _val = A; }
|
LL | unsafe { let _val = A; }
|
||||||
| ^
|
| ^
|
||||||
help: skipping check that does not even have a feature gate
|
help: skipping check that does not even have a feature gate
|
||||||
--> $DIR/tls.rs:18:26
|
--> $DIR/tls.rs:20:26
|
||||||
|
|
|
|
||||||
LL | unsafe { let _val = &A; }
|
LL | unsafe { let _val = &A; }
|
||||||
| ^
|
| ^
|
||||||
|
Loading…
Reference in New Issue
Block a user