1#include <stdio.h>
2
3inline int inline_ref_1 (int &value) __attribute__((always_inline));
4inline int inline_ref_2 (int &value) __attribute__((always_inline));
5
6int caller_ref_1 (int &value);
7int caller_ref_2 (int &value);
8
9int called_by_inline_ref (int &value);
10
11inline void inline_trivial_1 () __attribute__((always_inline));
12inline void inline_trivial_2 () __attribute__((always_inline));
13
14void caller_trivial_1 ();
15void caller_trivial_2 ();
16
17void called_by_inline_trivial ();
18
19static int inline_value;
20
21int
22function_to_call ()
23{
24    return inline_value;
25}
26
27int
28caller_ref_1 (int &value)
29{
30    int increment = caller_ref_2(value); // In caller_ref_1.
31    value += increment; // At increment in caller_ref_1.
32    return value;
33}
34
35int
36caller_ref_2 (int &value)
37{
38    int increment = inline_ref_1 (value); // In caller_ref_2.
39    value += increment;  // At increment in caller_ref_2.
40    return value;
41}
42
43int
44called_by_inline_ref (int &value)
45{
46    value += 1; // In called_by_inline_ref.
47    return value;
48}
49
50int
51inline_ref_1 (int &value)
52{
53    int increment = inline_ref_2(value); // In inline_ref_1.
54    value += increment; // At increment in inline_ref_1.
55    return value;
56}
57
58int
59inline_ref_2 (int &value)
60{
61    int increment = called_by_inline_ref (value);  // In inline_ref_2.
62    value += 1; // At increment in inline_ref_2.
63    return value;
64}
65
66void
67caller_trivial_1 ()
68{
69    caller_trivial_2(); // In caller_trivial_1.
70    inline_value += 1;
71}
72
73void
74caller_trivial_2 ()
75{
76    inline_trivial_1 (); // In caller_trivial_2.
77    inline_value += 1;  // At increment in caller_trivial_2.
78}
79
80void
81called_by_inline_trivial ()
82{
83    inline_value += 1; // In called_by_inline_trivial.
84}
85
86void
87inline_trivial_1 ()
88{
89    inline_trivial_2(); // In inline_trivial_1.
90    inline_value += 1;  // At increment in inline_trivial_1.
91}
92
93void
94inline_trivial_2 ()
95{
96    inline_value += 1; // In inline_trivial_2.
97    called_by_inline_trivial (); // At caller_by_inline_trivial in inline_trivial_2.
98}
99
100int
101main (int argc, char **argv)
102{
103
104    inline_value = 0;    // Stop here and step over to set up stepping over.
105
106    inline_trivial_1 ();    // At inline_trivial_1 called from main.
107
108    caller_trivial_1();     // At first call of caller_trivial_1 in main.
109
110    caller_trivial_1();     // At second call of caller_trivial_1 in main.
111
112    caller_ref_1 (argc); // At first call of caller_ref_1 in main.
113
114    caller_ref_1 (argc); // At second call of caller_ref_1 in main.
115
116    function_to_call (); // Make sure debug info for this function gets generated.
117
118    return 0;            // About to return from main.
119}
120