compiler: Initialize regional header values

01c24b429a88e08dcd60193484b9c93ebe3f4d833ba5f3182c4d925c041d7551
Alexis Sellier committed ago 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 +
}