111
|
1 /* { dg-do run } */
|
|
2
|
|
3 extern void abort (void);
|
|
4 extern void *memcpy(void *, const void *, __SIZE_TYPE__);
|
|
5
|
|
6 typedef struct {
|
|
7 void *v1;
|
|
8 void *v2;
|
|
9 void *v3;
|
|
10 union {
|
|
11 void *f1;
|
|
12 void *f2;
|
|
13 } u;
|
|
14 } S;
|
|
15
|
|
16
|
|
17 S *getS();
|
|
18 void verify_p(void *p);
|
|
19 double *getP(void *p);
|
|
20
|
|
21 void memcpy_bug()
|
|
22 {
|
|
23 S *s;
|
|
24 double *p = getP(0);
|
|
25
|
|
26 if (p) {
|
|
27 int intSptr[sizeof(S*)/sizeof(int)];
|
|
28 unsigned i = 0;
|
|
29 for (i = 0; i < sizeof(intSptr)/sizeof(*intSptr); ++i) {
|
|
30 intSptr[i] = (int) p[i];
|
|
31 }
|
|
32 memcpy(&s, intSptr, sizeof(intSptr));
|
|
33 (s)->u.f1 = p;
|
|
34 verify_p((s)->u.f1);
|
|
35 } else {
|
|
36 s = getS();
|
|
37 }
|
|
38 verify_p(s->u.f1);
|
|
39 }
|
|
40
|
|
41 double P[4];
|
|
42
|
|
43 double *getP(void *p) {
|
|
44 union u {
|
|
45 void *p;
|
|
46 int i[2];
|
|
47 } u;
|
|
48 u.p = P;
|
|
49 P[0] = u.i[0];
|
|
50 P[1] = u.i[1];
|
|
51 return P;
|
|
52 }
|
|
53
|
|
54 S *getS()
|
|
55 {
|
|
56 return 0;
|
|
57 }
|
|
58
|
|
59 void verify_p(void *p)
|
|
60 {
|
|
61 if (p != P)
|
|
62 abort ();
|
|
63 }
|
|
64
|
|
65 int main(int argc, char *argv[])
|
|
66 {
|
|
67 memcpy_bug();
|
|
68 return 0;
|
|
69 }
|
|
70
|