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