inline.c revision 0849ade4bb3e90c2fc0ce01ccd330f76f91da732
1// RUN: %clang_cc1 -analyze -analyzer-checker=core -analyzer-inline-call -analyzer-store region -verify %s
2
3int test1_f1() {
4  int y = 1;
5  y++;
6  return y;
7}
8
9void test1_f2() {
10  int x = 1;
11  x = test1_f1();
12  if (x == 1) {
13    int *p = 0;
14    *p = 3; // no-warning
15  }
16  if (x == 2) {
17    int *p = 0;
18    *p = 3; // expected-warning{{Dereference of null pointer (loaded from variable 'p')}}
19  }
20}
21
22// Test that inlining works when the declared function has less arguments
23// than the actual number in the declaration.
24void test2_f1() {}
25int test2_f2();
26
27void test2_f3() {
28  test2_f1(test2_f2()); // expected-warning{{too many arguments in call to 'test2_f1'}}
29}
30
31// Test that inlining works with recursive functions.
32
33unsigned factorial(unsigned x) {
34  if (x <= 1)
35    return 1;
36  return x * factorial(x - 1);
37}
38
39void test_factorial() {
40  if (factorial(3) == 6) {
41    int *p = 0;
42    *p = 0xDEADBEEF;  // expected-warning {{null}}
43  }
44  else {
45    int *p = 0;
46    *p = 0xDEADBEEF; // no-warning
47  }
48}
49
50void test_factorial_2() {
51  unsigned x = factorial(3);
52  if (x == factorial(3)) {
53    int *p = 0;
54    *p = 0xDEADBEEF;  // expected-warning {{null}}
55  }
56  else {
57    int *p = 0;
58    *p = 0xDEADBEEF; // no-warning
59  }
60}
61