#version 330 core

// cross-unit recursion

void main() {}

// two-level recursion

float cbar(int);

void cfoo(float)
{
	cbar(2);
}

// four-level, out of order

void CB();
void CD();
void CA() { CB(); }
void CC() { CD(); }

// high degree

void CBT();
void CDT();
void CAT() { CBT(); CBT(); CBT(); }
void CCT() { CDT(); CDT(); CBT(); }

// not recursive

void norA() {}
void norB() { norA(); }
void norC() { norA(); }
void norD() { norA(); }
void norE() { norB(); }
void norF() { norB(); }
void norG() { norE(); }
void norH() { norE(); }
void norI() { norE(); }

// not recursive, but with a call leading into a cycle if ignoring direction

void norcA() { }
void norcB() { norcA(); }
void norcC() { norcB(); }
void norcD() { norcC(); norcB(); } // head of cycle
void norcE() { norcD(); } // lead into cycle