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() {}