1651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang -target x86_64-unknown-linux --analyze %s
2651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
3651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "Inputs/system-header-simulator.h"
4651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
5651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#define __GFP_ZERO 0x8000
6651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#define NULL ((void *)0)
7651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
8651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid *kmalloc(size_t, int);
9651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
10651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct test {
11651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines};
12651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
13651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid foo(struct test *);
14651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
15651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid test_zeroed() {
16651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct test **list, *t;
17651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int i;
18651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
19651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  list = kmalloc(sizeof(*list) * 10, __GFP_ZERO);
20651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (list == NULL)
21651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return;
22651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
23651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (i = 0; i < 10; i++) {
24651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    t = list[i];
25651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    foo(t);
26651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
27651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  free(list); // no-warning
28651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
29651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
30651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid test_nonzero() {
31651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct test **list, *t;
32651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int i;
33651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
34651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  list = kmalloc(sizeof(*list) * 10, 0);
35651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (list == NULL)
36651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return;
37651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
38651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (i = 0; i < 10; i++) {
39651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    t = list[i]; // expected-warning{{undefined}}
40651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    foo(t);
41651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
42651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  free(list);
43651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
44651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
45651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid test_indeterminate(int flags) {
46651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct test **list, *t;
47651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int i;
48651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
49651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  list = kmalloc(sizeof(*list) * 10, flags);
50651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (list == NULL)
51651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return;
52651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
53651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (i = 0; i < 10; i++) {
54651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    t = list[i]; // expected-warning{{undefined}}
55651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    foo(t);
56651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
57651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  free(list);
58651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
59