So I thought I would fix that Gmp.mpz(3)%2 has the type mixed. My first quick and dirty fix was to update the type of `% a bit by adding
tFunc(tObjIs_GMP_MPZ tInt, tObjIs_GMP_MPZ)
Yes, it ignores the int%mpz and mpz%mpz permutations, but it's a start. Not the right one apparently, as I got the following warning when trying it out on Crypto.Random.
The code
Gmp.mpz random(int top) { return Gmp.mpz(rnd_func( (int)ceil(Math.log2(top)) ), 256) % top; }
generates
Warning: Wong return type. Warning: Expected: { mpz = object(implements _static_modules.Gmp()->mpz) }. Warning: Got : object(is _static_modules.Gmp()->mpz) | mixed.
Why is there a "| mixed" in this type?
You probably need to add a tIfNot (or modifying the existing) for the generic case so that it doesn't match.
Is this at all the correct approach?
Looks like it.
A nicer approach would of course be to add support for LFUN-expansions to the type system.
Can we get nicer names than _static_modules.Gmp()->mpz?
That's just a question of modifying the master.