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