--- /dev/null
+#!perl -T
+
+use strict;
+use warnings;
+
+use Test::More tests => 2 + 3 * 4 + 5 * 2
+ + 2 + 3 * 2 + 5 * 2
+ + 2 + 3 * 4 + 5 * 2;
+
+our $calls;
+
+sub Int::TYPEDSCALAR { ++$calls; (caller(0))[2] }
+
+{
+ use Lexical::Types;
+
+ {
+ my $desc = 'single uninit';
+ local $calls = 0;
+ my Int $x;
+ is $calls, 1, "$desc: correct number of calls";
+ is $x, __LINE__-2, "$desc: initialized correctly";
+ }
+
+ {
+ my $desc = 'double uninit';
+ local $calls = 0;
+ my Int ($x, $y);
+ is $calls, 2, "$desc: correct number of calls";
+ is $x, __LINE__-2, "$desc: initialized \$x correctly";
+ is $y, __LINE__-3, "$desc: initialized \$y correctly";
+ }
+
+ {
+ my $desc = 'double uninit with undef begin';
+ local $calls = 0;
+ my Int (undef, $x, $y);
+ is $calls, 2, "$desc: correct number of calls";
+ is $x, __LINE__-2, "$desc: initialized \$x correctly";
+ is $y, __LINE__-3, "$desc: initialized \$y correctly";
+ }
+
+ {
+ my $desc = 'double uninit with undef middle';
+ local $calls = 0;
+ my Int ($x, undef, $y);
+ is $calls, 2, "$desc: correct number of calls";
+ is $x, __LINE__-2, "$desc: initialized \$x correctly";
+ is $y, __LINE__-3, "$desc: initialized \$y correctly";
+ }
+
+ {
+ my $desc = 'double uninit with undef end';
+ local $calls = 0;
+ my Int ($x, undef, $y);
+ is $calls, 2, "$desc: correct number of calls";
+ is $x, __LINE__-2, "$desc: initialized \$x correctly";
+ is $y, __LINE__-3, "$desc: initialized \$y correctly";
+ }
+
+ {
+ my $desc = 'quadruple uninit with parens';
+ local $calls = 0;
+ my Int ($x, ($y, $z), $t);
+ is $calls, 4, "$desc: correct number of calls";
+ is $x, __LINE__-2, "$desc: initialized \$x correctly";
+ is $y, __LINE__-3, "$desc: initialized \$y correctly";
+ is $z, __LINE__-4, "$desc: initialized \$z correctly";
+ is $t, __LINE__-5, "$desc: initialized \$t correctly";
+ }
+
+ {
+ my $desc = 'quadruple uninit with parens and undef';
+ local $calls = 0;
+ my Int ($x, undef, ($y, undef, $z), undef, $t);
+ is $calls, 4, "$desc: correct number of calls";
+ is $x, __LINE__-2, "$desc: initialized \$x correctly";
+ is $y, __LINE__-3, "$desc: initialized \$y correctly";
+ is $z, __LINE__-4, "$desc: initialized \$z correctly";
+ is $t, __LINE__-5, "$desc: initialized \$t correctly";
+ }
+
+ {
+ my $desc = 'single init';
+ local $calls = 0;
+ my Int $x = 'x';
+ is $calls, 1, "$desc: correct number of calls";
+ is $x, 'x', "$desc: initialized correctly";
+ }
+
+ {
+ my $desc = 'double init';
+ local $calls = 0;
+ my Int ($x, $y) = ('x', 'y');
+ is $calls, 2, "$desc: correct number of calls";
+ is $x, 'x', "$desc: initialized \$x correctly";
+ is $y, 'y', "$desc: initialized \$y correctly";
+ }
+
+ {
+ my $desc = 'double partial init';
+ local $calls = 0;
+ my Int ($x, undef, $y) = ('x');
+ is $calls, 2, "$desc: correct number of calls";
+ is $x, 'x', "$desc: initialized \$x correctly";
+ is $y, undef, "$desc: initialized \$y correctly";
+ }
+
+ {
+ my $desc = 'quadruple init with parens';
+ local $calls = 0;
+ my Int ($x, ($y, $z), $t) = ('x', 'y');
+ is $calls, 4, "$desc: correct number of calls";
+ is $x, 'x', "$desc: initialized \$x correctly";
+ is $y, 'y', "$desc: initialized \$y correctly";
+ is $z, undef, "$desc: initialized \$z correctly";
+ is $t, undef, "$desc: initialized \$t correctly";
+ }
+
+ {
+ my $desc = 'quadruple init with parens and undef';
+ local $calls = 0;
+ my Int ($x, ($y, undef, $z), $t) = ('x', 'y');
+ is $calls, 4, "$desc: correct number of calls";
+ is $x, 'x', "$desc: initialized \$x correctly";
+ is $y, 'y', "$desc: initialized \$y correctly";
+ is $z, undef, "$desc: initialized \$z correctly";
+ is $t, undef, "$desc: initialized \$t correctly";
+ }
+
+ {
+ my $desc = 'for';
+ local $calls = 0;
+ for my Int $x (0) {
+ is $calls, 0, "$desc: correct number of calls";
+ is $x, 0, "$desc: initialized correctly";
+ }
+ }
+
+ {
+ my $desc = 'argument list';
+ local $calls = 0;
+ sub {
+ my Int ($x, $y) = @_;
+ is $calls, 2, "$desc: correct number of calls";
+ is $x, 'x', "$desc: initialized \$x correctly";
+ is $y, 'y', "$desc: initialized \$y correctly";
+ }->('x', 'y');
+ }
+
+ {
+ my $desc = 'argument list with undef begin';
+ local $calls = 0;
+ sub {
+ my Int (undef, $x, $y) = @_;
+ is $calls, 2, "$desc: correct number of calls";
+ is $x, 'y', "$desc: initialized \$x correctly";
+ is $y, undef, "$desc: initialized \$y correctly";
+ }->('x', 'y');
+ }
+
+ {
+ my $desc = 'argument list with undef middle';
+ local $calls = 0;
+ sub {
+ my Int ($x, undef, $y) = @_;
+ is $calls, 2, "$desc: correct number of calls";
+ is $x, 'x', "$desc: initialized \$x correctly";
+ is $y, undef, "$desc: initialized \$y correctly";
+ }->('x', 'y');
+ }
+
+ {
+ my $desc = 'argument list with undef end';
+ local $calls = 0;
+ sub {
+ my Int ($x, $y, undef) = @_;
+ is $calls, 2, "$desc: correct number of calls";
+ is $x, 'x', "$desc: initialized \$x correctly";
+ is $y, 'y', "$desc: initialized \$y correctly";
+ }->('x', 'y');
+ }
+
+ {
+ my $desc = 'argument list with parens';
+ local $calls = 0;
+ sub {
+ my Int ($x, ($y, $z), $t) = @_;
+ is $calls, 4, "$desc: correct number of calls";
+ is $x, 'x', "$desc: initialized \$x correctly";
+ is $y, 'y', "$desc: initialized \$y correctly";
+ is $z, 'z', "$desc: initialized \$z correctly";
+ is $t, 't', "$desc: initialized \$t correctly";
+ }->('x', 'y', 'z', 't');
+ }
+
+ {
+ my $desc = 'argument list with parens';
+ local $calls = 0;
+ sub {
+ my Int ($x, ($y, undef, $z), $t) = @_;
+ is $calls, 4, "$desc: correct number of calls";
+ is $x, 'x', "$desc: initialized \$x correctly";
+ is $y, 'y', "$desc: initialized \$y correctly";
+ is $z, 'z', "$desc: initialized \$z correctly";
+ is $t, undef, "$desc: initialized \$t correctly";
+ }->('x', 'y', 'foo', 'z');
+ }
+}