// REQUIRED_ARGS: -unittest
// https://issues.dlang.org/show_bug.cgi?id=4375
// disallow dangling else
void main() {
	if (true) {
		if (false) {
			assert(1);
		} else {
			assert(2);
		}
	}
    if (true) {
        if (false)
            assert(7);
    } else
        assert(8);
    if (true) {
        if (false)
            assert(9);
        else
            assert(10);
    }
    {
        if (true)
            assert(11);
        else
            assert(12);
    }
    {
label1:
        if (true)
            assert(13);
        else
            assert(14);
    }
	if (true)
		foreach (i; 0 .. 5) {
			if (true)
				assert(17);
            else
                assert(18);
        }
	if (true) {
		foreach (i; 0 .. 5)
			if (true)
				assert(18.1);
    } else
        assert(18.2);
    if (true)
        assert(19);
    else
        assert(20);
    if (true)
        assert(21);
    else if (false)
        assert(22);
    else
        assert(23);
    version (A) {
        if (true)
            assert(26);
    } else
        assert(27);
    version (A) {
        if (true)
            assert(28);
        else
            assert(29);
    }
    version (A)
        assert(30);
    else version (B)
        assert(31);
    else
        assert(32);
    static if (true) {
        static if (true)
            assert(35);
    } else
        assert(36);
    static if (true) {
        static if (true)
            assert(37);
        else
            assert(38);
    }
    static if (true)
        assert(39);
    else static if (true)
        assert(40);
    else
        assert(41);
    switch (4) {
        case 0:
            if (true)
                assert(42);
            else
                assert(43);
            break;
        case 1: .. case 5:
            if (true)
                assert(44);
            else
                assert(45);
            break;
        default:
            if (true)
                assert(46);
            else
                assert(47);
            break;
    }
    // (o_O)
    switch (1)
        default:
            if (true)
                assert(113);
            else
                assert(114);
    // (o_O)
    final switch (1)
        case 1:
            if (true)
                assert(117);
            else
                assert(118);
    mixin(q{
        if (true)
            assert(56);
        else
            assert(57);
    });
    while (false)
        if (true)
            assert(66);
        else
            assert(67);
    if (true)
        while (false)
            assert(68);
    else
        assert(69);
    do
        if (true)
            assert(72);
        else
            assert(73);
    while (false);
    if (true)
        do
            if (true)
                assert(74);
            else
                assert(75);
        while (false);
    for (
        if (true)        // (o_O)
            assert(78);
        else
            assert(79);
        false;
    )
        if (true)
            assert(80);
        else
            assert(81);
    if (true)
        for (if (true) assert(84); else assert(85); false;)
            assert(86);
    if (true)
        if (true)
            if (true)
                if (true)
                    if (true)
                        assert(87);
    auto x = new C;
    if (true)
        while (false)
            for (;;)
                scope (exit)
                    synchronized (x)
                        assert(88);
    else
        assert(89);
    if (true)
        while (false)
            for (;;) {
                scope (exit)
                    synchronized (x)
                        if (true)
                            assert(90);
                        else
                            assert(89);
            }
    if (true)
        while (false)
            for (;;)
                scope (exit)
                    synchronized (x)
                        if (true)
                            assert(90);
                        else
                            assert(89);
    else
        assert(12);
    with (x)
        if (false)
            assert(92);
        else
            assert(93);
    try
        if (true)
            assert(94);
        else
            assert(95);
    catch (Exception e)
        if (true)
            assert(96);
        else
            assert(97);
    finally
        if (true)
            assert(98);
        else
            assert(99);
    if (true)
        try
            if (true)
                assert(100);
            else
                assert(101);
        finally
            assert(102);
    if (true)
        try
            assert(109);
        catch(Exception e)
            if (true)
                assert(110);
            else
                assert(112);
        finally
            assert(111);
    static struct F {
        static if (true)
            int x;
        else
            int y;
        static if (true) {
            static if (false)
                int z;
        } else
            int w;
        static if (true)
            int t;
        else static if (false)
            int u;
        else
            int v;
    }
    if (true)
        if (true)
            assert(113);
        else
            assert(114);
    else
        assert(115);
    static if (true)
        static if (true)
            assert(116);
        else
            assert(117);
    else
        assert(118);
}
unittest {
    if (true)
        assert(50);
    else
        assert(51);
}
class C {
    invariant() {
        if (true)
            assert(58);
        else
            assert(59);
    }
    int f()
    in {
        if (true)
            assert(60);
        else
            assert(61);
    }
    out(res) {
        if (true)
            assert(62);
        else
            assert(63);
    }
    do {
        if (true)
            assert(64);
        else
            assert(65);
        return 0;
    }
}
enum q = q{
    if(true)
        if(true)
            assert(54.1);
    else
        assert(55.2);
};
static if (true)
    struct F0 {}
else static if (true)
    struct F1 {}
else
    struct F2 {}
static if (true) {
    static if (false)
        struct F3 {}
} else
    struct F4 {}
version(A) {
    version(B)
        struct F5 {}
} else
    struct F6 {}
version(A) {
    version(B)
        struct F5a {}
    else
        struct F5b {}
}
version (C)
    struct F5c {}
else
    struct F5d {}
struct F7 {
    static if (true)
        int x;
    else
        float x;
private:
    static if (true)
        int y;
    else
        float y;
}
template F8() {
    static if (true)
        int x;
    else
        float x;
}
static if (true)
    align(1)
        static if (false)
            struct F9 {}
static if (true)
    align(1) {
        extern(C)
            pure
                static if (false)
                    void F10(){}
                else
                    void F11(){}
    }
void f() {
    int[] x;
    static if (5 > 0)
        version (Y)
            scope (failure)
                foreach (i, e; x)
                    while (i > 20)
                        with (e)
                            if (e < 0)
                                synchronized(e)
                                    assert(1);
                            else
                                assert(2);
        else
            x = null;
    else
        x = null;
}