Fix const-generics ICE related to binding
This commit is contained in:
parent
ce331ee6ee
commit
242ac57015
5 changed files with 150 additions and 1 deletions
|
@ -115,7 +115,14 @@ fn resolve_associated_item<'tcx>(
|
|||
);
|
||||
|
||||
let trait_ref = ty::TraitRef::from_method(tcx, trait_id, rcvr_substs);
|
||||
let vtbl = tcx.codegen_fulfill_obligation((param_env, ty::Binder::bind(trait_ref, tcx)))?;
|
||||
let vtbl = if trait_item.kind == ty::AssocKind::Const {
|
||||
let bound_vars = tcx
|
||||
.mk_bound_variable_kinds(std::iter::once(ty::BoundVariableKind::Region(ty::BrAnon(0))));
|
||||
let bind = ty::Binder::bind_with_vars(trait_ref, bound_vars);
|
||||
tcx.codegen_fulfill_obligation((param_env, bind))?
|
||||
} else {
|
||||
tcx.codegen_fulfill_obligation((param_env, ty::Binder::bind(trait_ref, tcx)))?
|
||||
};
|
||||
|
||||
// Now that we know which impl is being used, we can dispatch to
|
||||
// the actual function:
|
||||
|
|
38
src/test/ui/const-generics/issues/issue-83765.rs
Normal file
38
src/test/ui/const-generics/issues/issue-83765.rs
Normal file
|
@ -0,0 +1,38 @@
|
|||
#![feature(const_generics, const_evaluatable_checked)]
|
||||
#![allow(incomplete_features)]
|
||||
|
||||
trait TensorDimension {
|
||||
const DIM: usize;
|
||||
}
|
||||
|
||||
trait TensorSize: TensorDimension {
|
||||
fn size(&self) -> [usize; Self::DIM];
|
||||
}
|
||||
|
||||
trait Broadcastable: TensorSize + Sized {
|
||||
type Element;
|
||||
fn lazy_updim<const NEWDIM: usize>(&self, size: [usize; NEWDIM]) {}
|
||||
}
|
||||
|
||||
struct BMap<'a, R, T: Broadcastable, F: Fn(T::Element) -> R, const DIM: usize> {
|
||||
reference: &'a T,
|
||||
closure: F,
|
||||
}
|
||||
|
||||
impl<'a, R, T: Broadcastable, F: Fn(T::Element) -> R, const DIM: usize> TensorDimension
|
||||
for BMap<'a, R, T, F, DIM>
|
||||
{
|
||||
const DIM: usize = DIM;
|
||||
}
|
||||
impl<'a, R, T: Broadcastable, F: Fn(T::Element) -> R, const DIM: usize> TensorSize
|
||||
for BMap<'a, R, T, F, DIM>
|
||||
{
|
||||
fn size(&self) -> [usize; DIM] {
|
||||
//~^ ERROR: method not compatible with trait [E0308]
|
||||
self.reference.size()
|
||||
//~^ ERROR: unconstrained generic constant
|
||||
//~| ERROR: mismatched types
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {}
|
29
src/test/ui/const-generics/issues/issue-83765.stderr
Normal file
29
src/test/ui/const-generics/issues/issue-83765.stderr
Normal file
|
@ -0,0 +1,29 @@
|
|||
error[E0308]: method not compatible with trait
|
||||
--> $DIR/issue-83765.rs:30:5
|
||||
|
|
||||
LL | fn size(&self) -> [usize; DIM] {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `Self::DIM`, found `DIM`
|
||||
|
|
||||
= note: expected type `Self::DIM`
|
||||
found type `DIM`
|
||||
|
||||
error: unconstrained generic constant
|
||||
--> $DIR/issue-83765.rs:32:24
|
||||
|
|
||||
LL | self.reference.size()
|
||||
| ^^^^
|
||||
|
|
||||
= help: try adding a `where` bound using this expression: `where [(); Self::DIM]:`
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/issue-83765.rs:32:9
|
||||
|
|
||||
LL | self.reference.size()
|
||||
| ^^^^^^^^^^^^^^^^^^^^^ expected `DIM`, found `Self::DIM`
|
||||
|
|
||||
= note: expected type `DIM`
|
||||
found type `Self::DIM`
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0308`.
|
31
src/test/ui/const-generics/issues/issue-85848.rs
Normal file
31
src/test/ui/const-generics/issues/issue-85848.rs
Normal file
|
@ -0,0 +1,31 @@
|
|||
#![feature(const_generics, const_fn_trait_bound, const_evaluatable_checked)]
|
||||
#![allow(incomplete_features)]
|
||||
|
||||
trait _Contains<T> {
|
||||
const does_contain: bool;
|
||||
}
|
||||
|
||||
trait Contains<T, const Satisfied: bool> {}
|
||||
|
||||
trait Delegates<T> {}
|
||||
|
||||
impl<T, U> Delegates<U> for T where T: Contains<U, true> {}
|
||||
|
||||
const fn contains<A, B>() -> bool
|
||||
where
|
||||
A: _Contains<B>,
|
||||
{
|
||||
A::does_contain
|
||||
}
|
||||
|
||||
impl<T, U> Contains<T, { contains::<T, U>() }> for U where T: _Contains<U> {}
|
||||
|
||||
fn writes_to_path<C>(cap: &C) {
|
||||
writes_to_specific_path(&cap);
|
||||
//~^ ERROR: the trait bound `(): _Contains<&C>` is not satisfied [E0277]
|
||||
//~| ERROR: unconstrained generic constant
|
||||
}
|
||||
|
||||
fn writes_to_specific_path<C: Delegates<()>>(cap: &C) {}
|
||||
|
||||
fn main() {}
|
44
src/test/ui/const-generics/issues/issue-85848.stderr
Normal file
44
src/test/ui/const-generics/issues/issue-85848.stderr
Normal file
|
@ -0,0 +1,44 @@
|
|||
error[E0277]: the trait bound `(): _Contains<&C>` is not satisfied
|
||||
--> $DIR/issue-85848.rs:24:5
|
||||
|
|
||||
LL | writes_to_specific_path(&cap);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^ the trait `_Contains<&C>` is not implemented for `()`
|
||||
...
|
||||
LL | fn writes_to_specific_path<C: Delegates<()>>(cap: &C) {}
|
||||
| ------------- required by this bound in `writes_to_specific_path`
|
||||
|
|
||||
note: required because of the requirements on the impl of `Contains<(), true>` for `&C`
|
||||
--> $DIR/issue-85848.rs:21:12
|
||||
|
|
||||
LL | impl<T, U> Contains<T, { contains::<T, U>() }> for U where T: _Contains<U> {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^
|
||||
note: required because of the requirements on the impl of `Delegates<()>` for `&C`
|
||||
--> $DIR/issue-85848.rs:12:12
|
||||
|
|
||||
LL | impl<T, U> Delegates<U> for T where T: Contains<U, true> {}
|
||||
| ^^^^^^^^^^^^ ^
|
||||
|
||||
error: unconstrained generic constant
|
||||
--> $DIR/issue-85848.rs:24:5
|
||||
|
|
||||
LL | writes_to_specific_path(&cap);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^
|
||||
...
|
||||
LL | fn writes_to_specific_path<C: Delegates<()>>(cap: &C) {}
|
||||
| ------------- required by this bound in `writes_to_specific_path`
|
||||
|
|
||||
= help: try adding a `where` bound using this expression: `where [(); { contains::<T, U>() }]:`
|
||||
note: required because of the requirements on the impl of `Contains<(), true>` for `&C`
|
||||
--> $DIR/issue-85848.rs:21:12
|
||||
|
|
||||
LL | impl<T, U> Contains<T, { contains::<T, U>() }> for U where T: _Contains<U> {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^
|
||||
note: required because of the requirements on the impl of `Delegates<()>` for `&C`
|
||||
--> $DIR/issue-85848.rs:12:12
|
||||
|
|
||||
LL | impl<T, U> Delegates<U> for T where T: Contains<U, true> {}
|
||||
| ^^^^^^^^^^^^ ^
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0277`.
|
Loading…
Add table
Add a link
Reference in a new issue