Don't create projection ty for const projection

This commit is contained in:
Michael Goulet 2023-04-19 23:38:02 +00:00
parent 915aa06700
commit cde5bcafe8
3 changed files with 56 additions and 8 deletions

View File

@ -1272,14 +1272,29 @@ fn project<'cx, 'tcx>(
ProjectionCandidateSet::Single(candidate) => { ProjectionCandidateSet::Single(candidate) => {
Ok(Projected::Progress(confirm_candidate(selcx, obligation, candidate))) Ok(Projected::Progress(confirm_candidate(selcx, obligation, candidate)))
} }
ProjectionCandidateSet::None => Ok(Projected::NoProgress( ProjectionCandidateSet::None => {
// FIXME(associated_const_generics): this may need to change in the future? let tcx = selcx.tcx();
// need to investigate whether or not this is fine. let term = match tcx.def_kind(obligation.predicate.def_id) {
selcx DefKind::AssocTy | DefKind::ImplTraitPlaceholder => tcx
.tcx() .mk_projection(obligation.predicate.def_id, obligation.predicate.substs)
.mk_projection(obligation.predicate.def_id, obligation.predicate.substs) .into(),
.into(), DefKind::AssocConst => tcx
)), .mk_const(
ty::ConstKind::Unevaluated(ty::UnevaluatedConst::new(
obligation.predicate.def_id,
obligation.predicate.substs,
)),
tcx.type_of(obligation.predicate.def_id)
.subst(tcx, obligation.predicate.substs),
)
.into(),
kind => {
bug!("unknown projection def-id: {}", kind.descr(obligation.predicate.def_id))
}
};
Ok(Projected::NoProgress(term))
}
// Error occurred while trying to processing impls. // Error occurred while trying to processing impls.
ProjectionCandidateSet::Error(e) => Err(ProjectionError::TraitSelectionError(e)), ProjectionCandidateSet::Error(e) => Err(ProjectionError::TraitSelectionError(e)),
// Inherent ambiguity that prevents us from even enumerating the // Inherent ambiguity that prevents us from even enumerating the

View File

@ -0,0 +1,16 @@
#![feature(associated_const_equality)]
// Issue 110549
pub trait TraitWAssocConst {
const A: usize;
}
fn foo<T: TraitWAssocConst<A = 32>>() {}
fn bar<T: TraitWAssocConst>() {
foo::<T>();
//~^ ERROR type mismatch resolving `<T as TraitWAssocConst>::A == 32`
}
fn main() {}

View File

@ -0,0 +1,17 @@
error[E0271]: type mismatch resolving `<T as TraitWAssocConst>::A == 32`
--> $DIR/projection-unspecified-but-bounded.rs:12:11
|
LL | foo::<T>();
| ^ expected `32`, found `<T as TraitWAssocConst>::A`
|
= note: expected constant `32`
found constant `<T as TraitWAssocConst>::A`
note: required by a bound in `foo`
--> $DIR/projection-unspecified-but-bounded.rs:9:28
|
LL | fn foo<T: TraitWAssocConst<A = 32>>() {}
| ^^^^^^ required by this bound in `foo`
error: aborting due to previous error
For more information about this error, try `rustc --explain E0271`.