support as _
and add tests
This commit is contained in:
parent
c318364d48
commit
17cd79090e
6 changed files with 220 additions and 3 deletions
|
@ -431,7 +431,9 @@ impl<'a, 'tcx> AbstractConstBuilder<'a, 'tcx> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// These are not actually relevant for us here, so we can ignore them.
|
// These are not actually relevant for us here, so we can ignore them.
|
||||||
StatementKind::StorageLive(_) | StatementKind::StorageDead(_) => Ok(()),
|
StatementKind::AscribeUserType(..)
|
||||||
|
| StatementKind::StorageLive(_)
|
||||||
|
| StatementKind::StorageDead(_) => Ok(()),
|
||||||
_ => self.error(Some(stmt.source_info.span), "unsupported statement")?,
|
_ => self.error(Some(stmt.source_info.span), "unsupported statement")?,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,7 @@ struct Foo<const N: u8>([u8; N as usize])
|
||||||
where
|
where
|
||||||
[(); N as usize]:;
|
[(); N as usize]:;
|
||||||
|
|
||||||
|
struct Bar<const N: u8>([u8; (N + 2) as usize]) where [(); (N + 2) as usize]:;
|
||||||
|
|
||||||
// unifying with subtrees
|
// unifying with subtrees
|
||||||
struct Evaluatable<const N: u16>;
|
struct Evaluatable<const N: u16>;
|
||||||
|
@ -13,6 +14,5 @@ fn foo<const N: u8>() where Evaluatable<{N as usize as u16 }>: {
|
||||||
let _ = Foo::<N>([1; N as usize]);
|
let _ = Foo::<N>([1; N as usize]);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Bar<const N: u8>([u8; (N + 2) as usize]) where [(); (N + 2) as usize]:;
|
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
|
@ -14,7 +14,7 @@ struct Foo2<const N: u8>(Evaluatable::<{N as u128}>) where Evaluatable<{N as usi
|
||||||
//~| help: try adding a `where` bound using this expression: `where [(); {N as u128}]:`
|
//~| help: try adding a `where` bound using this expression: `where [(); {N as u128}]:`
|
||||||
|
|
||||||
struct Bar<const N: u8>([u8; (N + 2) as usize]) where [(); (N + 1) as usize]:;
|
struct Bar<const N: u8>([u8; (N + 2) as usize]) where [(); (N + 1) as usize]:;
|
||||||
//~^ unconstrained generic constant
|
//~^ Error: unconstrained generic constant
|
||||||
//~| help: try adding a `where` bound using this expression: `where [(); (N + 2) as usize]:`
|
//~| help: try adding a `where` bound using this expression: `where [(); (N + 2) as usize]:`
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
#![feature(const_generics, const_evaluatable_checked)]
|
||||||
|
#![allow(incomplete_features)]
|
||||||
|
|
||||||
|
trait Trait {}
|
||||||
|
pub struct EvaluatableU128<const N: u128>;
|
||||||
|
|
||||||
|
struct HasCastInTraitImpl<const N: usize, const M: u128>;
|
||||||
|
impl<const O: usize> Trait for HasCastInTraitImpl<O, { O as u128 }> {}
|
||||||
|
|
||||||
|
pub fn use_trait_impl<const N: usize>()
|
||||||
|
where
|
||||||
|
[(); { N + 1}]:,
|
||||||
|
EvaluatableU128<{N as u128}>:, {
|
||||||
|
fn assert_impl<T: Trait>() {}
|
||||||
|
|
||||||
|
// errors are bad but seems to be pre-existing issue #86198
|
||||||
|
assert_impl::<HasCastInTraitImpl<{ N + 1 }, { N as u128 }>>();
|
||||||
|
//~^ Error: mismatched types
|
||||||
|
//~^^ Error: unconstrained generic constant
|
||||||
|
assert_impl::<HasCastInTraitImpl<{ N + 1 }, { N as _ }>>();
|
||||||
|
//~^ Error: mismatched types
|
||||||
|
//~^^ Error: unconstrained generic constant
|
||||||
|
assert_impl::<HasCastInTraitImpl<13, { 12 as u128 }>>();
|
||||||
|
//~^ Error: mismatched types
|
||||||
|
assert_impl::<HasCastInTraitImpl<14, 13>>();
|
||||||
|
//~^ Error: mismatched types
|
||||||
|
}
|
||||||
|
pub fn use_trait_impl_2<const N: usize>()
|
||||||
|
where
|
||||||
|
[(); { N + 1}]:,
|
||||||
|
EvaluatableU128<{N as _}>:, {
|
||||||
|
fn assert_impl<T: Trait>() {}
|
||||||
|
|
||||||
|
// errors are bad but seems to be pre-existing issue #86198
|
||||||
|
assert_impl::<HasCastInTraitImpl<{ N + 1 }, { N as u128 }>>();
|
||||||
|
//~^ Error: mismatched types
|
||||||
|
//~^^ Error: unconstrained generic constant
|
||||||
|
assert_impl::<HasCastInTraitImpl<{ N + 1 }, { N as _ }>>();
|
||||||
|
//~^ Error: mismatched types
|
||||||
|
//~^^ Error: unconstrained generic constant
|
||||||
|
assert_impl::<HasCastInTraitImpl<13, { 12 as u128 }>>();
|
||||||
|
//~^ Error: mismatched types
|
||||||
|
assert_impl::<HasCastInTraitImpl<14, 13>>();
|
||||||
|
//~^ Error: mismatched types
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
|
@ -0,0 +1,139 @@
|
||||||
|
error: unconstrained generic constant
|
||||||
|
--> $DIR/abstract-const-as-cast-3.rs:17:5
|
||||||
|
|
|
||||||
|
LL | fn assert_impl<T: Trait>() {}
|
||||||
|
| ----- required by this bound in `use_trait_impl::assert_impl`
|
||||||
|
...
|
||||||
|
LL | assert_impl::<HasCastInTraitImpl<{ N + 1 }, { N as u128 }>>();
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= help: try adding a `where` bound using this expression: `where [(); { O as u128 }]:`
|
||||||
|
note: required because of the requirements on the impl of `Trait` for `HasCastInTraitImpl<{ N + 1 }, { N as u128 }>`
|
||||||
|
--> $DIR/abstract-const-as-cast-3.rs:8:22
|
||||||
|
|
|
||||||
|
LL | impl<const O: usize> Trait for HasCastInTraitImpl<O, { O as u128 }> {}
|
||||||
|
| ^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error[E0308]: mismatched types
|
||||||
|
--> $DIR/abstract-const-as-cast-3.rs:17:5
|
||||||
|
|
|
||||||
|
LL | assert_impl::<HasCastInTraitImpl<{ N + 1 }, { N as u128 }>>();
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `{ N as u128 }`, found `{ O as u128 }`
|
||||||
|
|
|
||||||
|
= note: expected type `{ N as u128 }`
|
||||||
|
found type `{ O as u128 }`
|
||||||
|
|
||||||
|
error: unconstrained generic constant
|
||||||
|
--> $DIR/abstract-const-as-cast-3.rs:20:5
|
||||||
|
|
|
||||||
|
LL | fn assert_impl<T: Trait>() {}
|
||||||
|
| ----- required by this bound in `use_trait_impl::assert_impl`
|
||||||
|
...
|
||||||
|
LL | assert_impl::<HasCastInTraitImpl<{ N + 1 }, { N as _ }>>();
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= help: try adding a `where` bound using this expression: `where [(); { O as u128 }]:`
|
||||||
|
note: required because of the requirements on the impl of `Trait` for `HasCastInTraitImpl<{ N + 1 }, { N as _ }>`
|
||||||
|
--> $DIR/abstract-const-as-cast-3.rs:8:22
|
||||||
|
|
|
||||||
|
LL | impl<const O: usize> Trait for HasCastInTraitImpl<O, { O as u128 }> {}
|
||||||
|
| ^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error[E0308]: mismatched types
|
||||||
|
--> $DIR/abstract-const-as-cast-3.rs:20:5
|
||||||
|
|
|
||||||
|
LL | assert_impl::<HasCastInTraitImpl<{ N + 1 }, { N as _ }>>();
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `{ N as _ }`, found `{ O as u128 }`
|
||||||
|
|
|
||||||
|
= note: expected type `{ N as _ }`
|
||||||
|
found type `{ O as u128 }`
|
||||||
|
|
||||||
|
error[E0308]: mismatched types
|
||||||
|
--> $DIR/abstract-const-as-cast-3.rs:23:5
|
||||||
|
|
|
||||||
|
LL | assert_impl::<HasCastInTraitImpl<13, { 12 as u128 }>>();
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `12_u128`, found `13_u128`
|
||||||
|
|
|
||||||
|
= note: expected type `12_u128`
|
||||||
|
found type `13_u128`
|
||||||
|
|
||||||
|
error[E0308]: mismatched types
|
||||||
|
--> $DIR/abstract-const-as-cast-3.rs:25:5
|
||||||
|
|
|
||||||
|
LL | assert_impl::<HasCastInTraitImpl<14, 13>>();
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `13_u128`, found `14_u128`
|
||||||
|
|
|
||||||
|
= note: expected type `13_u128`
|
||||||
|
found type `14_u128`
|
||||||
|
|
||||||
|
error: unconstrained generic constant
|
||||||
|
--> $DIR/abstract-const-as-cast-3.rs:35:5
|
||||||
|
|
|
||||||
|
LL | fn assert_impl<T: Trait>() {}
|
||||||
|
| ----- required by this bound in `use_trait_impl_2::assert_impl`
|
||||||
|
...
|
||||||
|
LL | assert_impl::<HasCastInTraitImpl<{ N + 1 }, { N as u128 }>>();
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= help: try adding a `where` bound using this expression: `where [(); { O as u128 }]:`
|
||||||
|
note: required because of the requirements on the impl of `Trait` for `HasCastInTraitImpl<{ N + 1 }, { N as u128 }>`
|
||||||
|
--> $DIR/abstract-const-as-cast-3.rs:8:22
|
||||||
|
|
|
||||||
|
LL | impl<const O: usize> Trait for HasCastInTraitImpl<O, { O as u128 }> {}
|
||||||
|
| ^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error[E0308]: mismatched types
|
||||||
|
--> $DIR/abstract-const-as-cast-3.rs:35:5
|
||||||
|
|
|
||||||
|
LL | assert_impl::<HasCastInTraitImpl<{ N + 1 }, { N as u128 }>>();
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `{ N as u128 }`, found `{ O as u128 }`
|
||||||
|
|
|
||||||
|
= note: expected type `{ N as u128 }`
|
||||||
|
found type `{ O as u128 }`
|
||||||
|
|
||||||
|
error: unconstrained generic constant
|
||||||
|
--> $DIR/abstract-const-as-cast-3.rs:38:5
|
||||||
|
|
|
||||||
|
LL | fn assert_impl<T: Trait>() {}
|
||||||
|
| ----- required by this bound in `use_trait_impl_2::assert_impl`
|
||||||
|
...
|
||||||
|
LL | assert_impl::<HasCastInTraitImpl<{ N + 1 }, { N as _ }>>();
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= help: try adding a `where` bound using this expression: `where [(); { O as u128 }]:`
|
||||||
|
note: required because of the requirements on the impl of `Trait` for `HasCastInTraitImpl<{ N + 1 }, { N as _ }>`
|
||||||
|
--> $DIR/abstract-const-as-cast-3.rs:8:22
|
||||||
|
|
|
||||||
|
LL | impl<const O: usize> Trait for HasCastInTraitImpl<O, { O as u128 }> {}
|
||||||
|
| ^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error[E0308]: mismatched types
|
||||||
|
--> $DIR/abstract-const-as-cast-3.rs:38:5
|
||||||
|
|
|
||||||
|
LL | assert_impl::<HasCastInTraitImpl<{ N + 1 }, { N as _ }>>();
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `{ N as _ }`, found `{ O as u128 }`
|
||||||
|
|
|
||||||
|
= note: expected type `{ N as _ }`
|
||||||
|
found type `{ O as u128 }`
|
||||||
|
|
||||||
|
error[E0308]: mismatched types
|
||||||
|
--> $DIR/abstract-const-as-cast-3.rs:41:5
|
||||||
|
|
|
||||||
|
LL | assert_impl::<HasCastInTraitImpl<13, { 12 as u128 }>>();
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `12_u128`, found `13_u128`
|
||||||
|
|
|
||||||
|
= note: expected type `12_u128`
|
||||||
|
found type `13_u128`
|
||||||
|
|
||||||
|
error[E0308]: mismatched types
|
||||||
|
--> $DIR/abstract-const-as-cast-3.rs:43:5
|
||||||
|
|
|
||||||
|
LL | assert_impl::<HasCastInTraitImpl<14, 13>>();
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `13_u128`, found `14_u128`
|
||||||
|
|
|
||||||
|
= note: expected type `13_u128`
|
||||||
|
found type `14_u128`
|
||||||
|
|
||||||
|
error: aborting due to 12 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0308`.
|
|
@ -0,0 +1,29 @@
|
||||||
|
// check-pass
|
||||||
|
#![feature(const_evaluatable_checked, const_generics)]
|
||||||
|
#![allow(incomplete_features)]
|
||||||
|
|
||||||
|
trait Trait {}
|
||||||
|
pub struct EvaluatableU128<const N: u128>;
|
||||||
|
|
||||||
|
struct HasCastInTraitImpl<const N: usize, const M: u128>;
|
||||||
|
impl<const O: usize> Trait for HasCastInTraitImpl<O, { O as u128 }> {}
|
||||||
|
|
||||||
|
pub fn use_trait_impl<const N: usize>() where EvaluatableU128<{N as u128}>:, {
|
||||||
|
fn assert_impl<T: Trait>() {}
|
||||||
|
|
||||||
|
assert_impl::<HasCastInTraitImpl<N, { N as u128 }>>();
|
||||||
|
assert_impl::<HasCastInTraitImpl<N, { N as _ }>>();
|
||||||
|
assert_impl::<HasCastInTraitImpl<12, { 12 as u128 }>>();
|
||||||
|
assert_impl::<HasCastInTraitImpl<13, 13>>();
|
||||||
|
}
|
||||||
|
pub fn use_trait_impl_2<const N: usize>() where EvaluatableU128<{N as _}>:, {
|
||||||
|
fn assert_impl<T: Trait>() {}
|
||||||
|
|
||||||
|
assert_impl::<HasCastInTraitImpl<N, { N as u128 }>>();
|
||||||
|
assert_impl::<HasCastInTraitImpl<N, { N as _ }>>();
|
||||||
|
assert_impl::<HasCastInTraitImpl<12, { 12 as u128 }>>();
|
||||||
|
assert_impl::<HasCastInTraitImpl<13, 13>>();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fn main() {}
|
Loading…
Add table
Add a link
Reference in a new issue