[PATCH] fortran/29403 -- Fix 'print XXX' where XXX is a char-expr.

Paul Thomas paulthomas2@wanadoo.fr
Sun Oct 15 21:36:00 GMT 2006


Steve,

OK - thanks

Paul

>The attached patch has been bootstrapped and regression
>tested on i386-*-freebsd.  The PR has a good analysis of
>the problem, so see 
>
>http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29403
>
>for details.  In short, "print (1,*)" is illegal and gfortran
>caught this type of problem.  OTOH, "print (a//(b//c)), ..."
>is a legal form and gfortran did not check for this.  The
>patch now gets it right.
>
>
>2006-10-14  Steven G. Kargl  <kargl@gcc.gnu.org>
>
>	PR fortran/29403
>	* io.c (match_io):  Check for a default-char-expr for PRINT format.
>
>2006-10-14  Steven G. Kargl  <kargl@gcc.gnu.org>
>
>	gfortran.dg/print_1.f90:  New test.
>
>  
>
>------------------------------------------------------------------------
>
>Index: io.c
>===================================================================
>--- io.c	(revision 117720)
>+++ io.c	(working copy)
>@@ -2744,7 +2744,8 @@
>   where = gfc_current_locus;
>   comma_flag = 0;
>   current_dt = dt = gfc_getmem (sizeof (gfc_dt));
>-  if (gfc_match_char ('(') == MATCH_NO)
>+  m = gfc_match_char ('(');
>+  if (m == MATCH_NO)
>     {
>       where = gfc_current_locus;
>       if (k == M_WRITE)
>@@ -2796,9 +2797,25 @@
>     }
>   else
>     {
>-      /* Error for constructs like print (1,*).   */
>-      if (k == M_PRINT)
>-	goto  syntax;
>+      /* Before issuing an error for a malformed 'print (1,*)' type of
>+	 error, check for a default-char-expr of the form ('(I0)').  */
>+
>+      if (k == M_PRINT && m == MATCH_YES)
>+	{
>+	  /* Reset current locus to get the initial '(' in an expression.  */
>+	  gfc_current_locus = where;
>+	  dt->format_expr = NULL;
>+	  m = match_dt_format (dt);
>+
>+	  if (m == MATCH_ERROR)
>+	    goto cleanup;
>+	  if (m == MATCH_NO || dt->format_expr == NULL)
>+	    goto syntax;
>+
>+	  comma_flag = 1;
>+	  dt->io_unit = default_unit (k);
>+	  goto get_io_list;
>+	}
>     }
> 
>   /* Match a control list */
>  
>
>------------------------------------------------------------------------
>
>! { dg-do compile }
>! PR fortran/29403
>program p
>   character(len=10) a, b, c
>   integer i
>   i = 1
>   print ('(I0)'), i
>   a = '(I0,'
>   b = 'I2,'
>   c = 'I4)'
>   call prn(a, b, c, i)
>   print (1,*), i       ! { dg-error "in PRINT statement" }
>end program p
>
>subroutine prn(a, b, c, i)
>  integer i
>  character(len=*) a, b, c
>  print (a//(b//c)), i, i, i
>  print trim(a//trim(b//c)), i, i, i
>end subroutine prn
>  
>



More information about the Fortran mailing list