1 /*
2 TEST_OUTPUT:
3 ---
4 pure nothrow @safe Object(bool b)
5 pure nothrow @safe int*(bool b)
6 pure nothrow @safe int[](bool b)
7 ---
8 
9 RUN_OUTPUT:
10 ---
11 Success
12 ---
13 */
14 extern (C) int printf(const(char*) fmt, ...);
15 
16 alias typeof(null) null_t;
17 
18 /**********************************************/
19 
test1()20 void test1()
21 {
22     null_t null1;
23     typeof(null) null2;
24 
25     static assert(is(typeof(null1) == typeof(null)));
26     static assert(is(typeof(null2) == typeof(null)));
27 
28     static assert(is(typeof(null1) == null_t));
29     static assert(is(typeof(null2) == null_t));
30 }
31 
32 /**********************************************/
33 
34 interface I{}
35 class C{}
36 
f(null_t)37 int f(null_t)   { return 1; }
f(int[])38 int f(int[])    { return 2; }
f(C)39 int f(C)        { return 3; }
40 
test2()41 void test2()
42 {
43     static assert(is(null_t : C));
44     static assert(is(null_t : I));
45     static assert(is(null_t : int[]));
46     static assert(is(null_t : void*));
47     static assert(is(null_t : int**));
48 
49     static assert(!is(null_t == C));
50     static assert(!is(null_t == I));
51     static assert(!is(null_t == int[]));
52     static assert(!is(null_t == void*));
53     static assert(!is(null_t == int**));
54 
55     static assert(is(null_t == null_t));
56 
57     assert(f(null) == 1);
58 }
59 
60 /**********************************************/
61 // 5899
62 
f5899(bool b)63 auto f5899(bool b)
64 {
65     if (b)
66         return new Object;
67     else
68         return null;
69 }
70 static assert(is(typeof(f5899) R == return) && is(R == Object));
71 pragma(msg, typeof(f5899));
72 
g5899(bool b)73 auto g5899(bool b)
74 {
75     if (b)
76         return new int;
77     else
78         return null;
79 }
80 static assert(is(typeof(g5899) R == return) && is(R == int*));
81 pragma(msg, typeof(g5899));
82 
h5899(bool b)83 auto h5899(bool b)
84 {
85     if (b)
86         return [1];
87     else
88         return null;
89 }
90 static assert(is(typeof(h5899) R == return) && is(R == int[]));
91 pragma(msg, typeof(h5899));
92 
93 /**********************************************/
94 // 7278
95 
Foo7278(string s)96 struct Foo7278(string s)
97 {
98     string var;
99     void func()
100     {
101         string local = var;
102     }
103 }
104 
test7278()105 void test7278()
106 {
107     Foo7278!null a;
108     Foo7278!null b;
109 }
110 
111 /**********************************************/
112 // 8221
113 
114 class A8221
115 {
foo()116     A8221 foo() { return this; }
117 }
118 class B8221: A8221
119 {
typeof(null)120     override typeof(null) foo() { return null; } // error
121 }
test8221()122 void test8221()
123 {
124     auto a = new A8221();
125     assert(a.foo() is a);
126     auto b = new B8221();
127     assert(b.foo() is null);
128     a = b;
129     assert(a.foo() is null);
130 }
131 
132 /***************************************************/
133 // 8589
134 
test8589()135 void test8589()
136 {
137     static typeof(null) retnull() { return null; }
138 
139     void test(bool result, T)()
140     {
141         void f(T function() dg) { assert(!dg()); }
142 
143         static assert((is(typeof(null) function() : T function())) == result);
144         static assert(is(typeof( f(&retnull) )) == result);
145         static assert(is(typeof( f(()=>null) )) == result);
146         static if (result)
147         {
148             f(&retnull);
149             f(()=>null);
150         }
151     }
152     test!(true,  int*)();
153     test!(true,  Object)();
154     test!(false, int[int])();
155     test!(false, int[])();
156     test!(false, void delegate())();
157 }
158 
159 /**********************************************/
160 // 9385
161 
test9385()162 void test9385()
163 {
164     assert((null ? true : false) == false);
165     if (null) assert(0);
166     assert(!null);
167 }
168 
169 /**********************************************/
170 // 12203
171 
test12203()172 void test12203()
173 {
174     typeof(null) v;
175     void foo(float) {}
176     void delegate(float) dg = &foo;
177     assert(dg !is null);
178 
179     dg = v; // Error: e2ir: cannot cast v of type typeof(null) to type void delegate(float)
180 
181     assert(dg  is null);
182 }
183 
184 /**********************************************/
185 
main()186 int main()
187 {
188     test1();
189     test2();
190     test7278();
191     test8221();
192     test8589();
193     test9385();
194     test12203();
195 
196     printf("Success\n");
197     return 0;
198 }
199