PING Re: walking a namespace to check a symbol name?
Steve Kargl
sgk@troutmask.apl.washington.edu
Sat Jun 18 04:43:00 GMT 2005
PING
On Sat, Jun 11, 2005 at 07:21:28PM -0700, Steve Kargl wrote:
>
> This patch is based on similar code in g95. I'll note that
> we need a better error reporting mechanism and we should probably
> throttle the number of errors spewed to the screen. If you have
> nested SELECT CASE constructs with a boat load of CASE statements
> and the SELECT CASE constructs have duplicate labels, this patch
> will spew a whole bunch of bogus error messages.
>
> 2005-06-11 Andy Vaught <andyv@firstinter.net>
> Steven G. Kargl <kargls@comcast.net>
>
> PR fortran/21257
> * match.c (gfc_match_label): Detect duplicate labels.
>
> 2005-06-11 Steven G. Kargl <kargls@comcast.net>
>
> gfortran.dg/duplicate_label.f90: New test.
>
> Bootstrapped and regression tested on mainline and i386-*-freebsd.
>
> --
> Steve
> Index: match.c
> ===================================================================
> RCS file: /cvs/gcc/gcc/gcc/fortran/match.c,v
> retrieving revision 1.38
> diff -c -p -r1.38 match.c
> *** match.c 4 Jun 2005 10:34:56 -0000 1.38
> --- match.c 12 Jun 2005 02:09:05 -0000
> *************** gfc_match_label (void)
> *** 265,282 ****
> return MATCH_ERROR;
> }
>
> ! if (gfc_new_block->attr.flavor != FL_LABEL
> ! && gfc_add_flavor (&gfc_new_block->attr, FL_LABEL,
> ! gfc_new_block->name, NULL) == FAILURE)
> ! return MATCH_ERROR;
>
> ! for (p = gfc_state_stack; p; p = p->previous)
> ! if (p->sym == gfc_new_block)
> ! {
> ! gfc_error ("Label %s at %C already in use by a parent block",
> ! gfc_new_block->name);
> ! return MATCH_ERROR;
> ! }
>
> return MATCH_YES;
> }
> --- 265,279 ----
> return MATCH_ERROR;
> }
>
> ! if (gfc_new_block->attr.flavor == FL_LABEL)
> ! {
> ! gfc_error ("Duplicate construct label '%s' at %C", name);
> ! return MATCH_ERROR;
> ! }
>
> ! if (gfc_add_flavor (&gfc_new_block->attr, FL_LABEL,
> ! gfc_new_block->name, NULL) == FAILURE)
> ! return MATCH_ERROR;
>
> return MATCH_YES;
> }
> ! { dg-do compile }
> ! PR 21257
> program dups
>
> integer i,j,k
>
> abc: do i = 1, 3
> abc: do j = 1, 3 ! { dg-error "Duplicate construct label" }
> k = i + j
> end do abc
> end do abc ! { dg-error "Expecting END PROGRAM" }
>
> xyz: do i = 1, 2
> k = i + 2
> end do xyz
> xyz: do j = 1, 5 ! { dg-error "Duplicate construct label" }
> k = j + 2
> end do loop ! { dg-error "Expecting END PROGRAM" }
>
> her: if (i == 1) then
> her: if (j == 1) then ! { dg-error "Duplicate construct label" }
> k = i + j
> end if her
> end if her ! { dg-error "Expecting END PROGRAM" }
>
> his: if (i == 1) then
> i = j
> end if his
> his: if (j === 1) then ! { dg-error "Duplicate construct label" }
> print *, j
> end if his ! { dg-error "Expecting END PROGRAM" }
>
> sgk: select case (i)
> case (1)
> sgk: select case (j) ! { dg-error "Duplicate construct label" }
> case (10)
> i = i + j
> case (20)
> j = j + i
> end select sgk
> case (2) ! { dg-error "Unexpected CASE statement" }
> i = i + 1
> j = j + 1
> end select sgk ! { dg-error "Expecting END PROGRAM" }
>
> apl: select case (i)
> case (1)
> k = 2
> case (2)
> j = 1
> end select apl
> apl: select case (i) ! { dg-error "Duplicate construct label" }
> case (1) ! { dg-error "Unexpected CASE statement" }
> j = 2
> case (2) ! { dg-error "Unexpected CASE statement" }
> k = 1
> end select apl ! { dg-error "Expecting END PROGRAM" }
>
> end program dups
--
Steve
More information about the Fortran
mailing list