Stop using the const_eval query for initializers of statics
As a side effect, we now represent most promoteds as `ConstValue::Scalar` again. This is useful because all implict promoteds are just references anyway and most explicit promoteds are numeric arguments to `asm!` or SIMD instructions.
This commit is contained in:
@@ -914,13 +914,6 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
||||
} else {
|
||||
self.param_env
|
||||
};
|
||||
// We use `const_eval_raw` here, and get an unvalidated result. That is okay:
|
||||
// Our result will later be validated anyway, and there seems no good reason
|
||||
// to have to fail early here. This is also more consistent with
|
||||
// `Memory::get_static_alloc` which has to use `const_eval_raw` to avoid cycles.
|
||||
// FIXME: We can hit delay_span_bug if this is an invalid const, interning finds
|
||||
// that problem, but we never run validation to show an error. Can we ensure
|
||||
// this does not happen?
|
||||
let val = self.tcx.const_eval_raw(param_env.and(gid))?;
|
||||
self.raw_const_to_mplace(val)
|
||||
}
|
||||
|
||||
@@ -554,11 +554,9 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
||||
ty::ConstKind::Unevaluated(def, substs, promoted) => {
|
||||
let instance = self.resolve(def.did, substs)?;
|
||||
// We use `const_eval` here and `const_eval_raw` elsewhere in mir interpretation.
|
||||
// The reason we use `const_eval_raw` everywhere else is to prevent cycles during
|
||||
// validation, because validation automatically reads through any references, thus
|
||||
// potentially requiring the current static to be evaluated again. This is not a
|
||||
// problem here, because we are building an operand which means an actual read is
|
||||
// happening.
|
||||
// The reason we use `const_eval` here is that there can never be a `ty::ConstKind`
|
||||
// that directly mentions the initializer of a static. Statics are always encoded
|
||||
// as constants with vaule `&STATIC`.
|
||||
return Ok(self.const_eval(GlobalId { instance, promoted }, val.ty)?);
|
||||
}
|
||||
ty::ConstKind::Infer(..)
|
||||
|
||||
Reference in New Issue
Block a user