/*
TEST_OUTPUT:
---
pure nothrow @safe Object(bool b)
pure nothrow @safe int*(bool b)
pure nothrow @safe int[](bool b)
---

RUN_OUTPUT:
---
Success
---
*/
extern (C) int printf(const(char*) fmt, ...);

alias typeof(null) null_t;

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

void test1()
{
    null_t null1;
    typeof(null) null2;

    static assert(is(typeof(null1) == typeof(null)));
    static assert(is(typeof(null2) == typeof(null)));

    static assert(is(typeof(null1) == null_t));
    static assert(is(typeof(null2) == null_t));
}

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

interface I{}
class C{}

int f(null_t)   { return 1; }
int f(int[])    { return 2; }
int f(C)        { return 3; }

void test2()
{
    static assert(is(null_t : C));
    static assert(is(null_t : I));
    static assert(is(null_t : int[]));
    static assert(is(null_t : void*));
    static assert(is(null_t : int**));

    static assert(!is(null_t == C));
    static assert(!is(null_t == I));
    static assert(!is(null_t == int[]));
    static assert(!is(null_t == void*));
    static assert(!is(null_t == int**));

    static assert(is(null_t == null_t));

    assert(f(null) == 1);
}

/**********************************************/
// 5899

auto f5899(bool b)
{
    if (b)
        return new Object;
    else
        return null;
}
static assert(is(typeof(f5899) R == return) && is(R == Object));
pragma(msg, typeof(f5899));

auto g5899(bool b)
{
    if (b)
        return new int;
    else
        return null;
}
static assert(is(typeof(g5899) R == return) && is(R == int*));
pragma(msg, typeof(g5899));

auto h5899(bool b)
{
    if (b)
        return [1];
    else
        return null;
}
static assert(is(typeof(h5899) R == return) && is(R == int[]));
pragma(msg, typeof(h5899));

/**********************************************/
// 7278

struct Foo7278(string s)
{
    string var;
    void func()
    {
        string local = var;
    }
}

void test7278()
{
    Foo7278!null a;
    Foo7278!null b;
}

/**********************************************/
// 8221

class A8221
{
    A8221 foo() { return this; }
}
class B8221: A8221
{
    override typeof(null) foo() { return null; } // error
}
void test8221()
{
    auto a = new A8221();
    assert(a.foo() is a);
    auto b = new B8221();
    assert(b.foo() is null);
    a = b;
    assert(a.foo() is null);
}

/***************************************************/
// 8589

void test8589()
{
    static typeof(null) retnull() { return null; }

    void test(bool result, T)()
    {
        void f(T function() dg) { assert(!dg()); }

        static assert((is(typeof(null) function() : T function())) == result);
        static assert(is(typeof( f(&retnull) )) == result);
        static assert(is(typeof( f(()=>null) )) == result);
        static if (result)
        {
            f(&retnull);
            f(()=>null);
        }
    }
    test!(true,  int*)();
    test!(true,  Object)();
    test!(false, int[int])();
    test!(false, int[])();
    test!(false, void delegate())();
}

/**********************************************/
// 9385

void test9385()
{
    assert((null ? true : false) == false);
    if (null) assert(0);
    assert(!null);
}

/**********************************************/
// 12203

void test12203()
{
    typeof(null) v;
    void foo(float) {}
    void delegate(float) dg = &foo;
    assert(dg !is null);

    dg = v; // Error: e2ir: cannot cast v of type typeof(null) to type void delegate(float)

    assert(dg  is null);
}

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

int main()
{
    test1();
    test2();
    test7278();
    test8221();
    test8589();
    test9385();
    test12203();

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