reference, declarationdefinition
definition → references, declarations, derived classes, virtual overrides
reference to multiple definitions → definitions
unreferenced
    1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77
   78
   79
   80
   81
   82
   83
   84
   85
   86
   87
   88
   89
   90
   91
   92
   93
   94
   95
   96
   97
   98
   99
  100
  101
  102
  103
  104
  105
  106
  107
  108
  109
  110
  111
  112
  113
  114
  115
  116
  117
  118
  119
  120
  121
  122
  123
  124
  125
  126
  127
  128
  129
  130
  131
  132
  133
  134
  135
  136
#include <algorithm>
#include <cstdio>
#include <string>

inline int inline_ref_1 (int &value) __attribute__((always_inline));
inline int inline_ref_2 (int &value) __attribute__((always_inline));

int caller_ref_1 (int &value);
int caller_ref_2 (int &value);

int called_by_inline_ref (int &value);

inline void inline_trivial_1 () __attribute__((always_inline));
inline void inline_trivial_2 () __attribute__((always_inline));

void caller_trivial_1 ();
void caller_trivial_2 ();

void called_by_inline_trivial ();

static int inline_value;

int 
function_to_call ()
{
    return inline_value;
}

int
caller_ref_1 (int &value)
{
    int increment = caller_ref_2(value); // In caller_ref_1.
    value += increment; // At increment in caller_ref_1.
    return value;
}

int
caller_ref_2 (int &value)
{
    int increment = inline_ref_1 (value); // In caller_ref_2.
    value += increment;  // At increment in caller_ref_2.
    return value;
}

int
called_by_inline_ref (int &value)
{
    value += 1; // In called_by_inline_ref.
    return value;
}

int
inline_ref_1 (int &value)
{
    int increment = inline_ref_2(value); // In inline_ref_1.
    value += increment; // At increment in inline_ref_1.
    return value;
}

int
inline_ref_2 (int &value)
{
    int increment = called_by_inline_ref (value);  // In inline_ref_2.
    value += 1; // At increment in inline_ref_2.
    return value; 
}

void
caller_trivial_1 ()
{
    caller_trivial_2(); // In caller_trivial_1.
    inline_value += 1; 
}

void
caller_trivial_2 ()
{
    inline_trivial_1 (); // In caller_trivial_2.
    inline_value += 1;  // At increment in caller_trivial_2.
}

void
called_by_inline_trivial ()
{
    inline_value += 1; // In called_by_inline_trivial.
}

void
inline_trivial_1 ()
{
    inline_trivial_2(); // In inline_trivial_1.
    inline_value += 1;  // At increment in inline_trivial_1.
}

void
inline_trivial_2 ()
{
    inline_value += 1; // In inline_trivial_2.
    called_by_inline_trivial (); // At caller_by_inline_trivial in inline_trivial_2.
}

template<typename T> T
max_value(const T& lhs, const T& rhs)
{
    return std::max(lhs, rhs); // In max_value template
}

template<> std::string
max_value(const std::string& lhs, const std::string& rhs)
{
    return (lhs.size() > rhs.size()) ? lhs : rhs; // In max_value specialized
}

int
main (int argc, char **argv)
{
    
    inline_value = 0;    // Stop here and step over to set up stepping over.

    inline_trivial_1 ();    // At inline_trivial_1 called from main.

    caller_trivial_1();     // At first call of caller_trivial_1 in main.
    
    caller_trivial_1();     // At second call of caller_trivial_1 in main.
    
    caller_ref_1 (argc); // At first call of caller_ref_1 in main.
    
    caller_ref_1 (argc); // At second call of caller_ref_1 in main. 
    
    function_to_call (); // Make sure debug info for this function gets generated.
    
    max_value(123, 456);                                // Call max_value template
    max_value(std::string("abc"), std::string("0022")); // Call max_value specialized

    return 0;            // About to return from main.
}