// Class to create "output" at compile time (error message)
template<int f> struct D {};

// Class to iterate all values a1, a2, ... am
template<int fa, int fb, int i>
struct Fib_Print {
	Fib_Print<fb, fa+fb, i-1> a;
	void f() { a.f(); D<fa> d = 0;  }
};

template<int fa, int fb>
struct Fib_Print<fa, fb, 0> {
	void f() {}
};

void foo() {
	Fib_Print<0, 1, 10> a;		// a0 = 0, a1 = 1, m = 10
	a.f();
}

/*
 * Template instantiations are O(n)
 * Error messages O(n^2)
 * Total complexity O(n^2)
 * 
 */

