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: walking a namespace to check a symbol name?


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


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