// PERMUTE_ARGS: -inline -g -O

extern(C) int printf(const char*, ...);

/*******************************************/

class A
{
    int x = 7;

    int foo(int i)
    in
    {
        printf("A.foo.in %d\n", i);
        assert(i == 2);
        assert(x == 7);
        printf("A.foo.in pass\n");
    }
    out (result)
    {
        assert(result & 1);
        assert(x == 7);
    }
    do
    {
        return i;
    }
}

class B : A
{
    override int foo(int i)
    in
    {
        float f;
        printf("B.foo.in %d\n", i);
        assert(i == 4);
        assert(x == 7);
        f = f + i;
    }
    out (result)
    {
        assert(result < 8);
        assert(x == 7);
    }
    do
    {
        return i - 1;
    }
}

void test1()
{
    auto b = new B();
    b.foo(2);
    b.foo(4);
}

/*******************************************/

class A2
{
    int x = 7;

    int foo(int i)
    in
    {
        printf("A2.foo.in %d\n", i);
        assert(i == 2);
        assert(x == 7);
        printf("A2.foo.in pass\n");
    }
    out (result)
    {
        assert(result & 1);
        assert(x == 7);
    }
    do
    {
        return i;
    }
}

class B2 : A2
{
    override int foo(int i)
    in
    {
        float f;
        printf("B2.foo.in %d\n", i);
        assert(i == 4);
        assert(x == 7);
        f = f + i;
    }
    out (result)
    {
        assert(result < 8);
        assert(x == 7);
    }
    do
    {
        return i - 1;
    }
}

class C : B2
{
    override int foo(int i)
    in
    {
        float f;
        printf("C.foo.in %d\n", i);
        assert(i == 6);
        assert(x == 7);
        f = f + i;
    }
    out (result)
    {
        assert(result == 1 || result == 3 || result == 5);
        assert(x == 7);
    }
    do
    {
        return i - 1;
    }
}

void test2()
{
    auto c = new C();
    c.foo(2);
    c.foo(4);
    c.foo(6);
}

/*******************************************/

void fun(int x)
in {
    if (x < 0) throw new Exception("a");
}
do {
}

void test3()
{
    fun(1);
}

/*******************************************/

interface Stack {
    int pop()
//   in { printf("pop.in\n"); }
    out(result) {
        printf("pop.out\n");
        assert(result == 3);
    }
}

class CC : Stack
{
    int pop()
    //out (result) { printf("CC.pop.out\n"); } do
    {
        printf("CC.pop.in\n");
        return 3;
    }
}

void test4()
{
    auto cc = new CC();
    cc.pop();
}

/*******************************************/

int mul100(int n)
out(result)
{
    assert(result == 500);
}
do
{
    return n * 100;
}

void test5()
{
    mul100(5);
}

/*******************************************/
// 3273

// original case
struct Bug3273
{
    ~this() {}
    invariant() {}
}

// simplest case
ref int func3273()
out(r)
{
    // Regression check of issue 3390
    static assert(!__traits(compiles, r = 1));
}
do
{
    static int dummy;
    return dummy;
}

void test6()
{
    func3273() = 1;
    assert(func3273() == 1);
}

/*******************************************/

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

class Bug3722A
{
    void fun() {}
}
class Bug3722B : Bug3722A
{
    override void fun() in { assert(false); } do {}
}

void test6()
{
    auto x = new Bug3722B();
    x.fun();
}
+/

/*******************************************/

auto test7foo()
in{
    ++cnt;
}do{
    ++cnt;
    return "str";
}

void test7()
{
    cnt = 0;
    assert(test7foo() == "str");
    assert(cnt == 2);
}

/*******************************************/

auto foo8()
out(r){
    ++cnt;
    assert(r == 10);
}do{
    ++cnt;
    return 10;
}

auto bar8()
out{
    ++cnt;
}do{
    ++cnt;
}

void test8()
{
    cnt = 0;
    assert(foo8() == 10);
    assert(cnt == 2);

    cnt = 0;
    bar8();
    assert(cnt == 2);
}

/*******************************************/
// from fail317

void test9()
{
  {
    auto f1 = function() do { }; // fine
    auto f2 = function() in { } do { }; // fine
    auto f3 = function() out { } do { }; // error
    auto f4 = function() in { } out { } do { }; // error

    auto d1 = delegate() do { }; // fine
    auto d2 = delegate() in { } do { }; // fine
    auto d3 = delegate() out { } do { }; // error
    auto d4 = delegate() in { } out { } do { }; // error
  }
  {
    auto f1 = function() body { }; // fine
    auto f2 = function() in { } body { }; // fine
    auto f3 = function() out { } body { }; // error
    auto f4 = function() in { } out { } body { }; // error

    auto d1 = delegate() body { }; // fine
    auto d2 = delegate() in { } body { }; // fine
    auto d3 = delegate() out { } body { }; // error
    auto d4 = delegate() in { } out { } body { }; // error
  }
}

/*******************************************/

auto test10() body { return 3; }
auto test11()() body { return 3; }

auto test12()
{
    auto test10() body { return 3; }
    auto test11()() body { return 3; }
    return 3;
}


void test13()
{
    int function() fp13;
}

/*******************************************/
// 4785

int cnt;

auto foo4785()
in{
    int r;
    ++cnt;
}
out(r){
    assert(r == 10);
    ++cnt;
}do{
    ++cnt;
    int r = 10;
    return r;
}
void test4785()
{
    cnt = 0;
    assert(foo4785() == 10);
    assert(cnt == 3);
}

/*******************************************/
// 5039

class C5039 {
    int x;

    invariant() {
        assert( x < int.max );
    }

    auto foo() {
        return x;
    }
}

/*******************************************/
// 5204

interface IFoo5204
{
    IFoo5204 bar()
    out {}
}
class Foo5204 : IFoo5204
{
    Foo5204 bar() { return null; }
}

/*******************************************/
// 6417

class Bug6417
{
    void bar()
    in
    {
        int i = 14;
        assert(i == 14);
        auto dg = (){
            //printf("in: i = %d\n", i);
            assert(i == 14, "in contract failure");
        };
        dg();
    }
    out
    {
        int j = 10;
        assert(j == 10);
        auto dg = (){
            //printf("out: j = %d\n", j);
            assert(j == 10, "out contract failure");
        };
        dg();
    }
    do {}
}

void test6417()
{
    (new Bug6417).bar();
}

/*******************************************/
// 6549

class C6549
{
    static int ocount = 0;
    static int icount = 0;

    abstract int foo(int)
    in { ++icount; }
    out { ++ocount; }
}

class CD6549 : C6549
{
    override int foo(int)
    in { assert(false); }
    do { return 10; }
}

abstract class D6549
{
    static int icount = 0;
    static int ocount = 0;

    int foo(int)
    in { ++icount; }
    out { ++ocount; }
}

class DD6549 : D6549
{
    override int foo(int)
    in { assert(false); }
    do { return 10; }
}

void test6549()
{
    auto c = new CD6549;
    c.foo(10);
    assert(C6549.icount == 1);
    assert(C6549.ocount == 1);

    auto d = new DD6549;
    d.foo(10);
    assert(D6549.icount == 1);
    assert(D6549.ocount == 1);
}

/*******************************************/
// 7218

void test7218()
{
  {
    size_t foo()  in{}  out{}  do{ return 0; } // OK
    size_t bar()  in{}/*out{}*/do{ return 0; } // OK
    size_t hoo()/*in{}*/out{}  do{ return 0; } // NG1
    size_t baz()/*in{}  out{}*/do{ return 0; } // NG2
  }
  {
    size_t goo()  in{}  out{}  body{ return 0; } // OK
    size_t gar()  in{}/*out{}*/body{ return 0; } // OK
    size_t gob()/*in{}*/out{}  body{ return 0; } // NG1
    size_t gaz()/*in{}  out{}*/body{ return 0; } // NG2
  }
}

/*******************************************/
// 7517

void test7517()
{
    static string result;

    interface I
    {
        static I self;

        void setEnable()
        in
        {
            assert(self is this);
            result ~= "I.setEnable.in/";
            assert(!enabled);
        }
        out
        {
            assert(self is this);
            result ~= "I.setEnable.out/";
            assert( enabled);
        }

        void setDisable()
        in
        {
            assert(self is this);
            result ~= "I.setDisable.in/";
            assert( enabled);
        }
        out
        {
            assert(self is this);
            result ~= "I.setDisable.out/";
            assert(!enabled);
        }

        @property bool enabled() const;
    }

    class C : I
    {
        static C self;

        void setEnable()
        in {}       // supply in-contract to invoke I.setEnable.in
        do
        {
            assert(self is this);
            result ~= "C.setEnable/";
            _enabled = true;
        }

        void setDisable()
        {
            assert(self is this);
            result ~= "C.setDisable/";
            _enabled = false;
        }

        @property bool enabled() const
        {
            assert(self is this);
            result ~= "C.enabled/";
            return _enabled;
        }

        bool _enabled;
    }

    C c = C.self = new C;
    I i = I.self = c;

    result = null;
    i.setEnable();
    assert(result == "I.setEnable.in/C.enabled/C.setEnable/I.setEnable.out/C.enabled/");

    result = null;
    i.setDisable();
    assert(result == "C.setDisable/I.setDisable.out/C.enabled/");
}

/*******************************************/
// 7699

class P7699
{
    void f(int n) in {
        assert (n);
    } do { }
}
class D7699 : P7699
{
    override void f(int n) in { } do { }
}

/*******************************************/
// 7883

// Segmentation fault
class AA7883
{
    int foo()
    out (r1) { }
    do { return 1; }
}

class BA7883 : AA7883
{
    override int foo()
    out (r2) { }
    do { return 1; }
}

class CA7883 : BA7883
{
    override int foo()
    do { return 1; }
}

// Error: undefined identifier r2, did you mean variable r3?
class AB7883
{
    int foo()
    out (r1) { }
    do { return 1; }
}

class BB7883 : AB7883
{
    override int foo()
    out (r2) { }
    do { return 1; }

}

class CB7883 : BB7883
{
    override int foo()
    out (r3) { }
    do { return 1; }
}

// Error: undefined identifier r3, did you mean variable r4?
class AC7883
{
    int foo()
    out (r1) { }
    do { return 1; }
}

class BC7883 : AC7883
{
    override int foo()
    out (r2) { }
    do { return 1; }
}

class CC7883 : BC7883
{
    override int foo()
    out (r3) { }
    do { return 1; }
}

class DC7883 : CC7883
{
    override int foo()
    out (r4) { }
    do { return 1; }
}

/*******************************************/
// 7892

struct S7892
{
    @disable this();
    this(int x) {}
}

S7892 f7892()
out (result) {}     // case 1
do
{
    return S7892(1);
}

interface I7892
{
    S7892 f();
}
class C7892
{
    invariant() {}  // case 2

    S7892 f()
    {
        return S7892(1);
    }
}

/*******************************************/
// 8066

struct CLCommandQueue
{
    invariant() {}

//private:
    int enqueueNativeKernel()
    {
        assert(0, "implement me");
    }
}

/*******************************************/
// 8073

struct Container8073
{
    int opApply (int delegate(ref int) dg) { return 0; }
}

class Bug8073
{
    static int test;
    int foo()
    out(r) { test = 7; } do
    {
        Container8073 ww;
        foreach( xxx ; ww ) {  }
        return 7;
    }

    ref int bar()
    out { } do
    {
        Container8073 ww;
        foreach( xxx ; ww ) {  }
        test = 7;
        return test;
    }
}
void test8073()
{
    auto c = new Bug8073();
    assert(c.foo() == 7);
    assert(c.test == 7);

    auto p = &c.bar();
    assert(p == &c.test);
    assert(*p == 7);
}

/*******************************************/
// 8093

void test8093()
{
    static int g = 10;
    static int* p;

    enum fdo = q{
        static struct S {
            int opApply(scope int delegate(ref int) dg) { return dg(g); }
        }
        S s;
        foreach (ref e; s)
            return g;
        assert(0);
    };

    ref int foo_ref1() out(r) { assert(&r is &g && r == 10); }
    do { mixin(fdo); }

    ref int foo_ref2()
    do { mixin(fdo); }

    { auto q = &foo_ref1(); assert(q is &g && *q == 10); }
    { auto q = &foo_ref2(); assert(q is &g && *q == 10); }

    int foo_val1() out(r) { assert(&r !is &g && r == 10); }
    do { mixin(fdo); }

    int foo_val2()
    do { mixin(fdo); }

    { auto n = foo_val1(); assert(&n !is &g && n == 10); }
    { auto n = foo_val2(); assert(&n !is &g && n == 10); }
}

/*******************************************/
// 9383

class A9383
{
    static void delegate() dg;
    static int val;

    void failInBase() { assert(typeid(this) is typeid(A9383)); }

    // in-contract tests
    void foo1(int i) in  { A9383.val = i; failInBase; } do { }                        // no closure
    void foo2(int i) in  { A9383.val = i; failInBase; } do { int x; dg = { ++x; }; }  // closure [local]
    void foo3(int i) in  { A9383.val = i; failInBase; } do {        dg = { ++i; }; }  // closure [parameter]
    void foo4(int i) in  { A9383.val = i; failInBase; } do { }                        // no closure
    void foo5(int i) in  { A9383.val = i; failInBase; } do { }                        // no closure
    void foo6(int i) in  { A9383.val = i; failInBase; } do { int x; dg = { ++x; }; }  // closure [local]
    void foo7(int i) in  { A9383.val = i; failInBase; } do {        dg = { ++i; }; }  // closure [parameter]

    // out-contract tests
    void bar1(int i) out { A9383.val = i;             } do { }                        // no closure
    void bar2(int i) out { A9383.val = i;             } do { int x; dg = { ++x; }; }  // closure [local]
    void bar3(int i) out { A9383.val = i;             } do {        dg = { ++i; }; }  // closure [parameter]
    void bar4(int i) out { A9383.val = i;             } do { }                        // no closure
    void bar5(int i) out { A9383.val = i;             } do { }                        // no closure
    void bar6(int i) out { A9383.val = i;             } do { int x; dg = { ++x; }; }  // closure [local]
    void bar7(int i) out { A9383.val = i;             } do {        dg = { ++i; }; }  // closure [parameter]
}

class B9383 : A9383
{
    static int val;

    // in-contract tests
    override void foo1(int i) in  { B9383.val = i; } do { }                           // -> no closure
    override void foo2(int i) in  { B9383.val = i; } do { int x; dg = { ++x; }; }     // -> closure [local] appears
    override void foo3(int i) in  { B9383.val = i; } do {        dg = { ++i; }; }     // -> closure [parameter]
    override void foo4(int i) in  { B9383.val = i; } do { int x; dg = { ++x; }; }     // -> closure [local] appears
    override void foo5(int i) in  { B9383.val = i; } do {        dg = { ++i; }; }     // -> closure [parameter] appears
    override void foo6(int i) in  { B9383.val = i; } do { }                           // -> closure [local] disappears
    override void foo7(int i) in  { B9383.val = i; } do { }                           // -> closure [parameter] disappears

    // out-contract tests
    override void bar1(int i) out { B9383.val = i; } do { }                           // -> no closure
    override void bar2(int i) out { B9383.val = i; } do { int x; dg = { ++x; }; }     // -> closure [local] appears
    override void bar3(int i) out { B9383.val = i; } do {        dg = { ++i; }; }     // -> closure [parameter]
    override void bar4(int i) out { B9383.val = i; } do { int x; dg = { ++x; }; }     // -> closure [local] appears
    override void bar5(int i) out { B9383.val = i; } do {        dg = { ++i; }; }     // -> closure [parameter] appears
    override void bar6(int i) out { B9383.val = i; } do { }                           // -> closure [local] disappears
    override void bar7(int i) out { B9383.val = i; } do { }                           // -> closure [parameter] disappears
}

void test9383()
{
    auto a = new A9383();
    auto b = new B9383();

    // base class in-contract is used from derived class.       // base                   derived
    b.foo1(101); assert(A9383.val == 101 && B9383.val == 101);  // no closure          -> no closure
    b.foo2(102); assert(A9383.val == 102 && B9383.val == 102);  // closure [local]     -> closure [local] appears
    b.foo3(103); assert(A9383.val == 103 && B9383.val == 103);  // closure [parameter] -> closure [parameter]
    b.foo4(104); assert(A9383.val == 104 && B9383.val == 104);  // no closure          -> closure [local] appears
    b.foo5(105); assert(A9383.val == 105 && B9383.val == 105);  // no closure          -> closure [parameter] appears
    b.foo6(106); assert(A9383.val == 106 && B9383.val == 106);  // closure [local]     -> closure [local] disappears
    b.foo7(107); assert(A9383.val == 107 && B9383.val == 107);  // closure [parameter] -> closure [parameter] disappears

    // base class out-contract is used from derived class.      // base                   derived
    b.bar1(101); assert(A9383.val == 101 && B9383.val == 101);  // no closure          -> no closure
    b.bar2(102); assert(A9383.val == 102 && B9383.val == 102);  // closure [local]     -> closure [local] appears
    b.bar3(103); assert(A9383.val == 103 && B9383.val == 103);  // closure [parameter] -> closure [parameter]
    b.bar4(104); assert(A9383.val == 104 && B9383.val == 104);  // no closure          -> closure [local] appears
    b.bar5(105); assert(A9383.val == 105 && B9383.val == 105);  // no closure          -> closure [parameter] appears
    b.bar6(106); assert(A9383.val == 106 && B9383.val == 106);  // closure [local]     -> closure [local] disappears
    b.bar7(107); assert(A9383.val == 107 && B9383.val == 107);  // closure [parameter] -> closure [parameter] disappears

    // in-contract in base class.
    a.foo1(101); assert(A9383.val == 101);      // no closure
    a.foo2(102); assert(A9383.val == 102);      // closure [local]
    a.foo3(103); assert(A9383.val == 103);      // closure [parameter]

    // out-contract in base class.
    a.bar1(101); assert(A9383.val == 101);      // no closure
    a.bar2(102); assert(A9383.val == 102);      // closure [local]
    a.bar3(103); assert(A9383.val == 103);      // closure [parameter]
}

/*******************************************/
// 15524 - Different from issue 9383 cases, closed variable size is bigger than REGSIZE.

class A15524
{
    static void delegate() dg;
    static string val;

    void failInBase() { assert(typeid(this) is typeid(A15524)); }

    // in-contract tests
    void foo1(string s) in  { A15524.val = s; failInBase; } do { }                                // no closure
    void foo2(string s) in  { A15524.val = s; failInBase; } do { string x; dg = { x = null; }; }  // closure [local]
    void foo3(string s) in  { A15524.val = s; failInBase; } do {           dg = { s = null; }; }  // closure [parameter]
    void foo4(string s) in  { A15524.val = s; failInBase; } do { }                                // no closure
    void foo5(string s) in  { A15524.val = s; failInBase; } do { }                                // no closure
    void foo6(string s) in  { A15524.val = s; failInBase; } do { string x; dg = { x = null; }; }  // closure [local]
    void foo7(string s) in  { A15524.val = s; failInBase; } do {           dg = { s = null; }; }  // closure [parameter]

    // out-contract tests
    void bar1(string s) out { A15524.val = s;             } do { }                                // no closure
    void bar2(string s) out { A15524.val = s;             } do { string x; dg = { x = null; }; }  // closure [local]
    void bar3(string s) out { A15524.val = s;             } do {           dg = { s = null; }; }  // closure [parameter]
    void bar4(string s) out { A15524.val = s;             } do { }                                // no closure
    void bar5(string s) out { A15524.val = s;             } do { }                                // no closure
    void bar6(string s) out { A15524.val = s;             } do { string x; dg = { x = null; }; }  // closure [local]
    void bar7(string s) out { A15524.val = s;             } do {           dg = { s = null; }; }  // closure [parameter]
}

class B15524 : A15524
{
    static string val;

    // in-contract tests
    override void foo1(string s) in  { B15524.val = s; } do { }                                   // -> no closure
    override void foo2(string s) in  { B15524.val = s; } do { string x; dg = { x = null; }; }     // -> closure [local] appears
    override void foo3(string s) in  { B15524.val = s; } do {           dg = { s = null; }; }     // -> closure [parameter]
    override void foo4(string s) in  { B15524.val = s; } do { string x; dg = { x = null; }; }     // -> closure [local] appears
    override void foo5(string s) in  { B15524.val = s; } do {           dg = { s = null; }; }     // -> closure [parameter] appears
    override void foo6(string s) in  { B15524.val = s; } do { }                                   // -> closure [local] disappears
    override void foo7(string s) in  { B15524.val = s; } do { }                                   // -> closure [parameter] disappears

    // out-contract tests
    override void bar1(string s) out { B15524.val = s; } do { }                                   // -> no closure
    override void bar2(string s) out { B15524.val = s; } do { string x; dg = { x = null; }; }     // -> closure [local] appears
    override void bar3(string s) out { B15524.val = s; } do {           dg = { s = null; }; }     // -> closure [parameter]
    override void bar4(string s) out { B15524.val = s; } do { string x; dg = { x = null; }; }     // -> closure [local] appears
    override void bar5(string s) out { B15524.val = s; } do {           dg = { s = null; }; }     // -> closure [parameter] appears
    override void bar6(string s) out { B15524.val = s; } do { }                                   // -> closure [local] disappears
    override void bar7(string s) out { B15524.val = s; } do { }                                   // -> closure [parameter] disappears
}

void test15524()
{
    auto a = new A15524();
    auto b = new B15524();

    // base class in-contract is used from derived class.           // base                   derived
    b.foo1("1"); assert(A15524.val == "1" && B15524.val == "1");    // no closure          -> no closure
    b.foo2("2"); assert(A15524.val == "2" && B15524.val == "2");    // closure [local]     -> closure [local] appears
    b.foo3("3"); assert(A15524.val == "3" && B15524.val == "3");    // closure [parameter] -> closure [parameter]
    b.foo4("4"); assert(A15524.val == "4" && B15524.val == "4");    // no closure          -> closure [local] appears
    b.foo5("5"); assert(A15524.val == "5" && B15524.val == "5");    // no closure          -> closure [parameter] appears
    b.foo6("6"); assert(A15524.val == "6" && B15524.val == "6");    // closure [local]     -> closure [local] disappears
    b.foo7("7"); assert(A15524.val == "7" && B15524.val == "7");    // closure [parameter] -> closure [parameter] disappears

    // base class out-contract is used from derived class.          // base                   derived
    b.bar1("1"); assert(A15524.val == "1" && B15524.val == "1");    // no closure          -> no closure
    b.bar2("2"); assert(A15524.val == "2" && B15524.val == "2");    // closure [local]     -> closure [local] appears
    b.bar3("3"); assert(A15524.val == "3" && B15524.val == "3");    // closure [parameter] -> closure [parameter]
    b.bar4("4"); assert(A15524.val == "4" && B15524.val == "4");    // no closure          -> closure [local] appears
    b.bar5("5"); assert(A15524.val == "5" && B15524.val == "5");    // no closure          -> closure [parameter] appears
    b.bar6("6"); assert(A15524.val == "6" && B15524.val == "6");    // closure [local]     -> closure [local] disappears
    b.bar7("7"); assert(A15524.val == "7" && B15524.val == "7");    // closure [parameter] -> closure [parameter] disappears

    // in-contract in base class.
    a.foo1("1"); assert(A15524.val == "1");     // no closure
    a.foo2("2"); assert(A15524.val == "2");     // closure [local]
    a.foo3("3"); assert(A15524.val == "3");     // closure [parameter]

    // out-contract in base class.
    a.bar1("1"); assert(A15524.val == "1");     // no closure
    a.bar2("2"); assert(A15524.val == "2");     // closure [local]
    a.bar3("3"); assert(A15524.val == "3");     // closure [parameter]
}

void test15524a()
{
    auto t1 = new Test15524a();
    t1.infos["first"] = 0; //t1.add("first");
    t1.add("second");

    auto t2 = new Test15524b();
    t2.add("second");
}

class Test15524a
{
    int[string] infos;

    void add(string key)
    in
    {
        assert(key !in infos); // @@@ crash here at second
    }
    do
    {
        auto item = new class
        {
            void notCalled()
            {
                infos[key] = 0;
                    // affects, key parameter is made a closure variable.
            }
        };
    }
}

class Test15524b
{
    void add(string key)
    in
    {
        assert(key == "second"); // @@@ fails
    }
    do
    {
        static void delegate() dg;
        dg = { auto x = key; };
            // affects, key parameter is made a closure variable.
    }
}

/*******************************************/
// 10479

class B10479
{
    B10479 foo()
    out { } do { return null; }
}

class D10479 : B10479
{
    override D10479 foo() { return null; }
}

/*******************************************/
// 10596

class Foo10596
{
    auto bar()
    out (result) { }
    do { return 0; }
}

/*******************************************/
// 10721

class Foo10721
{
    this()
    out { }
    do { }

    ~this()
    out { }
    do { }
}

struct Bar10721
{
    this(this)
    out { }
    do { }
}

/*******************************************/
// 10981

class C10981
{
    void foo(int i) pure
    in { assert(i); }
    out { assert(i); }
    do {}
}

/*******************************************/
// 14779

class C14779
{
    final void foo(int v)
    in  { assert(v == 0); }
    out { assert(v == 0); }
    do
    {
    }
}

void test14779()
{
    auto c = new C14779();
    c.foo(0);
}

/*******************************************/

//******************************************/
// DIP 1009

int dip1009_1(int x)
  in  (x > 0, "x must be positive!")
  out (r; r < 0, "r must be negative!")
  in (true, "cover trailing comma case",)
  out (; true, "cover trailing comma case",)
{
    return -x;
}

int dip1009_2(int x)
  in  (x > 0)
  out (r; r < 0)
{
    return -x;
}

int dip1009_3(int x)
in  (x > 0,)
out (r; r < 0,)
do
{
    return -x;
}

void dip1009_4(int x)
  in  (x > 0)
  out (; x > 1)
{
    x += 1;
}

interface DIP1009_5
{
    void dip1009_5(int x)
      in  (x > 0)
      out (; x > 1);
}

int dip1009_6(int x, int y)
  in  (x > 0)
  out (r; r > 1)
  out (; x > 0)
  in  (y > 0)
  in  (x + y > 1)
  out (r; r > 1)
{
    return x+y;
}

int dip1009_7(int x)
  in (x > 0)
  in { assert(x > 1); }
  out { assert(x > 2); }
  out (; x > 3)
  out (r; r > 3)
{
    x += 2;
    return x;
}

class DIP1009_8
{
    private int x = 4;
    invariant (x > 0, "x must stay positive");
    invariant (x > 1, "x must be greater than one",);
    invariant (x > 2);
    invariant (x > 3,);
    void foo(){ x = 5; }
}

/*******************************************/

int main()
{
    test1();
    test2();
    test3();
    test4();
    test5();
//    test6();
    test7();
    test8();
    test9();
    test4785();
    test6417();
    test6549();
    test7218();
    test7517();
    test8073();
    test8093();
    test9383();
    test15524();
    test15524a();
    test14779();
    dip1009_1(1);
    dip1009_2(1);
    dip1009_3(1);
    dip1009_4(1);
    dip1009_6(1, 1);
    dip1009_7(3);
    new DIP1009_8().foo();

    printf("Success\n");
    return 0;
}
