October 01, 2018
I am trying my hand at contracts and they work fine in plain functions and in methods, but I can't make them work in interfaces.

https://dlang.org/spec/interface.html#interface-contracts

$ dmd --version
DMD64 D Compiler v2.081.1
Copyright (C) 1999-2018 by The D Language Foundation, All Rights Reserved written by Walter Bright


/////////////////////////
void main()
{
    WillBloop test = new WillBloop();
    // also tried
    // Blooper test = new WillBloop();
    // it compiles but the in contract does not seem enforced
    test.limited(-1); // this does not croak

    auto no_interface = new NoInterface();
    no_interface.limited(-10); // this works as expected
}

interface Blooper
{
    void limited(int some_other_name)
    in
    {
        assert(some_other_name > 0, "asssert failed in interface");
    }
}

class WillBloop : Blooper
{
    void limited(int a_name)    {
        import std.stdio : writeln;
        writeln(a_name);
    }
}

class NoInterface
{
    void limited(int another_name)
    in
    {
        assert(another_name > 0, "assert failed in NoInterface");
    }
    do
    {
        import std.stdio: writeln;
        writeln(another_name);
    }
}
October 01, 2018
On Monday, 1 October 2018 at 13:49:53 UTC, Emil wrote:
> I am trying my hand at contracts and they work fine in plain functions and in methods, but I can't make them work in interfaces.
>
> https://dlang.org/spec/interface.html#interface-contracts
>
> $ dmd --version
> DMD64 D Compiler v2.081.1
> Copyright (C) 1999-2018 by The D Language Foundation, All Rights Reserved written by Walter Bright
>
>
> /////////////////////////
> void main()
> {
>     WillBloop test = new WillBloop();
>     // also tried
>     // Blooper test = new WillBloop();
>     // it compiles but the in contract does not seem enforced
>     test.limited(-1); // this does not croak
>
>     auto no_interface = new NoInterface();
>     no_interface.limited(-10); // this works as expected
> }
>
> interface Blooper
> {
>     void limited(int some_other_name)
>     in
>     {
>         assert(some_other_name > 0, "asssert failed in interface");
>     }
> }
>
> class WillBloop : Blooper
> {
>     void limited(int a_name)    {
>         import std.stdio : writeln;
>         writeln(a_name);
>     }
> }
>
> class NoInterface
> {
>     void limited(int another_name)
>     in
>     {
>         assert(another_name > 0, "assert failed in NoInterface");
>     }
>     do
>     {
>         import std.stdio: writeln;
>         writeln(another_name);
>     }
> }

Yeah... had such problems too, a while ago.

https://forum.dlang.org/thread/sadsceubvapbeezjytdp@forum.dlang.org

Seems, that one of the tickets is closed, but the pull request is not merged. Don't know how matters stand with this, actually.