Rollup merge of #123362 - oli-obk:thread_local_nested_statics, r=estebank
Check that nested statics in thread locals are duplicated per thread. follow-up to #123310 cc ``@compiler-errors`` ``@RalfJung`` fwiw: I have no idea how thread local statics make that work under LLVM, and miri fails on this example, which I would have expected to be the correct behaviour. Since the `#[thread_local]` attribute is just an internal implementation detail, I'm just going to start hard erroring on nested mutable statics in thread locals.
This commit is contained in:
commit
5b717684ff
@ -222,6 +222,7 @@ const_eval_mut_deref =
|
|||||||
|
|
||||||
const_eval_mutable_ptr_in_final = encountered mutable pointer in final value of {const_eval_intern_kind}
|
const_eval_mutable_ptr_in_final = encountered mutable pointer in final value of {const_eval_intern_kind}
|
||||||
|
|
||||||
|
const_eval_nested_static_in_thread_local = #[thread_local] does not support implicit nested statics, please create explicit static items and refer to them instead
|
||||||
const_eval_non_const_fmt_macro_call =
|
const_eval_non_const_fmt_macro_call =
|
||||||
cannot call non-const formatting macro in {const_eval_const_context}s
|
cannot call non-const formatting macro in {const_eval_const_context}s
|
||||||
|
|
||||||
|
@ -25,6 +25,13 @@ pub(crate) struct DanglingPtrInFinal {
|
|||||||
pub kind: InternKind,
|
pub kind: InternKind,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(const_eval_nested_static_in_thread_local)]
|
||||||
|
pub(crate) struct NestedStaticInThreadLocal {
|
||||||
|
#[primary_span]
|
||||||
|
pub span: Span,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(LintDiagnostic)]
|
#[derive(LintDiagnostic)]
|
||||||
#[diag(const_eval_mutable_ptr_in_final)]
|
#[diag(const_eval_mutable_ptr_in_final)]
|
||||||
pub(crate) struct MutablePtrInFinal {
|
pub(crate) struct MutablePtrInFinal {
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
|
|
||||||
use super::{AllocId, Allocation, InterpCx, MPlaceTy, Machine, MemoryKind, PlaceTy};
|
use super::{AllocId, Allocation, InterpCx, MPlaceTy, Machine, MemoryKind, PlaceTy};
|
||||||
use crate::const_eval;
|
use crate::const_eval;
|
||||||
use crate::errors::{DanglingPtrInFinal, MutablePtrInFinal};
|
use crate::errors::{DanglingPtrInFinal, MutablePtrInFinal, NestedStaticInThreadLocal};
|
||||||
|
|
||||||
pub trait CompileTimeMachine<'mir, 'tcx: 'mir, T> = Machine<
|
pub trait CompileTimeMachine<'mir, 'tcx: 'mir, T> = Machine<
|
||||||
'mir,
|
'mir,
|
||||||
@ -108,6 +108,10 @@ fn intern_as_new_static<'tcx>(
|
|||||||
);
|
);
|
||||||
tcx.set_nested_alloc_id_static(alloc_id, feed.def_id());
|
tcx.set_nested_alloc_id_static(alloc_id, feed.def_id());
|
||||||
|
|
||||||
|
if tcx.is_thread_local_static(static_id.into()) {
|
||||||
|
tcx.dcx().emit_err(NestedStaticInThreadLocal { span: tcx.def_span(static_id) });
|
||||||
|
}
|
||||||
|
|
||||||
// These do not inherit the codegen attrs of the parent static allocation, since
|
// These do not inherit the codegen attrs of the parent static allocation, since
|
||||||
// it doesn't make sense for them to inherit their `#[no_mangle]` and `#[link_name = ..]`
|
// it doesn't make sense for them to inherit their `#[no_mangle]` and `#[link_name = ..]`
|
||||||
// and the like.
|
// and the like.
|
||||||
|
14
tests/ui/statics/nested_thread_local.rs
Normal file
14
tests/ui/statics/nested_thread_local.rs
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
// Check that we forbid nested statics in `thread_local` statics.
|
||||||
|
|
||||||
|
#![feature(const_refs_to_cell)]
|
||||||
|
#![feature(thread_local)]
|
||||||
|
|
||||||
|
#[thread_local]
|
||||||
|
static mut FOO: &u32 = {
|
||||||
|
//~^ ERROR: does not support implicit nested statics
|
||||||
|
// Prevent promotion (that would trigger on `&42` as an expression)
|
||||||
|
let x = 42;
|
||||||
|
&{ x }
|
||||||
|
};
|
||||||
|
|
||||||
|
fn main() {}
|
8
tests/ui/statics/nested_thread_local.stderr
Normal file
8
tests/ui/statics/nested_thread_local.stderr
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
error: #[thread_local] does not support implicit nested statics, please create explicit static items and refer to them instead
|
||||||
|
--> $DIR/nested_thread_local.rs:7:1
|
||||||
|
|
|
||||||
|
LL | static mut FOO: &u32 = {
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
Loading…
Reference in New Issue
Block a user