------- Comment #3 from P dot Schaffnit at access dot rwth-aachen dot de 2006-04-12 15:02 ------- Subject: Re: Incorrect dependency for assignment from functionwith array section actual arg.
Merci! Philippe paul dot richard dot thomas at cea dot fr wrote: > > ------- Comment #2 from paul dot richard dot thomas at cea dot fr 2006-04-12 > 14:34 ------- > I have a fix for it, which is regtesting right now. Even if it fails in this > form, it is along the right lines and there will be a version that is pukkah. > I > hope to submit the patch tonight. > > Quite simply, the fix consists of gathering up all the argument post_blocks, > which contain the unpacking and freeing of argument temporaries, and putting > them into a separate block. Once the function call is translated, it either > goes in the se->pre block or becomes the se expression, depending on how the > value is returned. Depending on this same choice, we now add the argument > post > block to se->pre or to se->post. This ensures that the results of byref calls > that produce temporaries are transferred to the destination array AFTER the > unpacking of the argument. The reduced testcase below now runs correctly. > > The patch and testcase appear below. > > Paul > > Index: gcc/fortran/trans-expr.c > =================================================================== > --- gcc/fortran/trans-expr.c (révision 112853) > +++ gcc/fortran/trans-expr.c (copie de travail) > @@ -1832,6 +1832,7 @@ > gfc_charlen cl; > gfc_expr *e; > gfc_symbol *fsym; > + stmtblock_t post; > > arglist = NULL_TREE; > retargs = NULL_TREE; > @@ -1861,6 +1862,7 @@ > else > info = NULL; > > + gfc_init_block (&post); > gfc_init_interface_mapping (&mapping); > need_interface_mapping = ((sym->ts.type == BT_CHARACTER > && sym->ts.cl->length > @@ -1970,7 +1972,7 @@ > gfc_add_interface_mapping (&mapping, fsym, &parmse); > > gfc_add_block_to_block (&se->pre, &parmse.pre); > - gfc_add_block_to_block (&se->post, &parmse.post); > + gfc_add_block_to_block (&post, &parmse.post); > > /* Character strings are passed as two parameters, a length and a > pointer. */ > @@ -2177,6 +2179,11 @@ > } > } > > + if (byref) > + gfc_add_block_to_block (&se->pre, &post); > + else > + gfc_add_block_to_block (&se->post, &post); > + > return has_alternate_specifier; > } > > ! { dg-do run } > ! Tests the fix for PR27124 in which the unpacking of argument > ! temporaries and of array result temporaries occurred in the > ! incorrect order. > ! > ! Test is based on the original example, provided by > ! Philippe Schaffnit <[EMAIL PROTECTED]> > ! > PROGRAM Test > INTEGER :: Array(2, 3) = reshape ((/1,4,2,5,3,6/),(/2,3/)) > integer :: Brray(2, 3) = 0 > Brray(1,:) = Function_Test (Array(1,:)) > if (any(reshape (Brray, (/6/)) .ne. (/11, 0, 12, 0, 13, 0/))) call abort > () > Array(1,:) = Function_Test (Array(1,:)) > if (any(reshape (Array, (/6/)) .ne. (/11, 4, 12, 5, 13, 6/))) call abort > () > > contains > FUNCTION Function_Test (Input) > INTEGER, INTENT(IN) :: Input(1:3) > INTEGER :: Function_Test(1:3) > Function_Test = Input + 10 > END FUNCTION Function_Test > END PROGRAM Test > > -- > > http://gcc.gnu.org/bugzilla/show_bug.cgi?id=27124 > > ------- You are receiving this mail because: ------- > You are on the CC list for the bug, or are watching someone who is. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=27124