modernc.org/ccgo/v3@v3.16.14/lib/testdata/gcc-9.1.0/gcc/testsuite/gcc.c-torture/compile/20010102-1.c (about)

     1  /* This testcase derives from gnu obstack.c/obstack.h and failed with
     2     -O3 -funroll-all-loops, or -O1 -frename-registers -funroll-loops on
     3     sparc-sun-solaris2.7.
     4  
     5     Copyright (C) 2001  Free Software Foundation.  */
     6  
     7  # define PTR_INT_TYPE __PTRDIFF_TYPE__
     8  
     9  struct _obstack_chunk
    10  {
    11    char  *limit;
    12    struct _obstack_chunk *prev;
    13    char	contents[4];
    14  };
    15  
    16  struct obstack
    17  {
    18    long	chunk_size;
    19    struct _obstack_chunk *chunk;
    20    char	*object_base;
    21    char	*next_free;
    22    char	*chunk_limit;
    23    PTR_INT_TYPE temp;
    24    int   alignment_mask;
    25    struct _obstack_chunk *(*chunkfun) (void *, long);
    26    void (*freefun) (void *, struct _obstack_chunk *);
    27    void *extra_arg;
    28    unsigned use_extra_arg:1;
    29    unsigned maybe_empty_object:1;
    30    unsigned alloc_failed:1;
    31  };
    32  
    33  extern void _obstack_newchunk (struct obstack *, int);
    34  
    35  struct fooalign {char x; double d;};
    36  #define DEFAULT_ALIGNMENT  \
    37    ((PTR_INT_TYPE) ((char *) &((struct fooalign *) 0)->d - (char *) 0))
    38  union fooround {long x; double d;};
    39  #define DEFAULT_ROUNDING (sizeof (union fooround))
    40  
    41  #ifndef COPYING_UNIT
    42  #define COPYING_UNIT int
    43  #endif
    44  
    45  #define CALL_CHUNKFUN(h, size) \
    46    (((h) -> use_extra_arg) \
    47     ? (*(h)->chunkfun) ((h)->extra_arg, (size)) \
    48     : (*(struct _obstack_chunk *(*) (long)) (h)->chunkfun) ((size)))
    49  
    50  #define CALL_FREEFUN(h, old_chunk) \
    51    do { \
    52      if ((h) -> use_extra_arg) \
    53        (*(h)->freefun) ((h)->extra_arg, (old_chunk)); \
    54      else \
    55        (*(void (*) (void *)) (h)->freefun) ((old_chunk)); \
    56    } while (0)
    57  
    58  void
    59  _obstack_newchunk (h, length)
    60       struct obstack *h;
    61       int length;
    62  {
    63    register struct _obstack_chunk *old_chunk = h->chunk;
    64    register struct _obstack_chunk *new_chunk;
    65    register long	new_size;
    66    register long obj_size = h->next_free - h->object_base;
    67    register long i;
    68    long already;
    69  
    70    new_size = (obj_size + length) + (obj_size >> 3) + 100;
    71    if (new_size < h->chunk_size)
    72      new_size = h->chunk_size;
    73  
    74    new_chunk = CALL_CHUNKFUN (h, new_size);
    75    h->chunk = new_chunk;
    76    new_chunk->prev = old_chunk;
    77    new_chunk->limit = h->chunk_limit = (char *) new_chunk + new_size;
    78  
    79    if (h->alignment_mask + 1 >= DEFAULT_ALIGNMENT)
    80      {
    81        for (i = obj_size / sizeof (COPYING_UNIT) - 1;
    82  	   i >= 0; i--)
    83  	((COPYING_UNIT *)new_chunk->contents)[i]
    84  	  = ((COPYING_UNIT *)h->object_base)[i];
    85        already = obj_size / sizeof (COPYING_UNIT) * sizeof (COPYING_UNIT);
    86      }
    87    else
    88      already = 0;
    89    for (i = already; i < obj_size; i++)
    90      new_chunk->contents[i] = h->object_base[i];
    91  
    92    if (h->object_base == old_chunk->contents && ! h->maybe_empty_object)
    93      {
    94        new_chunk->prev = old_chunk->prev;
    95        CALL_FREEFUN (h, old_chunk);
    96      }
    97  
    98    h->object_base = new_chunk->contents;
    99    h->next_free = h->object_base + obj_size;
   100    h->maybe_empty_object = 0;
   101  }