| ... | @@ -18222,8 +18222,10 @@ fn coerceInMemoryAllowed( | ... | @@ -18222,8 +18222,10 @@ fn coerceInMemoryAllowed( |
| 18222 | // Pointers / Pointer-like Optionals | 18222 | // Pointers / Pointer-like Optionals |
| 18223 | var dest_buf: Type.Payload.ElemType = undefined; | 18223 | var dest_buf: Type.Payload.ElemType = undefined; |
| 18224 | var src_buf: Type.Payload.ElemType = undefined; | 18224 | var src_buf: Type.Payload.ElemType = undefined; |
| 18225 | if (try sema.typePtrOrOptionalPtrTy(block, dest_ty, &dest_buf, dest_src)) |dest_ptr_ty| { | 18225 | const maybe_dest_ptr_ty = try sema.typePtrOrOptionalPtrTy(block, dest_ty, &dest_buf, dest_src); |
| 18226 | if (try sema.typePtrOrOptionalPtrTy(block, src_ty, &src_buf, src_src)) |src_ptr_ty| { | 18226 | const maybe_src_ptr_ty = try sema.typePtrOrOptionalPtrTy(block, src_ty, &src_buf, src_src); |
| | 18227 | if (maybe_dest_ptr_ty) |dest_ptr_ty| { |
| | 18228 | if (maybe_src_ptr_ty) |src_ptr_ty| { |
| 18227 | return try sema.coerceInMemoryAllowedPtrs(block, dest_ty, src_ty, dest_ptr_ty, src_ptr_ty, dest_is_mut, target, dest_src, src_src); | 18229 | return try sema.coerceInMemoryAllowedPtrs(block, dest_ty, src_ty, dest_ptr_ty, src_ptr_ty, dest_is_mut, target, dest_src, src_src); |
| 18228 | } | 18230 | } |
| 18229 | } | 18231 | } |
| ... | @@ -18288,7 +18290,23 @@ fn coerceInMemoryAllowed( | ... | @@ -18288,7 +18290,23 @@ fn coerceInMemoryAllowed( |
| 18288 | return .ok; | 18290 | return .ok; |
| 18289 | } | 18291 | } |
| 18290 | | 18292 | |
| 18291 | // TODO: non-pointer-like optionals | 18293 | // Optionals |
| | 18294 | if (dest_tag == .Optional and src_tag == .Optional) optionals: { |
| | 18295 | if ((maybe_dest_ptr_ty != null) != (maybe_src_ptr_ty != null)) { |
| | 18296 | // TODO "optional type child '{}' cannot cast into optional type '{}'" |
| | 18297 | return .no_match; |
| | 18298 | } |
| | 18299 | const dest_child_type = dest_ty.optionalChild(&dest_buf); |
| | 18300 | const src_child_type = src_ty.optionalChild(&src_buf); |
| | 18301 | |
| | 18302 | const child = try sema.coerceInMemoryAllowed(block, dest_child_type, src_child_type, dest_is_mut, target, dest_src, src_src); |
| | 18303 | if (child == .no_match) { |
| | 18304 | // TODO "optional type child '{}' cannot cast into optional type child '{}'" |
| | 18305 | break :optionals; |
| | 18306 | } |
| | 18307 | |
| | 18308 | return .ok; |
| | 18309 | } |
| 18292 | | 18310 | |
| 18293 | return .no_match; | 18311 | return .no_match; |
| 18294 | } | 18312 | } |