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