validate promoteds
This commit is contained in:
parent
bd2f1cb278
commit
06ca7b700c
1 changed files with 9 additions and 19 deletions
|
@ -383,26 +383,16 @@ pub fn eval_to_allocation_raw_provider<'tcx>(
|
||||||
Ok(mplace) => {
|
Ok(mplace) => {
|
||||||
// Since evaluation had no errors, valiate the resulting constant:
|
// Since evaluation had no errors, valiate the resulting constant:
|
||||||
let validation = try {
|
let validation = try {
|
||||||
// FIXME do not validate promoteds until a decision on
|
|
||||||
// https://github.com/rust-lang/rust/issues/67465 and
|
|
||||||
// https://github.com/rust-lang/rust/issues/67534 is made.
|
|
||||||
// Promoteds can contain unexpected `UnsafeCell` and reference `static`s, but their
|
|
||||||
// otherwise restricted form ensures that this is still sound. We just lose the
|
|
||||||
// extra safety net of some of the dynamic checks. They can also contain invalid
|
|
||||||
// values, but since we do not usually check intermediate results of a computation
|
|
||||||
// for validity, it might be surprising to do that here.
|
|
||||||
if cid.promoted.is_none() {
|
|
||||||
let mut ref_tracking = RefTracking::new(mplace);
|
let mut ref_tracking = RefTracking::new(mplace);
|
||||||
let mut inner = false;
|
let mut inner = false;
|
||||||
while let Some((mplace, path)) = ref_tracking.todo.pop() {
|
while let Some((mplace, path)) = ref_tracking.todo.pop() {
|
||||||
let mode = match tcx.static_mutability(cid.instance.def_id()) {
|
let mode = match tcx.static_mutability(cid.instance.def_id()) {
|
||||||
Some(_) => CtfeValidationMode::Regular, // a `static`
|
Some(_) if cid.promoted.is_none() => CtfeValidationMode::Regular, // a `static`
|
||||||
None => CtfeValidationMode::Const { inner },
|
_ => CtfeValidationMode::Const { inner },
|
||||||
};
|
};
|
||||||
ecx.const_validate_operand(mplace.into(), path, &mut ref_tracking, mode)?;
|
ecx.const_validate_operand(mplace.into(), path, &mut ref_tracking, mode)?;
|
||||||
inner = true;
|
inner = true;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
};
|
};
|
||||||
if let Err(error) = validation {
|
if let Err(error) = validation {
|
||||||
// Validation failed, report an error
|
// Validation failed, report an error
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue