Proposal: Treat static assert in template as instantiation error

BCS BCS at pathlink.com
Tue Aug 29 08:27:21 PDT 2006


Don Clugston wrote:
> 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.
> 

What about

template foo(int i)
{	//                             v---
	static assert(i>0, "value "~itoa!(i) ~" !> 0");
}



More information about the Digitalmars-d mailing list