compiler: Own union variant construction
c0a02bfa822b4ec395c80a491c620a2f1e58368f950549457b9d23e01877502a
1 parent
93dfa95d
lib/std/lang/resolver.rad
+3 -3
| 5712 | 5712 | // do it again. |
|
| 5713 | 5713 | if let case NominalType::Union(_) = *nominalTy { |
|
| 5714 | 5714 | return; |
|
| 5715 | 5715 | } |
|
| 5716 | 5716 | let a = alloc::arenaAllocator(self.arena); |
|
| 5717 | - | let mut variants: *unsafe mut [UnionVariant] = &mut []; |
|
| 5717 | + | let mut variants: *mut [UnionVariant] = &mut []; |
|
| 5718 | 5718 | ||
| 5719 | 5719 | let markers = try resolveOwnershipMarkers(self, decl.derives); |
|
| 5720 | 5720 | set *nominalTy = NominalType::Resolving(node); |
|
| 5721 | 5721 | ||
| 5722 | 5722 | assert decl.variants.len <= MAX_UNION_VARIANTS, "resolveUnionBody: maximum union variants exceeded"; |
| 5744 | 5744 | valueType: variantType, |
|
| 5745 | 5745 | symbol: variantSym, |
|
| 5746 | 5746 | }, a); |
|
| 5747 | 5747 | } |
|
| 5748 | 5748 | if markers.copy { |
|
| 5749 | - | for variant in variants { |
|
| 5749 | + | for variant in &variants[..] { |
|
| 5750 | 5750 | if not isCopy(variant.valueType) { |
|
| 5751 | 5751 | throw emitError(self, node, ErrorKind::CopyContainsNonCopy); |
|
| 5752 | 5752 | } |
|
| 5753 | 5753 | } |
|
| 5754 | 5754 | } |
| 5756 | 5756 | ||
| 5757 | 5757 | // Update the nominal type with the resolved variants. |
|
| 5758 | 5758 | set *nominalTy = NominalType::Union(UnionType { |
|
| 5759 | 5759 | regions: self.regionScope, |
|
| 5760 | 5760 | application: nil, |
|
| 5761 | - | variants: &variants[..], |
|
| 5761 | + | variants: (&variants[..]) as *unsafe [UnionVariant], |
|
| 5762 | 5762 | layout: allocLayout(self, info.layout), |
|
| 5763 | 5763 | valOffset: info.valOffset, |
|
| 5764 | 5764 | isAllVoid: info.isAllVoid, |
|
| 5765 | 5765 | declaredLinear: markers.linear, |
|
| 5766 | 5766 | declaredCopy: markers.copy, |