Patchwork [libgfortran] PR48960 OPEN statement modifies NEWUNIT variable on error

login
register
mail settings
Submitter jerry DeLisle
Date Dec. 26, 2012, 7:46 a.m.
Message ID <50DAAB38.4080006@charter.net>
Download mbox | patch
Permalink /patch/208150/
State New
Headers show

Comments

jerry DeLisle - Dec. 26, 2012, 7:46 a.m.
The attached patch fixes this bug by not assigning the new unit value to the 
user variable until after the OPEN is successful.

Regression tested on Linux X86-64.

OK for trunk with the test case from the PR?

Regards,

Jerry

2012-12-26  Jerry DeLisle  <jvdelisle@gcc.gnu.org>

	PR libfortran/48960
	* io/open.c (st_parameter_open):  Assign newunit number to user
	variable only if the the associated open statement is successful.
Janne Blomqvist - Dec. 26, 2012, 9:17 a.m.
On Wed, Dec 26, 2012 at 9:46 AM, Jerry DeLisle <jvdelisle@charter.net> wrote:
> The attached patch fixes this bug by not assigning the new unit value to the
> user variable until after the OPEN is successful.
>
> Regression tested on Linux X86-64.
>
> OK for trunk with the test case from the PR?

Ok. Thanks for the patch.

>
> Regards,
>
> Jerry
>
> 2012-12-26  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
>
>         PR libfortran/48960
>         * io/open.c (st_parameter_open):  Assign newunit number to user
>         variable only if the the associated open statement is successful.

Patch

Index: open.c
===================================================================
--- open.c	(revision 194678)
+++ open.c	(working copy)
@@ -844,10 +844,7 @@  st_open (st_parameter_open *opp)
   if ((opp->common.flags & IOPARM_LIBRETURN_MASK) == IOPARM_LIBRETURN_OK)
     {
       if ((opp->common.flags & IOPARM_OPEN_HAS_NEWUNIT))
-	{
-	  *opp->newunit = get_unique_unit_number(opp);
-	  opp->common.unit = *opp->newunit;
-	}
+	opp->common.unit = get_unique_unit_number(opp);
 
       u = find_or_create_unit (opp->common.unit);
       if (u->s == NULL)
@@ -859,6 +856,10 @@  st_open (st_parameter_open *opp)
       else
 	already_open (opp, u, &flags);
     }
-
+    
+  if ((opp->common.flags & IOPARM_OPEN_HAS_NEWUNIT)
+      && (opp->common.flags & IOPARM_LIBRETURN_MASK) == IOPARM_LIBRETURN_OK)
+    *opp->newunit = opp->common.unit;
+  
   library_end ();
 }