1*1f67508bSValeriy Savchenko // RUN: %clang_analyze_cc1 -std=c++11 -analyzer-checker=core -verify %s
2*1f67508bSValeriy Savchenko
3*1f67508bSValeriy Savchenko void nonnull [[gnu::nonnull]] (int *q);
4*1f67508bSValeriy Savchenko
f1(int * p)5*1f67508bSValeriy Savchenko void f1(int *p) {
6*1f67508bSValeriy Savchenko if (p)
7*1f67508bSValeriy Savchenko return;
8*1f67508bSValeriy Savchenko nonnull(p); //expected-warning{{nonnull}}
9*1f67508bSValeriy Savchenko }
10*1f67508bSValeriy Savchenko
f2(int * p)11*1f67508bSValeriy Savchenko void f2(int *p) {
12*1f67508bSValeriy Savchenko if (p)
13*1f67508bSValeriy Savchenko return;
14*1f67508bSValeriy Savchenko auto lambda = [](int *q) __attribute__((nonnull)){};
15*1f67508bSValeriy Savchenko lambda(p); //expected-warning{{nonnull}}
16*1f67508bSValeriy Savchenko }
17*1f67508bSValeriy Savchenko
18*1f67508bSValeriy Savchenko template <class... ARGS>
19*1f67508bSValeriy Savchenko void variadicNonnull(ARGS... args) __attribute__((nonnull));
20*1f67508bSValeriy Savchenko
f3(int a,float b,int * p)21*1f67508bSValeriy Savchenko void f3(int a, float b, int *p) {
22*1f67508bSValeriy Savchenko if (p)
23*1f67508bSValeriy Savchenko return;
24*1f67508bSValeriy Savchenko variadicNonnull(a, b, p); //expected-warning{{nonnull}}
25*1f67508bSValeriy Savchenko }
26*1f67508bSValeriy Savchenko
27*1f67508bSValeriy Savchenko int globalVar = 15;
28*1f67508bSValeriy Savchenko void moreParamsThanArgs [[gnu::nonnull(2, 4)]] (int a, int *p, int b = 42, int *q = &globalVar);
29*1f67508bSValeriy Savchenko
f4(int a,int * p)30*1f67508bSValeriy Savchenko void f4(int a, int *p) {
31*1f67508bSValeriy Savchenko if (p)
32*1f67508bSValeriy Savchenko return;
33*1f67508bSValeriy Savchenko moreParamsThanArgs(a, p); //expected-warning{{nonnull}}
34*1f67508bSValeriy Savchenko }
35