This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

PING Re: [PATCH] Fix PR fortran/19926


PING


On Sun, Jun 12, 2005 at 06:47:42PM -0700, Steve Kargl wrote:
> The attached patch fixes PR fortran/19926.  The problem
> is easiest to explain by looking at the snippet of code
> from the PR.
> 
> subroutine string_comp(i)
>    integer, parameter :: map(0:50) = 3
>    integer :: i
>    i = map(42)
> end subroutine string_comp
> 
> The problem lies in primary.c:gfc_match_rvalue() where we are
> parsing/resolving a PARAMETER expression.  The above parameter
> sets sym->value->expr_type = EXPR_CONSTANT, so a branch of an
> if statement that test (sym->value->expr_type != EXPR_ARRAY)
> because expr_type cannot simultaneous be EXPR_CONSTANT and
> EXPR_ARRAY.  To get to the else portion of the test we
> can check if sym->as is non-NULL, which indicates that we have
> an array with constant content.
> 
> Hopefully, the above makes sense, and the patch does the
> right thing.
> 
> Bootstrapped and regression tested on i386-*-freebsd.
> There are no new regressions with this patch.
> 
> Erik found the location of bug and provided the initial
> patch.  I've changed the patch to the current stated.
> 
> 2005-06-12  Erik Edelman  <eedelman@acclab.helsinki.fi>
>             Steven G. Kargl <kargls@comast.net>
> 
>     PR fortran/19926
> 	* primary.c (gfc_match_rvalue):  expr_type can be EXPR_CONSTANT
> 	for an array; check that sym->as is NULL.
> 
> -- 
> Steve

> Index: primary.c
> ===================================================================
> RCS file: /cvs/gcc/gcc/gcc/fortran/primary.c,v
> retrieving revision 1.25
> diff -c -p -r1.25 primary.c
> *** primary.c	25 Apr 2005 00:08:59 -0000	1.25
> --- primary.c	13 Jun 2005 01:28:30 -0000
> *************** gfc_match_rvalue (gfc_expr ** result)
> *** 1802,1809 ****
>         break;
>   
>       case FL_PARAMETER:
> !       if (sym->value
> ! 	  && sym->value->expr_type != EXPR_ARRAY)
>   	e = gfc_copy_expr (sym->value);
>         else
>   	{
> --- 1802,1812 ----
>         break;
>   
>       case FL_PARAMETER:
> !       /* A statement of the form "REAL, parameter :: a(0:10) = 1" will
> ! 	 end up here.  Unfortunately, sym->value->expr_type is set to 
> ! 	 EXPR_CONSTANT, and so the if () branch would be followed without
> ! 	 the !sym->as check.  */
> !       if (sym->value && sym->value->expr_type != EXPR_ARRAY && !sym->as)
>   	e = gfc_copy_expr (sym->value);
>         else
>   	{

> ! { dg-do run }
> module b
>   type cat
>      integer :: i = 0
>   end type cat
> end module b
> 
> program a
>   use b
>   type(cat) z
>   integer :: i = 0, j(4,3,2) = 0
>   call string_comp(i)
>   if (i /= 3) call abort
>   call string_comp(z%i)
>   if (z%i /= 3) call abort
>   call string_comp(j(1,2,1))
>   if (j(1,2,1) /= 3) call abort
> end program a
> 
> subroutine string_comp(i)
>    integer, parameter :: map(0:50) = 3
>    integer :: i
>    i = map(42)
> end subroutine string_comp
> 


-- 
Steve


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]