modernc.org/ccgo/v3@v3.16.14/lib/testdata/gcc-9.1.0/gcc/testsuite/gcc.c-torture/execute/builtins/mempcpy-2.c (about)

     1  /* Copyright (C) 2003  Free Software Foundation.
     2  
     3     Ensure that builtin mempcpy and stpcpy perform correctly.
     4  
     5     Written by Jakub Jelinek, 21/05/2003.  */
     6  
     7  extern void abort (void);
     8  typedef __SIZE_TYPE__ size_t;
     9  extern void *mempcpy (void *, const void *, size_t);
    10  extern int memcmp (const void *, const void *, size_t);
    11  extern int inside_main;
    12  
    13  long buf1[64];
    14  char *buf2 = (char *) (buf1 + 32);
    15  long buf5[20];
    16  char buf7[20];
    17  
    18  void
    19  __attribute__((noinline))
    20  test (long *buf3, char *buf4, char *buf6, int n)
    21  {
    22    int i = 0;
    23  
    24    /* These should probably be handled by store_by_pieces on most arches.  */
    25    if (mempcpy (buf1, "ABCDEFGHI", 9) != (char *) buf1 + 9
    26        || memcmp (buf1, "ABCDEFGHI\0", 11))
    27      abort ();
    28  
    29    if (mempcpy (buf1, "abcdefghijklmnopq", 17) != (char *) buf1 + 17
    30        || memcmp (buf1, "abcdefghijklmnopq\0", 19))
    31      abort ();
    32  
    33    if (__builtin_mempcpy (buf3, "ABCDEF", 6) != (char *) buf1 + 6
    34        || memcmp (buf1, "ABCDEFghijklmnopq\0", 19))
    35      abort ();
    36  
    37    if (__builtin_mempcpy (buf3, "a", 1) != (char *) buf1 + 1
    38        || memcmp (buf1, "aBCDEFghijklmnopq\0", 19))
    39      abort ();
    40  
    41    if (mempcpy ((char *) buf3 + 2, "bcd" + ++i, 2) != (char *) buf1 + 4
    42        || memcmp (buf1, "aBcdEFghijklmnopq\0", 19)
    43        || i != 1)
    44      abort ();
    45  
    46    /* These should probably be handled by move_by_pieces on most arches.  */
    47    if (mempcpy ((char *) buf3 + 4, buf5, 6) != (char *) buf1 + 10
    48        || memcmp (buf1, "aBcdRSTUVWklmnopq\0", 19))
    49      abort ();
    50  
    51    if (__builtin_mempcpy ((char *) buf1 + ++i + 8, (char *) buf5 + 1, 1)
    52        != (char *) buf1 + 11
    53        || memcmp (buf1, "aBcdRSTUVWSlmnopq\0", 19)
    54        || i != 2)
    55      abort ();
    56  
    57    if (mempcpy ((char *) buf3 + 14, buf6, 2) != (char *) buf1 + 16
    58        || memcmp (buf1, "aBcdRSTUVWSlmnrsq\0", 19))
    59      abort ();
    60  
    61    if (mempcpy (buf3, buf5, 8) != (char *) buf1 + 8
    62        || memcmp (buf1, "RSTUVWXYVWSlmnrsq\0", 19))
    63      abort ();
    64  
    65    if (mempcpy (buf3, buf5, 17) != (char *) buf1 + 17
    66        || memcmp (buf1, "RSTUVWXYZ01234567\0", 19))
    67      abort ();
    68  
    69    __builtin_memcpy (buf3, "aBcdEFghijklmnopq\0", 19);
    70  
    71    /* These should be handled either by movmemendM or mempcpy
    72       call.  */
    73    if (mempcpy ((char *) buf3 + 4, buf5, n + 6) != (char *) buf1 + 10
    74        || memcmp (buf1, "aBcdRSTUVWklmnopq\0", 19))
    75      abort ();
    76  
    77    if (__builtin_mempcpy ((char *) buf1 + ++i + 8, (char *) buf5 + 1, n + 1)
    78        != (char *) buf1 + 12
    79        || memcmp (buf1, "aBcdRSTUVWkSmnopq\0", 19)
    80        || i != 3)
    81      abort ();
    82  
    83    if (mempcpy ((char *) buf3 + 14, buf6, n + 2) != (char *) buf1 + 16
    84        || memcmp (buf1, "aBcdRSTUVWkSmnrsq\0", 19))
    85      abort ();
    86  
    87    i = 1;
    88  
    89    /* These might be handled by store_by_pieces.  */
    90    if (mempcpy (buf2, "ABCDEFGHI", 9) != buf2 + 9
    91        || memcmp (buf2, "ABCDEFGHI\0", 11))
    92      abort ();
    93  
    94    if (mempcpy (buf2, "abcdefghijklmnopq", 17) != buf2 + 17
    95        || memcmp (buf2, "abcdefghijklmnopq\0", 19))
    96      abort ();
    97  
    98    if (__builtin_mempcpy (buf4, "ABCDEF", 6) != buf2 + 6
    99        || memcmp (buf2, "ABCDEFghijklmnopq\0", 19))
   100      abort ();
   101  
   102    if (__builtin_mempcpy (buf4, "a", 1) != buf2 + 1
   103        || memcmp (buf2, "aBCDEFghijklmnopq\0", 19))
   104      abort ();
   105  
   106    if (mempcpy (buf4 + 2, "bcd" + i++, 2) != buf2 + 4
   107        || memcmp (buf2, "aBcdEFghijklmnopq\0", 19)
   108        || i != 2)
   109      abort ();
   110  
   111    /* These might be handled by move_by_pieces.  */
   112    if (mempcpy (buf4 + 4, buf7, 6) != buf2 + 10
   113        || memcmp (buf2, "aBcdRSTUVWklmnopq\0", 19))
   114      abort ();
   115  
   116    if (__builtin_mempcpy (buf2 + i++ + 8, buf7 + 1, 1)
   117        != buf2 + 11
   118        || memcmp (buf2, "aBcdRSTUVWSlmnopq\0", 19)
   119        || i != 3)
   120      abort ();
   121  
   122    if (mempcpy (buf4 + 14, buf6, 2) != buf2 + 16
   123        || memcmp (buf2, "aBcdRSTUVWSlmnrsq\0", 19))
   124      abort ();
   125  
   126    __builtin_memcpy (buf4, "aBcdEFghijklmnopq\0", 19);
   127  
   128    /* These should be handled either by movmemendM or mempcpy
   129       call.  */
   130    if (mempcpy (buf4 + 4, buf7, n + 6) != buf2 + 10
   131        || memcmp (buf2, "aBcdRSTUVWklmnopq\0", 19))
   132      abort ();
   133  
   134    if (__builtin_mempcpy (buf2 + i++ + 8, buf7 + 1, n + 1)
   135        != buf2 + 12
   136        || memcmp (buf2, "aBcdRSTUVWkSmnopq\0", 19)
   137        || i != 4)
   138      abort ();
   139  
   140    if (mempcpy (buf4 + 14, buf6, n + 2) != buf2 + 16
   141        || memcmp (buf2, "aBcdRSTUVWkSmnrsq\0", 19))
   142      abort ();
   143  }
   144  
   145  void
   146  main_test (void)
   147  {
   148    /* All these tests are allowed to call mempcpy/stpcpy.  */
   149    inside_main = 0;
   150    __builtin_memcpy (buf5, "RSTUVWXYZ0123456789", 20);
   151    __builtin_memcpy (buf7, "RSTUVWXYZ0123456789", 20);
   152    test (buf1, buf2, "rstuvwxyz", 0);
   153  }