$ cat loop.c   
typedef __SIZE_TYPE__ size_t;   
extern void abort (void);   
extern size_t strlen (const char *);   
extern int strncmp (const char *, const char *, size_t);   
int foo (const char *name)   
{   
  static const char *debug_sec_names [] =   
    {   
      ".debug",   
      ".gnu.linkonce.wi.",   
      ".line",   
      ".stab"   
    };   
  int i;   
  int flags = 0;   
   
  for (i = sizeof (debug_sec_names) / sizeof (debug_sec_names[0]); i--;)   
    if (strncmp (name, debug_sec_names[i], strlen (debug_sec_names[i])) == 0)   
      break;   
   
  if (i >= 0)   
    flags |= 0x10000;   
  return flags;   
}   
   
int main (void)   
{   
  if (foo (".interp") == 0x10000)   
    abort ();   
  return 0;   
}   
$ gcc -O2 loop.c   
$ ./a.out   
Aborted

-- 
           Summary: [4.0 regression] Wrong loop exit
           Product: gcc
           Version: 4.0.0
            Status: UNCONFIRMED
          Keywords: wrong-code
          Severity: critical
          Priority: P2
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: schwab at suse dot de
                CC: gcc-bugs at gcc dot gnu dot org
GCC target triplet: ia64-suse-linux


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19937

Reply via email to