aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.c-torture/unsorted/i386bug.c
blob: 395bfa6c3e2c607db25602519389f4949fbec02a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
typedef union {
    struct {
	long RH, LH;
    } v;
    struct {
	unsigned char B1;
    } u;
} twohalves;


typedef union {
    long cint;
    twohalves hhfield;

} memoryword;


extern  memoryword mem[262];

long znewstructure ( p )
long p;
{
  long q, r;
    {
      q = mem [ p + 2 ] .hhfield .v.RH;
      r = mem [ q + 1 ] .hhfield .v.LH;
      do {
	  q = r;
	r = mem [ r ] .hhfield .v.RH;
      } while ( ! ( r == p ) );
      r = foo((long) ( 3 ));
      mem [ q ] .hhfield .v.RH = r;
      mem [ r + 2 ] = mem [ p + 2 ];
      if ( mem [ p + 2 ] .hhfield .v.LH  == 0 )
      {
	q = mem [ p + 2 ] .hhfield .v.RH + 1;
	while ( mem [ q ] .hhfield .v.RH != p ) q = mem [ q ] .hhfield .v.RH;
	mem [ q ] .hhfield .v.RH = r;
      }
    }
  mem [ r ] .hhfield .u.B1  = mem [ p ] .hhfield .u.B1;
  mem [ r + 1 ] .hhfield .v.LH  = p;

  q = foo((long) ( 3 ));

  mem [ r + 1 ] .hhfield .v.RH = q;
  mem [ q + 2 ] .hhfield .v.RH = r;


  return(r);
}