aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/c-c++-common/Warray-bounds-10.c
blob: cfe9a38341087e010a7e883afe9ca74808b587a1 (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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
/* PR tree-optimization/99475 - bogus -Warray-bounds accessing an array
   element of empty structs
   { dg-do compile }
   { dg-options "-O2 -Wall" } */

struct S
{
#if SOME_CONFIG_MACRO
  /* Suppose the contents are empty in the development configuration
     but non-empty in others.  Out of bounds accesses to elements of
     the arrays below should be diagnosed in all configurations,
     including when S is empty, even if they are folded away.  */
  int member;
#endif
};

extern struct S sa3[3];
extern struct S sa2_3[2][3];
extern struct S sa3_4_5[3][4][5];

void sink (void*);


void access_sa3 (struct S s)
{
  sa3[0] = s;
  sa3[1] = s;
  sa3[2] = s;
  sa3[3] = s;       // { dg-warning "\\\[-Warray-bounds" "pr?????" { xfail *-*-* } }
}

void access_sa3_ptr (struct S s)
{
  struct S *p = &sa3[0];

  p[0] = s;         // { dg-bogus "\\\[-Warray-bounds" }
  p[1] = s;         // { dg-bogus "\\\[-Warray-bounds" }
  p[2] = s;         // { dg-bogus "\\\[-Warray-bounds" }
  p[3] = s;         // { dg-warning "\\\[-Warray-bounds" "pr?????" { xfail *-*-* } }
}

void access_sa2_3_ptr (struct S s)
{
  struct S *p = &sa2_3[0][0];

  p[0] = s;         // { dg-bogus "\\\[-Warray-bounds" }
  p[1] = s;         // { dg-bogus "\\\[-Warray-bounds" }
  p[2] = s;         // { dg-bogus "\\\[-Warray-bounds" }
  p[6] = s;         // { dg-warning "\\\[-Warray-bounds" "pr?????" { xfail *-*-* } }
}

void access_sa3_4_5_ptr (struct S s, int i)
{
  struct S *p = &sa3_4_5[0][0][0];

  p[0] = s;         // { dg-bogus "\\\[-Warray-bounds" }
  p[1] = s;         // { dg-bogus "\\\[-Warray-bounds" }
  p[2] = s;         // { dg-bogus "\\\[-Warray-bounds" }
  p[60] = s;        // { dg-warning "\\\[-Warray-bounds" "pr?????" { xfail *-*-* } }
}


void access_vla3 (struct S s, unsigned n)
{
  struct S vla3[3 < n ? 3 : n];

  vla3[0] = s;
  vla3[1] = s;
  vla3[2] = s;
  vla3[3] = s;       // { dg-warning "\\\[-Warray-bounds" "pr?????" { xfail *-*-* } }

  sink (vla3);
}

void access_vla3_ptr (struct S s, unsigned n)
{
  struct S vla3[3 < n ? 3 : n];
  struct S *p = &vla3[0];

  p[0] = s;         // { dg-bogus "\\\[-Warray-bounds" }
  p[1] = s;         // { dg-bogus "\\\[-Warray-bounds" }
  p[2] = s;         // { dg-bogus "\\\[-Warray-bounds" }
  p[3] = s;         // { dg-warning "\\\[-Warray-bounds" "pr?????" { xfail *-*-* } }

  sink (vla3);
}

void access_vla2_3_ptr (struct S s, unsigned n)
{
  struct S vla2_3[2 < n ? 2 : n][3 < n ? 3 : n];
  struct S *p = &vla2_3[0][0];

  p[0] = s;         // { dg-bogus "\\\[-Warray-bounds" }
  p[1] = s;         // { dg-bogus "\\\[-Warray-bounds" }
  p[2] = s;         // { dg-bogus "\\\[-Warray-bounds" }
  p[6] = s;         // { dg-warning "\\\[-Warray-bounds" "pr?????" { xfail *-*-* } }

  sink (vla2_3);
}

void access_vla3_4_5_ptr (struct S s, unsigned n)
{
  struct S vla3_4_5[3 < n ? 3 : n][4 < n ? 4 : n][5 < n ? 5 : n];
  struct S *p = &vla3_4_5[0][0][0];

  p[0] = s;         // { dg-bogus "\\\[-Warray-bounds" }
  p[1] = s;         // { dg-bogus "\\\[-Warray-bounds" }
  p[2] = s;         // { dg-bogus "\\\[-Warray-bounds" }
  p[60] = s;        // { dg-warning "\\\[-Warray-bounds" "pr?????" { xfail *-*-* } }

  sink (vla3_4_5);
}

// { dg-prune-output "empty struct has size 0 in C" }