131
|
1 /* PR tree-optimization/85753 - missing -Wrestrict on memcpy into a member
|
|
2 array
|
|
3 { dg-do compile }
|
|
4 { dg-options "-O2 -Wall -ftrack-macro-expansion=0" } */
|
|
5
|
|
6 #define memcpy __builtin_memcpy
|
|
7
|
|
8 char a[16];
|
|
9
|
|
10 struct { char a[16]; } x;
|
|
11
|
|
12 /* Exercise aggregate types. */
|
|
13
|
|
14 void test_aggr_idx_nowarn (int i, int j)
|
|
15 {
|
|
16 memcpy (&a[i], &a[j], 7);
|
|
17 memcpy (&x.a[i], &x.a[j], 7);
|
|
18 }
|
|
19
|
|
20 void test_aggr_idx_warn (int i, int j)
|
|
21 {
|
|
22 memcpy (&a[i], &a[j], 9); /* { dg-warning "\\\[-Wrestrict" } */
|
|
23 memcpy (&x.a[i], &x.a[j], 9); /* { dg-warning "\\\[-Wrestrict" } */
|
|
24 }
|
|
25
|
|
26 void test_aggr_off_nowarn (int i, int j)
|
|
27 {
|
|
28 memcpy (a + i, a + j, 5);
|
|
29 memcpy (x.a + i, x.a + j, 5);
|
|
30 }
|
|
31
|
|
32 void test_aggr_off_warn (int i, int j)
|
|
33 {
|
|
34 memcpy (a + i, a + j, 9); /* { dg-warning "\\\[-Wrestrict" } */
|
|
35 memcpy (x.a + i, x.a + j, 9); /* { dg-warning "\\\[-Wrestrict" } */
|
|
36 }
|
|
37
|
|
38
|
|
39 void sink (void*);
|
|
40
|
|
41 #define T(call) sink (call)
|
|
42
|
|
43
|
|
44 /* Also exercise basic types. */
|
|
45
|
|
46 #ifdef __UINT32_TYPE__
|
|
47
|
|
48 __UINT32_TYPE__ i32;
|
|
49
|
|
50 void test_basic_32 (int i, int j)
|
|
51 {
|
|
52 char *p = (char*)&i32;
|
|
53
|
|
54 T (memcpy (&p[i], &p[j], 1));
|
|
55 T (memcpy (&p[i], &p[j], 2));
|
|
56 T (memcpy (&p[i], &p[j], 3)); /* { dg-warning "\\\[-Wrestrict" } */
|
|
57
|
|
58 T (memcpy (p + i, p + j, 1));
|
|
59 T (memcpy (p + i, p + j, 2));
|
|
60 T (memcpy (p + i, p + j, 3)); /* { dg-warning "\\\[-Wrestrict" } */
|
|
61 }
|
|
62
|
|
63 #endif
|
|
64
|
|
65 #ifdef __UINT64_TYPE__
|
|
66
|
|
67 __UINT64_TYPE__ i64;
|
|
68
|
|
69 void test_basic_64 (int i, int j)
|
|
70 {
|
|
71 char *p = (char*)&i64;
|
|
72
|
|
73 T (memcpy (&p[i], &p[j], 1));
|
|
74 T (memcpy (&p[i], &p[j], 2));
|
|
75 T (memcpy (&p[i], &p[j], 3));
|
|
76 T (memcpy (&p[i], &p[j], 5)); /* { dg-warning "\\\[-Wrestrict" } */
|
|
77 T (memcpy (&p[i], &p[j], 6)); /* { dg-warning "\\\[-Wrestrict" } */
|
|
78 T (memcpy (&p[i], &p[j], 7)); /* { dg-warning "\\\[-Wrestrict" } */
|
|
79
|
|
80 T (memcpy (p + i, p + j, 1));
|
|
81 T (memcpy (p + i, p + j, 2));
|
|
82 T (memcpy (p + i, p + j, 3));
|
|
83 T (memcpy (p + i, p + j, 5)); /* { dg-warning "\\\[-Wrestrict" } */
|
|
84 T (memcpy (p + i, p + j, 6)); /* { dg-warning "\\\[-Wrestrict" } */
|
|
85 T (memcpy (p + i, p + j, 7)); /* { dg-warning "\\\[-Wrestrict" } */
|
|
86 }
|
|
87
|
|
88 #endif
|