compiler: Initialize regional header values
01c24b429a88e08dcd60193484b9c93ebe3f4d833ba5f3182c4d925c041d7551
1 parent
5d23c002
lib/std/lang/lower.rad
+4 -3
| 4088 | 4088 | set self.srcLoc.offset = node.span.offset; |
|
| 4089 | 4089 | } |
|
| 4090 | 4090 | match node.value { |
|
| 4091 | 4091 | case ast::NodeValue::RegionBlock { bindings, body, .. } => { |
|
| 4092 | 4092 | let savedVarsLen = enterVarScope(&self.vars); |
|
| 4093 | - | let values = try allocVals(self, bindings.len); |
|
| 4094 | - | for bindingNode, i in bindings { |
|
| 4093 | + | let mut values: *mut [il::Val] = &mut []; |
|
| 4094 | + | for bindingNode in bindings { |
|
| 4095 | 4095 | let case ast::NodeValue::RegionBinding(binding) = bindingNode.value |
|
| 4096 | 4096 | else throw LowerError::ExpectedIdentifier; |
|
| 4097 | - | set values[i] = try lowerExpr(self, binding.value); |
|
| 4097 | + | let value = try lowerExpr(self, binding.value); |
|
| 4098 | 4098 | if blockHasTerminator(&self.blockData[*currentBlock(self)].instrs[..]) { |
|
| 4099 | 4099 | exitVarScope(&mut self.vars, savedVarsLen); |
|
| 4100 | 4100 | return; |
|
| 4101 | 4101 | } |
|
| 4102 | + | values.append(value, alloc::arenaAllocator(self.arena)); |
|
| 4102 | 4103 | } |
|
| 4103 | 4104 | for bindingNode, i in bindings { |
|
| 4104 | 4105 | let case ast::NodeValue::RegionBinding(binding) = bindingNode.value |
|
| 4105 | 4106 | else throw LowerError::ExpectedIdentifier; |
|
| 4106 | 4107 | try bindLetValue(self, bindingNode, ast::borrowBinding(binding), values[i]); |
test/tests/regions.header.order.rad
added
+40 -0
| 1 | + | //! returns: 0 |
|
| 2 | + | ||
| 3 | + | /// Record the order of header expression evaluation. |
|
| 4 | + | fn index(trace: &mut u32, digit: u32) -> u32 { |
|
| 5 | + | set *trace = *trace * 10 + digit; |
|
| 6 | + | return digit - 1; |
|
| 7 | + | } |
|
| 8 | + | ||
| 9 | + | /// Check that a full header uses the outer scope before binding its names. |
|
| 10 | + | @default fn main() -> u32 { |
|
| 11 | + | let values: [u32; 8] = [10, 20, 30, 40, 50, 60, 70, 80]; |
|
| 12 | + | let first: u32 = 99; |
|
| 13 | + | let mut trace: u32 = 0; |
|
| 14 | + | let first: 'header = &values[index(&mut trace, 1)], |
|
| 15 | + | second = &values[index(&mut trace, 2)], |
|
| 16 | + | third = &values[index(&mut trace, 3)], |
|
| 17 | + | fourth = &values[index(&mut trace, 4)], |
|
| 18 | + | fifth = &values[index(&mut trace, 5)], |
|
| 19 | + | sixth = &values[index(&mut trace, 6)], |
|
| 20 | + | seventh = &values[index(&mut trace, 7)], |
|
| 21 | + | eighth = &values[index(&mut trace, 8)], |
|
| 22 | + | outer = &first in { |
|
| 23 | + | assert trace == 12345678; |
|
| 24 | + | assert *first == 10; |
|
| 25 | + | assert *second == 20; |
|
| 26 | + | assert *third == 30; |
|
| 27 | + | assert *fourth == 40; |
|
| 28 | + | assert *fifth == 50; |
|
| 29 | + | assert *sixth == 60; |
|
| 30 | + | assert *seventh == 70; |
|
| 31 | + | assert *eighth == 80; |
|
| 32 | + | assert *outer == 99; |
|
| 33 | + | let a: 'inner = &*first, b = &*eighth where 'header: 'inner in { |
|
| 34 | + | assert *a + *b == 90; |
|
| 35 | + | } |
|
| 36 | + | } |
|
| 37 | + | assert first == 99; |
|
| 38 | + | assert trace == 12345678; |
|
| 39 | + | return 0; |
|
| 40 | + | } |