# New Ticket Created by Elizabeth Mattijsen # Please include the string: [perl #128655] # in the subject line of all future correspondence about this issue. # <URL: https://rt.perl.org/Ticket/Display.html?id=128655 >
m: Buf.new((my int $i = 10) +& 0xFF) Type check failed in initializing element #0 to Buf; expected uint8 but got Int (10) in any at gen/moar/m-Metamodel.nqp line 1736 in block <unit> at <tmp> line 1 Actually thrown at: in any at gen/moar/m-Metamodel.nqp line 3055 in an… On further inspection, it appears that the value found in the argument list is a BOOTInt, rather than an Int, and that fails the nqp::istype($a,Int) test. It *feels* like it calling the int/int candidate, when it thinks it's calling the Int:D/Int:D candidate. Since the int/int candidate returns an int, but the optimizer probably thinks it is getting an Int, the native is not marshalled into an Int when it should. This bug probably existed for a long time already, but was uncovered by de5d9e70cbfe678d2371d284 . Before, going through all of the iterator stuff, would marshall the int into an Int It appears that all bitwise operators that return an int/Int have the same problem with the calling them with a native parameter. The problem goes away if optimizing is somehow inhibited, but that, I feel, is just masking the problem. Ways of stopping optimization are: - calling perl6 with —optimize=0 or —optimize=1 - adding an nqp::null to the native int candidate multi sub infix:<+&>(Int:D \a, Int:D \b) { nqp::bitand_I(nqp::decont(a), nqp::decont(b), Int) } multi sub infix:<+&>(int $a, int $b) { nqp::null; # stops optimization nqp::bitand_i($a, $b) } Note that the problem gets fixed by adding an optimizer stopper to the candidate that is *not* being called, as 0xFF is an Int, and thus int $i +& 0xFF is calling the Int:D/Int:D candidate!! Since this idiom is quite normal, a quick fix seems in order.