aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.dg/torture/pr107115.c
blob: 5f7b6ff01e19f8914f3b45cb1d40dd1f52ca943b (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
/* { dg-do run } */
/* PR/107115 */
/* { dg-additional-options "-fno-schedule-insns -fno-schedule-insns2" } */

#include <stdlib.h>

void test1(long *p1)
{
  p1[0] = 1;
}
long test2(long long *p2, int index1, int index2)
{
  p2[index1] = 2;
  return p2[index2];
}
long test3(long *p3, int index2, long value)
{
  p3[index2] = 3;
  p3[index2] = value;
  return p3[0];
}
long test4(void *p4, int index1, int index2)
{
  test1(p4);
  long temp = test2(p4, index1, index2);
  return test3(p4, index2, temp);
}
long (*volatile vtest)(void *, int, int) = test4;
int main(void)
{
  void *pp = malloc(sizeof (long) + sizeof(long long));
  if (!pp) abort();
  long result = vtest(pp, 0, 0);
  if (*(long *)pp != 2 || result != 2)
    __builtin_abort ();
  return 0;
}