summaryrefslogtreecommitdiff
path: root/support/regression/tests/bug2740884.c
blob: 57264f026e815f97f2caed951051dcc81c3e8e80 (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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/*
  bug2740884.c
 */

/*
 * [ 2740884 ] Incorrect assignment in array of structs
 * https://sourceforge.net/tracker/?func=detail&group_id=599&atid=100599&aid=2740884
 *
 * a bug in SDCCast.c:1883 isConformingBody()
 *  case... PTR_OP
 *  causing loopreversal to be erroneously applied here
 *
 *  case... INC_OP and DEC_OP
 *    suffer the same way
 *
 * (compile "make -C .. ALL_TESTS=./tests/bug2740884.c")
 */

#include <testfwk.h>


struct {
  char Route;
} doors[4];

void foo(void) {
  char i;
  for (i = 1; i <= 2; i++)
    doors[i].Route = 0x24;
}

void bar(void) {
  char i;
  for (i = 1; i <= 2; i++)
    doors[i].Route ++;
}

void baz(void) {
  char i;
  for (i = 1; i <= 2; i++)
    doors[i].Route --;
}


void
testBug(void)
{
  doors[0].Route = 0;
  doors[1].Route = 0;
  doors[2].Route = 0;
  doors[3].Route = 0;

  foo();

  ASSERT(doors[0].Route ==    0);
  ASSERT(doors[1].Route == 0x24);
  ASSERT(doors[2].Route == 0x24);
  ASSERT(doors[3].Route ==    0);

  bar();

  ASSERT(doors[0].Route ==    0);
  ASSERT(doors[1].Route == 0x25);
  ASSERT(doors[2].Route == 0x25);
  ASSERT(doors[3].Route ==    0);

  baz();

  ASSERT(doors[0].Route ==    0);
  ASSERT(doors[1].Route == 0x24);
  ASSERT(doors[2].Route == 0x24);
  ASSERT(doors[3].Route ==    0);
}