It doesn't seem to be specific to type `size_t` - it also happens with other native types such as `int`.
Shorter example: ➜ sub a (int $a) { Blob[int].new($a) }; say a 12; Type check failed in initializing element #0 to Blob[int]; expected int but got Int (12) Examples that *don't* fail: ➜ sub a (int $a is copy) { Blob[int].new($a) }; say a 12; Blob[int]:0x<0c> ➜ sub a (Int $a) { Blob[int].new($a) }; say a 12; Blob[int]:0x<0c> ➜ my int $a = 12; say Blob[int].new($a); Blob[int]:0x<0c> I think it's safe to say that in all four cases, `$a` gets boxed to an `Int`. But in the first case, it's as if the Blob constructor nonetheless uses the code path for `int` and subsequently gets surprised. Maybe the `int $a` signature leads the compiler to think that it will always be an `int`?