Don't create projection ty for const projection
This commit is contained in:
parent
915aa06700
commit
cde5bcafe8
@ -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
|
||||||
|
@ -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() {}
|
@ -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`.
|
Loading…
x
Reference in New Issue
Block a user