--- Comment #9 from SHOO <> 2012-01-17 06:37:31 PST ---
By the way, the reason why I set this Issue with regression is that I cause a
difficult problem with the following cases:

import std.stdio, std.functional;

// Library code
struct Control {
    alias void delegate(Control o) Handler;
    Handler[] _handlers;

    void addHandler(H)(H hnd) {
        _handlers ~= cast(Handler)hnd;

    void addHandler2(H)(H hnd) if (is(H == delegate)) {
        _handlers ~= cast(Handler)hnd;

    // Workaround. It is settled if can handle either by toDelegate.
    void addHandler3(H)(H hnd) {
        _handlers ~= cast(Handler)toDelegate(hnd);

    void call() {
        foreach (h; _handlers) {

// User code
void main() {
    int i;
    auto c = new Control;
    // OK. This literal is inferred delegate.
    c.addHandler( (Object o){ writeln(i); } );

    // Error. This literal is inferred function pointer.
//    c.addHandler( (Object o){ writeln("test"); } );

    // Error. This literal is inferred function pointer, too.
    // The constraint-if does not influence the type inference.
//    c.addHandler2( (Object o){ writeln("test2"); } );

    // Workaround.
    c.addHandler3( (Object o){ writeln("test3"); } );;

When a library code has a definition such as Control, many breaking changes
befall user codes.
Actually, this way is used by DFL.

One of simple workaround is to use toDelegate with library codes.

I think that another solution is to let implicit conversion perform a role as

I remember it has entered ML agenda several times. But I've forgotten the
Is there a person knowing the details?

Configure issuemail:
------- You are receiving this mail because: -------

Reply via email to