Search code examples
c++templatesmetaprogrammingc1001

Just introducing myself to TMPing, and came across a quirk


I was just trying to learn the syntax of the beginner things, and how it worked when I was making this short bit of code in VS2008. The code below works in adding numbers 1 to 499, but if I add 1 to 500, the compiler bugs out giving me:

fatal error C1001: An internal error has occurred in the compiler.

And I was just wondering why that is. Is there some limit to how much code the compiler can generate or something and it just happened to be a nice round number of 500 for me?

#include <iostream>
using namespace std;

template < int b >
struct loop {
    enum { sum = loop< b - 1 >::sum + b };
};

template <>
struct loop< 0 > {
    enum { sum = 0 };
};

int main() {
    cout << "Adding the numbers from 1 to 499 = " << loop< 499 >::sum << endl;
    return 0;
}

Solution

  • I assume with gcc (and by extension g++) the default maximum template recursion depth is 500 as at least on my machine I managed to reproduce your problems with a (slightly better) warning message. Compiling loop<500>::sum worked fine but trying to compile loop<501>::sum failed.

    If you are using gcc (or g++) the solution is to compile it with -ftemplate-depth-## (Where ## is the maximum allowed depth).

    So for example to compile main.cpp with a maximum template recursion depth of 2000

    g++ -ftemplate-depth-2000 main.cpp
    

    Or convert the code to this:

    template < int b >
    struct loop {
        enum { sum = (b*(b+1))/2 };
    };
    

    (But I will admit the above code doesn't help you learn about template metaprogramming)