[dmd-beta] dmd 2.051 beta
Walter Bright
walter at digitalmars.com
Sun Dec 19 22:11:17 PST 2010
Ok, this is a *very* hard problem to track down, as it is subtly
dependent on the order of instantiations. The problem is that
std.array.Appender has 3 put() member templates. We are only concerned
with the first and last one. If we pass an argument of type:
char[]
to put(), it winds up tripping the recursive constraint detection in
template.c, causing the constraint to fail, and the put() template is
not instantiated.
The recursive part is not actually in the template constraint, it is in
the body of put(). So it only happens when semantic3() is called on the
template instantiation while inside the constraint of another
instantiation. The reason for the erratic nature of the bug happening is
that if semantic3() has already been called for the instantiation, it
isn't called again. Also, sometimes the call to semantic3() is deferred
to another module, or is deferred for other reasons, and so the error
doesn't happen.
I thought about fixing the template so it wasn't recursive, but then
thought this mysterious error would crop up elsewhere and confound the
next person. So that was out. I still thought it best to eagerly attempt
to do semantic3(). But bugzilla 4072 is the reason for the recursive
protection code in the first place.
Finally, I decided upon a rather hackish solution - let the recursion
detection code run a couple times before it trips. It doesn't seem
right, but I can't think of anything better at the moment.
More information about the dmd-beta
mailing list