mgca: Lower all const paths as ConstArgKind::Path
When `#![feature(min_generic_const_args)]` is enabled, we now lower all const paths in generic arg position to `hir::ConstArgKind::Path`. We then lower assoc const paths to `ty::ConstKind::Unevaluated` since we can no longer use the anon const expression lowering machinery. In the process of implementing this, I factored out `hir_ty_lowering` code that is now shared between lowering assoc types and assoc consts. This PR also introduces a `#[type_const]` attribute for trait assoc consts that are allowed as const args. However, we still need to implement code to check that assoc const definitions satisfy `#[type_const]` if present (basically is it a const path or a monomorphic anon const).
This commit is contained in:
parent
2010bba886
commit
177e7ff548
35 changed files with 602 additions and 148 deletions
|
@ -3250,7 +3250,9 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
|
|||
obligation: &PredicateObligation<'tcx>,
|
||||
span: Span,
|
||||
) -> Result<Diag<'a>, ErrorGuaranteed> {
|
||||
if !self.tcx.features().generic_const_exprs() {
|
||||
if !self.tcx.features().generic_const_exprs()
|
||||
&& !self.tcx.features().min_generic_const_args()
|
||||
{
|
||||
let guar = self
|
||||
.dcx()
|
||||
.struct_span_err(span, "constant expression depends on a generic parameter")
|
||||
|
|
|
@ -85,6 +85,12 @@ pub fn is_const_evaluatable<'tcx>(
|
|||
}
|
||||
_ => bug!("unexpected constkind in `is_const_evalautable: {unexpanded_ct:?}`"),
|
||||
}
|
||||
} else if tcx.features().min_generic_const_args() {
|
||||
// This is a sanity check to make sure that non-generics consts are checked to
|
||||
// be evaluatable in case they aren't cchecked elsewhere. This will NOT error
|
||||
// if the const uses generics, as desired.
|
||||
crate::traits::evaluate_const(infcx, unexpanded_ct, param_env);
|
||||
Ok(())
|
||||
} else {
|
||||
let uv = match unexpanded_ct.kind() {
|
||||
ty::ConstKind::Unevaluated(uv) => uv,
|
||||
|
|
|
@ -410,7 +410,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
|||
let predicate = obligation.predicate.skip_binder();
|
||||
|
||||
let mut assume = predicate.trait_ref.args.const_at(2);
|
||||
// FIXME(min_generic_const_exprs): We should shallowly normalize this.
|
||||
// FIXME(mgca): We should shallowly normalize this.
|
||||
if self.tcx().features().generic_const_exprs() {
|
||||
assume = crate::traits::evaluate_const(self.infcx, assume, obligation.param_env)
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue