File pr26399.patch of Package gcc41

Jan Hubicka

        PR profile/20815
        PR profile/26399
        * coverage.c (coverage_checksum_string): Reorganize loop to not read
        after buffer.
        * g++.dg/bprob/g++-bprob-2.C: New testcase.

Index: gcc/coverage.c
===================================================================
*** gcc/coverage.c	(revision 113342)
--- gcc/coverage.c	(working copy)
*************** coverage_checksum_string (unsigned chksu
*** 457,486 ****
         to be no better chance then walk all possible offsets looking
         for magicnuber.  */
        if (offset)
!         for (;string[offset]; offset++)
!         for (i = i + offset; string[i]; i++)
!           if (string[i]=='_')
!             {
!               int y;
! 
!               for (y = 1; y < 9; y++)
!                 if (!(string[i + y] >= '0' && string[i + y] <= '9')
!                     && !(string[i + y] >= 'A' && string[i + y] <= 'F'))
!                   break;
!               if (y != 9 || string[i + 9] != '_')
!                 continue;
!               for (y = 10; y < 18; y++)
!                 if (!(string[i + y] >= '0' && string[i + y] <= '9')
!                     && !(string[i + y] >= 'A' && string[i + y] <= 'F'))
!                   break;
!               if (y != 18)
!                 continue;
!               if (!dup)
!                 string = dup = xstrdup (string);
!               for (y = 10; y < 18; y++)
!                 dup[i + y] = '0';
!             }
!         break;
      }
  
    chksum = crc32_string (chksum, string);
--- 457,487 ----
         to be no better chance then walk all possible offsets looking
         for magicnuber.  */
        if (offset)
! 	{
! 	  for (i = i + offset; string[i]; i++)
! 	    if (string[i]=='_')
! 	      {
! 		int y;
! 
! 		for (y = 1; y < 9; y++)
! 		  if (!(string[i + y] >= '0' && string[i + y] <= '9')
! 		      && !(string[i + y] >= 'A' && string[i + y] <= 'F'))
! 		    break;
! 		if (y != 9 || string[i + 9] != '_')
! 		  continue;
! 		for (y = 10; y < 18; y++)
! 		  if (!(string[i + y] >= '0' && string[i + y] <= '9')
! 		      && !(string[i + y] >= 'A' && string[i + y] <= 'F'))
! 		    break;
! 		if (y != 18)
! 		  continue;
! 		if (!dup)
! 		  string = dup = xstrdup (string);
! 		for (y = 10; y < 18; y++)
! 		  dup[i + y] = '0';
! 	      }
! 	  break;
! 	}
      }
  
    chksum = crc32_string (chksum, string);
--- /dev/null	2006-03-04 21:11:20.000000000 +0100
+++ gcc/testsuite/g++.dg/bprob/g++-bprob-2.C	2006-04-28 13:46:24.000000000 +0200
@@ -0,0 +1,15 @@
+namespace {
+
+int calc(int j)
+{
+  if (j==0) return 0;
+  return calc(j-1)*j % 17;
+}
+
+}
+
+int main(void)
+{
+  return calc(25);
+}
+
openSUSE Build Service is sponsored by