[PATCH] Fix PR fortran/19926

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

[PATCH] Fix PR fortran/19926

Steve Kargl
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  <[hidden email]>
            Steven G. Kargl <[hidden email]>

    PR fortran/19926
        * primary.c (gfc_match_rvalue):  expr_type can be EXPR_CONSTANT
        for an array; check that sym->as is NULL.

--
Steve

primary.c.diff (964 bytes) Download Attachment
pr19926.f90 (475 bytes) Download Attachment
Reply | Threaded
Open this post in threaded view
|

PING Re: [PATCH] Fix PR fortran/19926

Steve Kargl
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  <[hidden email]>
>             Steven G. Kargl <[hidden email]>
>
>     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
Reply | Threaded
Open this post in threaded view
|

Re: PING Re: [PATCH] Fix PR fortran/19926

Steven Bosscher
On Saturday 18 June 2005 06:38, Steve Kargl wrote:
> > 2005-06-12  Erik Edelman  <[hidden email]>
> >             Steven G. Kargl <[hidden email]>
> >
> >     PR fortran/19926
> > * primary.c (gfc_match_rvalue):  expr_type can be EXPR_CONSTANT
> > for an array; check that sym->as is NULL.

Yup.

Gr.
Steven