1/* { dg-do run } */ 2/* { dg-options "-fsanitize=nonnull-attribute,returns-nonnull-attribute" } */ 3 4int q, r; 5void *a, *b, *c = (void *) &q, *d, *e, *f = (void *) &q, *g, *h; 6 7__attribute__((returns_nonnull, nonnull (1, 3))) 8void * 9foo (void *p, void *q, void *r) 10{ 11 a = p; 12 b = r; 13 return q; 14} 15 16int 17bar (const void *a, const void *b) 18{ 19 int c = *(const int *) a; 20 int d = *(const int *) b; 21 return c - d; 22} 23 24int 25main () 26{ 27 asm volatile ("" : : : "memory"); 28 d = foo (c, b, c); 29 e = foo (e, c, f); 30 g = foo (c, f, g); 31 __builtin_memset (d, '\0', q); 32 return 0; 33} 34 35/* { dg-output "\.c:13:\[0-9]*:\[^\n\r]*null pointer returned from function declared to never return null\[^\n\r]*(\n|\r\n|\r)" } */ 36/* { dg-output "\[^\n\r]*\.c:29:\[0-9]*:\[^\n\r]*null pointer passed as argument 1, which is declared to never be null\[^\n\r]*(\n|\r\n|\r)" } */ 37/* { dg-output "\[^\n\r]*\.c:30:\[0-9]*:\[^\n\r]*null pointer passed as argument 3, which is declared to never be null\[^\n\r]*(\n|\r\n|\r)" } */ 38/* { dg-output "\[^\n\r]*\.c:31:\[0-9]*:\[^\n\r]*null pointer passed as argument 1, which is declared to never be null" } */ 39