RFR: [type-classes] Initial work to enable type-classes mediated operator support [v2]

Joe Darcy darcy at openjdk.org
Sat Jan 24 03:49:24 UTC 2026


On Fri, 23 Jan 2026 10:52:12 GMT, Maurizio Cimadamore <mcimadamore at openjdk.org> wrote:

>> This PR adds experimental support for type-class based operator resolution. This means that it is possible to define classes that "witness" some numerical type class, like so:
>> 
>> 
>> record Box(int i) {
>>    __witness Integral<Box> INTEGRAL = ...
>> }
>> 
>> 
>> Then, we can start using `Box` in e.g. binary operations, like so:
>> 
>> 
>> Box one = new Box(1);
>> Box two = new Box(2);
>> one + two // three
>> 
>> 
>> In order to support type-class mediated operator resolution, we needed to add a new kind of operator helper in `Operators`. These new operator helpers (one for unary operators, one for binary operators) wrap some method in one of the standard numeric classes -- for instance, type class `+` is realized through `Numerical::add`, and so forth.
>> 
>> There's a new kind of operator symbol, namely `TypeClassOperatorSymbol` which is used to store the type of the operation as well as the method symbol in charge of performing the operation.
>> 
>> To resolve an operator, we basically have to prove that a witness for the corresponding class, parameterized by the operand type exists. E.g. in the above, we need to find a witness for `Numerical<Box>`.
>> 
>> During lowering, we emit such witness, and call the correct operator method on it.
>> 
>> Note that support for assignment operators is also provided -- `Lower` already has logic to lower some assignment operators into plain binary operations, so we just leverage that support to translate type-class based assignment ops.
>
> Maurizio Cimadamore has updated the pull request incrementally with one additional commit since the last revision:
> 
>   Test cleanup

@mcimadamore , what are the conditions to allow to a class to participate in having a witness, is being a value class sufficient?

I was working on update Bfloat16 to have a witness for StandardFloatingPoint, but the client code wasn't recognizing the operators as valid for Bfloat16 arguments. Perhaps recognizing as allowing both Numerical and Orderable operators isn't work yet.

After switching to a Numerical witness in a Bfloat16 value class, the code was accepted by the compiler, but ran into VerifyErrors at runtime. I'll send you more information off-list. Thanks.

-------------

PR Comment: https://git.openjdk.org/valhalla/pull/1948#issuecomment-3793696428


More information about the valhalla-dev mailing list