# New Ticket Created by Zefram # Please include the string: [perl #126116] # in the subject line of all future correspondence about this issue. # <URL: https://rt.perl.org/Ticket/Display.html?id=126116 >
Because a type object is an (undefined) instance of that type, it can in general be stored in a variable constrained to that type. We can demonstrate this with a subroutine taking a type parameter: $ ./perl6 -e 'sub aa (Mu:U ::T) { my T $a = T; say $a; }; aa(Any); aa(Int); aa(int)' (Any) (Int) (int) But if we try to do the same thing without the indirection of the subroutine, it behaves differently on native types: $ ./perl6 -e 'my Any $a = Any; say $a; my Int $b = Int; say $b; my int $c = int; say $c' (Any) (Int) Cannot unbox a type object in block <unit> at -e:1 This indirection shouldn't make such a visible difference. Obviously there's some connection here to the specialised representation implied by the int type, and the fact that that representation can't accommodate the int type object. It's fine for the specialised representation to be used in only one of these two cases, but that should be an invisible implementation detail. Perhaps the specialised representation should only be used where the variable is constrained to *defined* ints. Another inconsistency arises in how assignment of a boxed value to the variable is treated: $ ./perl6 -e 'sub aa (Mu:U ::T) { my T $a = 3; say $a.WHAT; }; aa(Any); aa(Int); aa(int)' (Int) (Int) Type check failed in assignment to '$a'; expected 'int' but got 'Int' in sub aa at -e:1 in block <unit> at -e:1 $ ./perl6 -e 'my Any $a = 3; say $a.WHAT; my Int $b = 3; say $b.WHAT; my int $c = 3; say $c.WHAT' (Int) (Int) (Int) -zefram