OpenCores
URL https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [gcc-4.2.2/] [gcc/] [testsuite/] [gcc.c-torture/] [execute/] [20000917-1.c] - Diff between revs 149 and 154

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 149 Rev 154
/* This bug exists in gcc-2.95, egcs-1.1.2, gcc-2.7.2 and probably
/* This bug exists in gcc-2.95, egcs-1.1.2, gcc-2.7.2 and probably
   every other version as well.  */
   every other version as well.  */
 
 
typedef struct int3 { int a, b, c; } int3;
typedef struct int3 { int a, b, c; } int3;
 
 
int3
int3
one (void)
one (void)
{
{
  return (int3) { 1, 1, 1 };
  return (int3) { 1, 1, 1 };
}
}
 
 
int3
int3
zero (void)
zero (void)
{
{
  return (int3) { 0, 0, 0 };
  return (int3) { 0, 0, 0 };
}
}
 
 
int
int
main (void)
main (void)
{
{
  int3 a;
  int3 a;
 
 
  /* gcc allocates a temporary for the inner expression statement
  /* gcc allocates a temporary for the inner expression statement
     to store the return value of `one'.
     to store the return value of `one'.
 
 
     gcc frees the temporaries for the inner expression statement.
     gcc frees the temporaries for the inner expression statement.
 
 
     gcc realloates the same temporary slot to store the return
     gcc realloates the same temporary slot to store the return
     value of `zero'.
     value of `zero'.
 
 
     gcc expands the call to zero ahead of the expansion of the
     gcc expands the call to zero ahead of the expansion of the
     statement expressions.  The temporary gets the value of `zero'.
     statement expressions.  The temporary gets the value of `zero'.
 
 
     gcc expands statement expressions and the stale temporary is
     gcc expands statement expressions and the stale temporary is
     clobbered with the value of `one'.  The bad value is copied from
     clobbered with the value of `one'.  The bad value is copied from
     the temporary into *&a.  */
     the temporary into *&a.  */
 
 
  *({ ({ one (); &a; }); }) = zero ();
  *({ ({ one (); &a; }); }) = zero ();
  if (a.a && a.b && a.c)
  if (a.a && a.b && a.c)
    abort ();
    abort ();
  exit (0);
  exit (0);
}
}
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.