Proposal: Treat static assert in template as instantiation error

Don Clugston dac at nospam.com.au
Tue Aug 29 01:38:48 PDT 2006


Kirk McDonald wrote:
> Currently, in dmd, if there is an error instantiating a template, the 
> compiler will quite helpfully print out a traceback to the original 
> point of instantiation:
> It is then pretty clear what the problem is. (You can't pass a char[] to 
[snip]
> By throwing a static assert, the compiler aborts compilation 
> immediately, and the traceback information is lost. It is no longer 
> obvious where the template was originally instantiated from.

I was also going to post on the same issue. The 'sudden death' static 
assert was my idea, but we still need to know how it was triggered.
One problem with a naive traceback is that if you're not careful, you 
get the same kind of verbal diarrhea that C++ suffers from (and those 
error messages really are excrement). In particular, once a static 
assert has failed, *all* that should be printed is the traceback, not 
any new error messages.

As a minimum, a failed static assert should print the file and line 
number that the outermost template was originally instantiated from; 
that would probably be adequate for users of template libraries. A 
proper traceback would be even better, except for recursive template 
instantiations. But I think that it's important that once an assert has 
failed, no new errors should be generated ('error instantiating' is OK, 
but nothing else), and the compiler should not attempt to compile any 
further templates.

> I propose that if a static assert is thrown from within a template, that 
> it be treated as a failed template instantiation. This would (the hope 
> is) result in the instantiation traceback being printed out. It would 
> allow coders to explicitly cause their templates to fail in a way that 
> is informative: Users would get both the message in the static assert as 
> well as the traceback information. I am sure this would be a great boon 
> to anyone writing or using template code.




More information about the Digitalmars-d mailing list