use v6; use Test; plan 8; is($?POSITION, "$?FILE line 7, column 4-14", 'plain old $?POSITION'); sub foo { return "$?CALLER::POSITION" } sub bar { gorch("$?CALLER::POSITION") } sub gorch (Str $str) { return $str } is(foo(), "$?FILE line 13, column 4-9", "basic caller position interpolation"); # in the second test case the position is evaluated where gorch is concerned # this, bar's call to gorch(). # the variable is interpolated in bar(), and that's where in the call stack # this should be relevant to. is(bar(), "$?FILE line 20, column 4-9", "indirect interpolation (wtf?!)"); sub inner { return join("\n", $?CALLER::CALLER::CALLER::POSITION, $?CALLER::CALLER::POSITION, $?CALLER::POSITION) } sub outer { inner() } sub very { outer() } is(very(), "$?FILE line 26, column 4-10\n$?FILE line 24, column 13-21\n$?FILE line 23, column 13-21", "caller::caller notation works"); ok(!(eval '$CALLER::CALLER::CALLER::_; 1'), "can't look beyond top level caller"); sub inner2 { #line 32 return join("\n", $?CALLER::CALLER::CALLER::POSITION, $?CALLER::CALLER::POSITION, $?CALLER::POSITION) } sub outer2 { #line 36 inner2() } sub very2 { #line 40 outer2() } # Are the lines/columns right here? is(very2(), "$?FILE line 44, column 4-11\n$?FILE line 40, column 3 - line 41, column 1\n$?FILE line 36, column 3 - line 37, column 1", "caller::caller notation works across multiple lines"); sub line_set { return "$?CALLER::POSITION" }; #line 666 sub get_line { return line_set }; is(get_line, "$?FILE line 666, column 23-32", "#line works for caller::caller notation"); sub line_set2 { return "$?CALLER::POSITION" } #line 666 sub get_line2 { return line_set2 }; is(get_line2, "$?FILE line 666, column 24-34", "#line works for caller::caller notation");