annotate gcc/testsuite/gcc.dg/Wrestrict-2.c @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1 /* Test to verify that the temporary doesn't trigger a bogus -Warray-bounds
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
2 warning. Distilled from libat_exchange_large_inplace in libatomic/gexch.c.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
3 { dg-do compile }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
4 { dg-options "-O2 -Wall" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
5
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
6 typedef typeof (sizeof 0) size_t;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
7
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
8 extern void *memcpy (void*, const void*, size_t);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
9
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
10 void libat_exchange_large_inplace (size_t n, void *mptr, void *vptr)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
11 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
12 char temp[1024];
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
13
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
14 size_t i = 0;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
15
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
16 for (i = 0; n >= 1024; i += 1024, n -= 1024)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
17 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
18 memcpy (temp, mptr + i, 1024);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
19
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
20 /* The memcpy call below results in the following:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
21 unsigned long ivtmp.7;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
22
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
23 ivtmp.7_4 = (unsigned long) mptr_9(D);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
24 ...
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
25 <bb 4>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
26 # ivtmp.7_22 = PHI <ivtmp.7_4(3), ivtmp.7_5(4)>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
27 ...
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
28 _1 = (void *) ivtmp.7_22;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
29 ...
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
30 memcpy (_1, _2, 1024);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
31
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
32 Treating _1 as a pointer results in the bogus:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
33 warning: 'memcpy' offset 0 is out of the bounds [0, 8] of object 'ivtmp.7' with type 'long unsigned int' [-Warray-bounds]
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
34 memcpy (mptr + i, vptr + i, 1024);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
35 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
36 */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
37 memcpy (mptr + i, vptr + i, 1024);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
38
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
39 memcpy (vptr + i, temp, 1024);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
40 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
41 }