/* 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" } } */