1int foo1 ()
2{
3  union { int l; char c[sizeof (int)]; } k1;
4  char *m;
5  k1.l = 0;
6  /* This test variant triggers ADDR_EXPR of k explicitly in order to
7     ensure it's registered with the runtime.  */
8  m = k1.c;
9  k1.c [sizeof (int)-1] = m[sizeof (int)-2];
10}
11
12int foo2 ()
13{
14  union { int l; char c[sizeof (int)]; } k2;
15  k2.l = 0;
16  /* Since this access is known-in-range, k need not be registered
17     with the runtime, but then this access better not be instrumented
18     either.  */
19  k2.c [sizeof (int)-1] ++;
20  return k2.l;
21}
22
23int foo3idx = sizeof (int)-1;
24
25int foo3 ()
26{
27  union { int l; char c[sizeof (int)]; } k3;
28  k3.l = 0;
29  /* NB this test uses foo3idx, an extern variable, to defeat mudflap
30     known-in-range-index optimizations.  */
31  k3.c [foo3idx] ++;
32  return k3.l;
33}
34
35int main ()
36{
37  foo1 ();
38  foo2 ();
39  foo3 ();
40  return 0;
41}
42