/* PR c/78668 - aligned_alloc, realloc, et al. missing attribute alloc_size
   Test to verify that memory allocation built-ins are decorated with
   attribute alloc_size that __builtin_object_size can make use of (or
   are treated as if they were for that purpose)..
   { dg-do compile }
   { dg-require-effective-target alloca }
   { dg-additional-options "-O2 -fdump-tree-optimized" } */

void sink (void*);

static unsigned size (unsigned n)
{
  return n;
}

void test_aligned_alloc (unsigned a)
{
  unsigned n = size (7);

  void *p = __builtin_aligned_alloc (a, n);
  if (__builtin_object_size (p, 0) != n)
    __builtin_abort ();
  sink (p);
}

void test_alloca (void)
{
  unsigned n = size (13);

  void *p = __builtin_alloca (n);

  /* Also verify that alloca is declared with attribute returns_nonnull
     (or treated as it were as the case may be).  */
  if (!p)
    __builtin_abort ();

  if (__builtin_object_size (p, 0) != n)
    __builtin_abort ();
  sink (p);
}

void test_calloc (void)
{
  unsigned m = size (19);
  unsigned n = size (23);

  void *p = __builtin_calloc (m, n);
  if (__builtin_object_size (p, 0) != m * n)
    __builtin_abort ();
  sink (p);
}

void test_malloc (void)
{
  unsigned n = size (17);

  void *p = __builtin_malloc (n);
  if (__builtin_object_size (p, 0) != n)
    __builtin_abort ();
  sink (p);
}

void test_realloc (void *p)
{
  unsigned n = size (31);

  p = __builtin_realloc (p, n);
  if (__builtin_object_size (p, 0) != n)
    __builtin_abort ();
  sink (p);
}

/* { dg-final { scan-tree-dump-not "abort" "optimized" } } */
