[Issue 8640] Template struct/class member functions should compile conditionally

d-bugmail at puremagic.com d-bugmail at puremagic.com
Tue Sep 11 08:22:29 PDT 2012


http://d.puremagic.com/issues/show_bug.cgi?id=8640



--- Comment #2 from monarchdodra at gmail.com 2012-09-11 08:22:55 PDT ---
(In reply to comment #1)

Thanks for the reply.

> This is as designed. Doing otherwise would let a lot of bugs through.
> In fact one of the oldest open rejects-valid bug reports is a request to make
> the compiler check template functions even when they are NOT called.
> 
> There are strong reasons for the current behaviour.
> * This request would interact badly with functions which return auto (the
> compiler needs to compile them, to find out what the return type is).

*Does* it need to compile them if no-one calls them? Who cares what the return
value is, if there is no return value to be evaluated?

> * It's impossible for classes (you need to put the function into the vtable,
> regardless of whether it is called or not), making a new, surprising difference
> between classes and structs.

That is a good point, although arguably, it only holds for virtual vs final
methods. So there is no reason for the same behavior to also apply to the final
(non-virtual) methods of templated classes.

> Generally in these cases I just turn the function into a template function.
> 
> @property void front(Dummy = void)(T value)
>         {val = value;} //HERE
> 
> I never tested that with property functions though.

I had considered doing that, with the even simpler:

@property void front()(T value)
    {val = value;}

However, as pointed out by bearophile, this approach means this:
--------
struct C(T) {
    private T val;
    @property void front()(T value) {
        val = value;
    }
}
void main() {
    C!int ci;
    auto f = &ci.front; //Should be &ci.front!()
    assert(ci.val == 0);
    f(1);
    assert(ci.val == 1);
}
--------
Ceases to work. So it does have client-side impacts :'(

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------


More information about the Digitalmars-d-bugs mailing list