# New Ticket Created by Colin Kuskie # Please include the string: [perl #44979] # in the subject line of all future correspondence about this issue. # <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=44979 >
While developing a return statement for NQP, I came across this error from TGE: Nonlinear attribute: you have two or more ways to assign a value to the attribute 'post' on node type 'PAST::Op' with rule name '_PAST::Op_post' near grammar line There's no line number. The error comes from code near line 253 in compilers/tge/TGE/Tree.pir. $P7 = getattribute rule, "line" print $P7 print "\n" Attached is a patch against NQP to duplicate this bug. SVN rev: 20865 Platform: FC7/x86 To reproduce: patch -p0 < tge_error.diff cd languages/nqp make ../../parrot nqp.pbc t/10-sub.t
Index: languages/nqp/t/10-sub.t =================================================================== --- languages/nqp/t/10-sub.t (revision 20865) +++ languages/nqp/t/10-sub.t (working copy) @@ -1,6 +1,6 @@ #!./parrot -say('1..10'); +say('1..11'); sub one ( ) { say("ok 1 # sub def and call"); @@ -67,3 +67,11 @@ print("not "); } say("ok 10 # subroutines that operate on args do not affect the original arg outside the sub"); + +sub giveBack () { + return(1); + my $retVal := 2; +} + +my $trial := giveBack(); +ok( $trial == 1, 'Checking return statement #1'); Index: languages/nqp/src/Grammar/Actions.pir =================================================================== --- languages/nqp/src/Grammar/Actions.pir (revision 20865) +++ languages/nqp/src/Grammar/Actions.pir (working copy) @@ -156,7 +156,25 @@ .return (past) .end +## method return_statement($/) { +## my $past := PAST::Op.new($($<EXPR>), +## pasttype => $<sym>, +## node => $/); +## } +## return $past; +.sub 'return_statement' :method + .param pmc match + .local pmc past + $P0 = match['EXPR'] + $P0 = $P0.'get_scalar'() + $P2 = getclass 'PAST::Op' + #$S1 = match['sym'] + $S1 = 'tailcall' + past = $P2.'new'($P0, 'pasttype'=>$S1, 'node'=>match) + .return (past) +.end + ## method block($/, $key) { ## our $?BLOCK, @?BLOCK; ## if ($key ne 'close') {