1/* Duff's device is legal C; test to make sure the compiler
2   doesn't complain about it.
3
4   Jason Thorpe <thorpej@wasabisystems.com>
5   Derived from PR 3846.  */
6
7/* { dg-do run } */
8/* { dg-options "-O2" } */
9
10extern void abort (void);
11extern void exit (int);
12
13typedef __SIZE_TYPE__ size_t;
14extern int memcmp (const void *, const void *, size_t);
15
16void
17duffcpy (char *dst, const char *src, unsigned long size)
18{
19  switch (size & 3)
20    {
21    for (;;)
22      {
23	*dst++ = *src++;
24    case 3:
25	*dst++ = *src++;
26    case 2:
27	*dst++ = *src++;
28    case 1:
29	*dst++ = *src++;
30    case 0:
31	if (size <= 3)
32	  break;
33	size -= 4;
34      }
35    }
36}
37
38const char testpat[] = "The quick brown fox jumped over the lazy dog.";
39
40int
41main()
42{
43  char buf[64];
44
45  duffcpy (buf, testpat, sizeof (testpat));
46  if (memcmp (buf, testpat, sizeof (testpat)) != 0)
47    abort ();
48
49  exit (0);
50}
51