1 /* Verify that structure return doesn't invoke memcpy on
2    overlapping objects.  */
3 
4 extern void abort (void);
5 extern int inside_main;
6 typedef __SIZE_TYPE__ size_t;
7 
8 struct S {
9   char stuff[1024];
10 };
11 
12 union U {
13   struct {
14     int space;
15     struct S s;
16   } a;
17   struct {
18     struct S s;
19     int space;
20   } b;
21 };
22 
f(struct S * p)23 struct S f(struct S *p)
24 {
25   return *p;
26 }
27 
g(union U * p)28 void g(union U *p)
29 {
30 }
31 
memcpy(void * a,const void * b,size_t len)32 void *memcpy(void *a, const void *b, size_t len)
33 {
34   if (inside_main)
35     {
36       if (a < b && a+len > b)
37         abort ();
38       if (b < a && b+len > a)
39         abort ();
40       return a;
41     }
42   else
43     {
44       char *dst = (char *) a;
45       const char *src = (const char *) b;
46       while (len--)
47         *dst++ = *src++;
48       return a;
49     }
50 }
51