@@ -184,3 +184,47 @@ unsized coercion to `Foo<U>`.
184
184
185
185
[ `Unsize` ] : ../std/marker/trait.Unsize.html
186
186
[ `CoerceUnsized` ] : ../std/ops/trait.CoerceUnsized.html
187
+
188
+ ## LUB Coercion
189
+
190
+ This is not in the RFC 401, but it's the behavior of current compiler. In LUB
191
+ Coercion, we tried to find the least upper bound of given types. It can be
192
+ observed in array collection, if-else/match arms.
193
+
194
+ For example:
195
+
196
+ ``` rust
197
+ let emm = if true {
198
+ A
199
+ } else if false {
200
+ B
201
+ } else {
202
+ C
203
+ };
204
+
205
+ let foo = match 42 {
206
+ 0 => A ,
207
+ 1 => B ,
208
+ _ => C ,
209
+ };
210
+
211
+ let bar = [A , B , C ];
212
+ ```
213
+ In this example, both ` emm ` and ` foo ` has type
214
+ ` LubCoerce(typeof(A), typeof(B), typeof(C)) ` and ` bar ` has type
215
+ ` [LubCoerce(typeof(A), typeof(B), typeof(C)); 3] ` .
216
+
217
+ LUB Coercion has some features:
218
+ 1 . Order independent: e.g. ` LubCoerce(ty0, ty1, ty2, ty3) ` equals to
219
+ ` LubCoerce(ty1, ty0, ty4, ty3) ` .
220
+ 2 . ` LubCoerce(ty0, ty1, ty2, ...) ` equals to
221
+ ` LubCoerce(LubCoerce(ty0, ty1), ty2, ...) `
222
+ 4 . ` LubCoerce(ty0, ty1) == ty2 ` means both ` ty0 ` and ` ty1 ` can be coerced to
223
+ ` ty2 ` .
224
+
225
+ Notice the feature No.3, it uses the word "means" rather than "if and only if".
226
+ That's because currently if ` ty0 ` and ` ty1 ` can be coerced to ` ty2 ` and ` ty2 `
227
+ equals to neither ` ty0 ` nor ` ty1 ` , there are only two special cases we can get
228
+ ` LubCoerce(ty0, ty1) == ty2 ` :
229
+ 1 . ` LubCoerce(FnDef, FnDef) == FnPtr ` ,
230
+ 2 . ` LubCoerce(Closure, Closure) == FnPtr ` (where Closure is non-capturing).
0 commit comments