Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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;
}
like image 673
Justen Avatar asked Dec 17 '22 01:12

Justen


2 Answers

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)

like image 93
Yacoby Avatar answered Dec 24 '22 00:12

Yacoby


VC9 (VS2008) crashes with numbers > 499. The code itself is valid and compilers are even permitted to stop compilation after a certain amount of recursive instantiations, giving a diagnostic. However, an Internal Compiler Error (colloquially also called ICE) certainly isn't a nice diagnostic.

An ICE is always an error of the compiler. It might be caused by an error in the code, too, but if that's the case, then the compiler failed to show a proper diagnostic for that error. If the error is reproducible, you should submit a bug report to the compiler vendor, so they can fix their error.

When reporting such an error (here or elsewhere) you should never fail to provide the exact compiler version you used.

like image 22
sbi Avatar answered Dec 24 '22 01:12

sbi