# 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

Reply via email to