ml-kem-0.2.1 incorrect overflow error (original) (raw)
the crate ml-kem-0.2.1 compiles with the old solver but errors with new
error[E0275]: overflow evaluating the requirement <P as PkeParams>::NttVectorSize == _
--> src/param.rs:206:26
|
206 | type NttVectorSize = EncodedPolynomialVectorSize<U12, P::K>;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: consider increasing the recursion limit by adding a #![recursion_limit = "256"] attribute to your crate (ml_kem)
relies on rust-lang/rust#147266 to avoid an ICE.
It's got some very cursed where-clauses, here's a self-contained (only typenum) example:
use typenum::*; use std::ops::{Add, Div, Mul, Rem, Sub}; pub trait ParameterSet { type K; type Du: VectorEncodingSizeSelf::K; type Dv: EncodingSize; }
pub trait EncodingSize { type EncodedPolynomialSize; type ValueStep; type ByteStep; } impl EncodingSize for D where D: Mul + Gcd + Mul, Prod<D, U8>: Div<Gcf<D, U8>>, EncodingUnit: Div + Div, { type EncodedPolynomialSize = Prod<D, U32>; type ValueStep = Quot<EncodingUnit, D>; type ByteStep = Quot<EncodingUnit, U8>; }
pub trait VectorEncodingSize: EncodingSize { type EncodedPolynomialVectorSize; } impl<D, K> VectorEncodingSize for D where D: EncodingSize, D::EncodedPolynomialSize: Mul, Prod<D::EncodedPolynomialSize, K>: Div<K, Output = D::EncodedPolynomialSize> + Rem<K, Output = U0>, { type EncodedPolynomialVectorSize = Prod<D::EncodedPolynomialSize, K>; }
type EncodingUnit = Quot<Prod<D, U8>, Gcf<D, U8>>; pub type EncodedPolynomialVectorSize<D, K> = <D as VectorEncodingSize>::EncodedPolynomialVectorSize; pub type EncodedPolynomialSize = ::EncodedPolynomialSize; type EncodedUSize
= EncodedPolynomialVectorSize<
::Du,
::K>; type EncodedVSize
= EncodedPolynomialSize<
::Dv>;
fn foo
() where P: ParameterSet, U384: Mul<P::K>, Prod<U384, P::K>: Add + Div<P::K, Output = U384> + Rem<P::K, Output = U0>, EncodedUSize
: Add<EncodedVSize
>, Sum<EncodedUSize
, EncodedVSize
>: Sub<EncodedUSize
, Output = EncodedVSize
>, EncodedPolynomialVectorSize<U12, P::K>: Add, Sum<EncodedPolynomialVectorSize<U12, P::K>, U32>: Sub<EncodedPolynomialVectorSize<U12, P::K>, Output = U32>, { } fn main() {}