compiler/ lib/ examples/ std/ arch/ rv64/ tests/ abi.sizes.rad 3.4 KiB aggregate.return.rad 4.0 KiB arith.assignment.rad 580 B arith.basic.rad 176 B arith.modulo.rad 96 B arith.subword.rad 3.8 KiB arith.sum.rad 177 B arith.w64.rad 4.1 KiB array.assign.rad 221 B array.bounds.check.rad 321 B array.index.assign.rad 367 B array.index.rad 249 B array.length.rad 262 B array.math.rad 1.2 KiB array.nested.assign.rad 319 B array.nested.rad 325 B array.record.elements.rad 1.7 KiB array.repeat.edge.rad 548 B array.repeat.rad 828 B array.return.rad 330 B array.slice.empty.rad 108 B array.slice.gen.end.rad 126 B array.slice.gen.index.rad 139 B array.slice.gen.open.rad 125 B array.slice.gen.start.end.rad 127 B array.slice.gen.start.rad 126 B array.slice.rad 759 B as.precedence.rad 212 B assert.basic.rad 387 B assert.fail.rad 138 B assert.false.rad 140 B assert.true.rad 100 B assign.mutable.rad 6.1 KiB assign.rad 129 B assign.shadow.mutable.rad 461 B binop.bitwise.rad 1.2 KiB binop.cmp.rad 426 B bool.comparison.array.rad 688 B bool.comparison.nested.gen.rad 1.0 KiB bool.comparison.opt.rad 905 B bool.comparison.record.gen.rad 1.0 KiB bool.comparison.record.rad 1.1 KiB bool.comparison.slice.gen.rad 157 B bool.comparison.slice.rad 4.1 KiB bool.comparison.slice.record.gen.rad 2.0 KiB bool.comparison.slice.union.gen.rad 2.5 KiB bool.comparison.union.ctor.rad 690 B bool.comparison.union.gen.rad 1.2 KiB bool.comparison.union.record.gen.rad 1.5 KiB bool.comparison.union.simple.gen.rad 281 B bool.operators.complex.rad 384 B bool.operators.rad 831 B bool.short.circuit.rad 2.3 KiB bool.simple.rad 194 B bool.values.rad 772 B builtin.size.align.rad 1.3 KiB builtin.sliceof.mut.rad 606 B builtin.sliceof.rad 505 B call.arg.clobber.rad 717 B call.basic.rad 241 B call.clobber.rad 462 B cast.same.size.rad 1.0 KiB casting.numbers.rad 1.5 KiB char.literal.rad 165 B compound.assign.field.rad 285 B compound.assign.rad 1.1 KiB cond.assign.rad 723 B cond.expr.aggregate.rad 1.1 KiB cond.expr.rad 1.8 KiB cond.for.else.break.rad 326 B cond.for.indexed.rad 238 B cond.for.rad 165 B cond.for.range.indexed.rad 526 B cond.for.range.rad 171 B cond.for.unsigned.range.rad 644 B cond.forever.break.continue.rad 182 B cond.forever.break.rad 232 B cond.fused.rad 926 B cond.if.case.rad 2.2 KiB cond.if.else.min.rad 143 B cond.if.else.rad 225 B cond.if.elseif.rad 420 B cond.if.noelse.rad 120 B cond.if.rad 865 B cond.match.fallthrough.rad 369 B cond.match.guard.rad 1.4 KiB cond.match.guard.regalloc.rad 1.3 KiB cond.while.else.break.rad 282 B cond.while.rad 119 B const.array.copy.mutate.rad 386 B const.array.rad 195 B const.basic.rad 325 B const.char.rad 159 B const.fn.array.rad 664 B const.record.array.rad 1.2 KiB const.record.array.simple.rad 523 B const.record.ctor.rad 170 B const.record.fn.rad 353 B const.record.rad 182 B const.slice.param.rad 333 B const.union.payload.ctor.rad 349 B const.union.record.literal.rad 359 B data.array.rad 767 B data.bool.rad 216 B data.i16.rad 261 B data.i32.rad 281 B data.i8.rad 248 B data.record.rad 561 B data.simple.rad 436 B data.u16.rad 220 B data.u32.rad 240 B data.u8.rad 208 B data.union.rad 886 B debug.tag.rad 557 B edge.cases.2.rad 337 B edge.cases.3.rad 594 B edge.cases.4.rad 1.2 KiB edge.cases.5.rad 1.0 KiB edge.cases.6.rad 2.6 KiB edge.cases.7.addr.bug.rad 224 B edge.cases.8.bug.rad 508 B edge.cases.rad 223 B error.basic.rad 159 B error.catch.rad 1.6 KiB error.division.zero.rad 164 B error.modulo.zero.rad 162 B error.multi.basic.rad 672 B error.multi.catch.rad 772 B error.multi.catch.typed.binding.rad 791 B error.multi.catch.typed.catchall.rad 1.0 KiB error.multi.catch.typed.rad 1.1 KiB error.multi.propagate.multi.rad 953 B error.multi.propagate.rad 825 B error.multi.try.optional.rad 507 B error.slice.bounds.rad 219 B error.try.bang.success.rad 370 B error.try.catch.binding.rad 2.0 KiB error.try.optional.rad 1.8 KiB error.try.rad 4.0 KiB fn.block.scope.rad 508 B fn.callback.nested.rad 1.2 KiB fn.default.rad 131 B fn.local.rad 140 B fn.recursion.2.rad 239 B fn.void.rad 150 B for.else.continue.rad 1.1 KiB frame.large.rad 567 B if-let-mut.rad 1.1 KiB iflet.shadow.leak.rad 317 B integer.bitwise.basic.rad 693 B integer.overflow.rad 1.8 KiB large.blit.store.rad 2.1 KiB let.guard.rad 1.9 KiB literal.w64.rad 1.7 KiB loc.addr.offset.bug.rad 410 B loc.addr.opt.to.opt.rad 433 B loc.addr.optional.assign.rad 408 B loc.addr.record.assign.rad 443 B loop.complex.flow.rad 1007 B loop.sealblock.rad 911 B match.array.rad 3.4 KiB match.char.rad 1.6 KiB match.multi.seal.rad 987 B match.multi.survive.rad 1.6 KiB match.mutref.push.rad 1.0 KiB match.mutref.union.rad 662 B match.nested.call.rad 1.7 KiB match.nested.deep.rad 2.2 KiB match.nested.deref.rad 3.7 KiB match.nested.guard.rad 1.6 KiB match.nested.iflet.guard.rad 1.6 KiB match.nested.iflet.rad 1.4 KiB match.nested.letelse.rad 813 B match.nested.letelse.union.rad 1.3 KiB match.nested.literal.rad 3.1 KiB match.nested.multi.rad 2.4 KiB match.nested.pattern.rad 5.2 KiB match.nested.record.rad 2.0 KiB match.nested.union.rad 2.3 KiB match.nested.whilelet.rad 2.4 KiB match.string.rad 1.8 KiB match.value.copy.rad 2.0 KiB match.void.then.or.rad 1.6 KiB memzero.result.bug.rad 806 B memzero.union.bug.rad 576 B mutref.loop.bug.rad 1.8 KiB opt.assignment.bug.rad 1.3 KiB opt.bug.test.rad 1.4 KiB opt.if.let.complex.rad 6.2 KiB opt.if.let.guard.rad 809 B opt.if.let.rad 956 B opt.nil.check.rad 1.5 KiB opt.record.eq.rad 842 B opt.record.rad 655 B opt.return.array.rad 289 B opt.return.nested.rad 797 B opt.return.record.rad 344 B opt.slice.npo.rad 2.8 KiB opt.type.rad 200 B opt.while.let.complex.rad 404 B panic.rad 111 B placeholder.basic.rad 133 B placeholder.comprehensive.rad 562 B pointer.copy.edge.case.rad 1.3 KiB pointer.slice.index.rad 269 B pointer.slice.store.rad 881 B prog.ackermann.rad 5.0 KiB prog.bignum.rad 9.4 KiB prog.binsearch.rad 2.4 KiB prog.bubblesort.rad 2.0 KiB prog.cordic.rad 6.9 KiB prog.crc32.rad 2.7 KiB prog.dijkstra.rad 7.7 KiB prog.eval.rad 6.2 KiB prog.hanoi.rad 3.8 KiB prog.huffman.rad 9.3 KiB prog.hybridsort.rad 3.0 KiB prog.linkedlist.rad 5.8 KiB prog.lzw.rad 6.7 KiB prog.matmul.rad 2.9 KiB prog.mersenne.rad 5.2 KiB prog.nqueens.rad 3.4 KiB prog.rbtree.rad 8.2 KiB prog.regex.rad 10.2 KiB prog.sha256.rad 7.0 KiB prog.sieve.rad 2.8 KiB prog.symtab.rad 10.1 KiB prog.tokenizer.rad 13.8 KiB prog.vm.rad 17.4 KiB ptr.assign.rad 137 B ptr.deref.rad 622 B ptr.eq.rad 966 B ptr.mutate.rad 244 B ptr.opaque.rad 1.4 KiB record.access.rad 285 B record.alignment.rad 179 B record.array.elements.rad 1.7 KiB record.copy.rad 2.0 KiB record.field.assign.rad 184 B record.nested.calls.2.rad 612 B record.nested.calls.3.rad 734 B record.param.lit.rad 353 B record.ptr.access.rad 227 B record.ptr.mutate.rad 243 B record.shorthand.rad 1.5 KiB record.unlabeled.rad 407 B ref.if.bug.rad 519 B ref.immut.loop.bug.rad 670 B ref.mut.ptr.rad 261 B regalloc.callee.save.rad 1.5 KiB regalloc.spill.reuse.rad 473 B reserve.loop.rad 392 B result.void.success.rad 716 B slice.alloc.loop.rad 788 B slice.append.rad 3.3 KiB slice.cap.rad 941 B slice.delete.rad 971 B slice.of.rad 460 B slice.subslice.rad 1.4 KiB spill.blockarg.clobber.rad 3.5 KiB spill.loop.rad 1.6 KiB stack.local.corrupt.rad 320 B static.array.mutate.rad 387 B static.basic.rad 327 B static.fn.array.rad 628 B static.record.array.rad 503 B static.slice.index.assign.rad 408 B static.slice.offset.rad 668 B string.basic.rad 149 B string.escape.rad 349 B string.index.rad 116 B switch.blockargs.clobber.rad 1.3 KiB trait.aggregate.ret.rad 1.5 KiB trait.array.optional.rad 1.7 KiB trait.basic.rad 565 B trait.control.flow.rad 1.1 KiB trait.fn.param.rad 1.6 KiB trait.multiple.methods.rad 1.2 KiB trait.multiple.traits.rad 1.2 KiB trait.multiple.types.rad 1.3 KiB trait.supertrait.rad 2.5 KiB trait.throws.rad 1.0 KiB trait.writer.rad 2.6 KiB type.unify.rad 4.5 KiB undefined.rad 417 B union-tag.rad 911 B union.bitfield.rad 1.2 KiB union.discriminant.cast.rad 389 B union.edge.case.2.rad 679 B union.edge.case.3.rad 608 B union.mixed.assign.rad 977 B union.payload.mutref.rad 1.4 KiB union.payload.rad 580 B union.record.forward.rad 1.3 KiB union.void.match.rad 403 B union.void.rad 824 B unsigned.compare.rad 1.9 KiB var.align.rad 1013 B var.infer.rad 549 B decode.rad 14.6 KiB emit.rad 24.4 KiB encode.rad 19.9 KiB isel.rad 41.1 KiB printer.rad 13.0 KiB tests.rad 15.7 KiB rv64.rad 13.0 KiB collections/ lang/ sys/ arch.rad 65 B collections.rad 36 B fmt.rad 3.8 KiB intrinsics.rad 206 B io.rad 1.2 KiB lang.rad 222 B mem.rad 2.2 KiB sys.rad 167 B testing.rad 2.4 KiB tests.rad 11.6 KiB vec.rad 3.1 KiB std.rad 231 B scripts/ seed/ test/ vim/ .gitignore 353 B .gitsigners 112 B LICENSE 1.1 KiB Makefile 3.1 KiB README 2.5 KiB std.lib 987 B std.lib.test 252 B
lib/std/arch/rv64/tests/opt.if.let.complex.rad 6.2 KiB raw
1
//! returns: 0
2
//! Test optional types with complex if-let patterns.
3
4
/// Test optional types with different base types
5
fn testOptionalTypes() -> bool {
6
    let optBool: ?bool = true;
7
    let optFloat: ?i32 = 42;
8
    let optNilBool: ?bool = nil;
9
    let optNilFloat: ?i32 = nil;
10
11
    if let b = optBool; b {
12
        if let f = optFloat; f > 40 {
13
            if let nb = optNilBool {
14
                return false; // Should not reach here
15
            } else {
16
                if let nf = optNilFloat {
17
                    return false; // Should not reach here
18
                } else {
19
                    return true; // All conditions met
20
                }
21
            }
22
        } else {
23
            return false;
24
        }
25
    } else {
26
        return false;
27
    }
28
    return false;
29
}
30
31
/// Test complex type coercion chains
32
fn testComplexCoercion() -> bool {
33
    let val: i32 = 42;
34
    let opt1: ?i32 = val;        // i32 -> ?i32
35
    let opt2: ?i32 = 42;         // Direct literal -> ?i32
36
37
    // Test that both produce same result
38
    if let x = opt1 {
39
        if let y = opt2 {
40
            return x == y;
41
        } else {
42
            return false;
43
        }
44
    } else {
45
        return false;
46
    }
47
    return false;
48
}
49
50
/// Test variable shadowing in different scopes
51
fn testVariableShadowing() -> bool {
52
    let x: i32 = 10;
53
    let opt: ?i32 = 20;
54
55
    if let x = opt; x > 15 {
56
        // x is now 20, shadowing outer x (10)
57
        if x == 20 {
58
            let x: i32 = 30; // Another shadow
59
            if x == 30 {
60
                return true;
61
            } else {
62
                return false;
63
            }
64
        } else {
65
            return false;
66
        }
67
    } else {
68
        return false;
69
    }
70
    return false;
71
}
72
73
/// Test zero and boundary values
74
fn testBoundaryValues() -> bool {
75
    let zero: ?i32 = 0;
76
    let negative: ?i32 = -1;
77
    let minVal: ?i32 = -2147483648; // i32 min
78
    let maxVal: ?i32 = 2147483647;  // i32 max
79
80
    if let z = zero; z == 0 {
81
        if let n = negative; n < 0 {
82
            if let min = minVal; min < 0 {
83
                if let max = maxVal; max > 0 {
84
                    return true;
85
                } else {
86
                    return false;
87
                }
88
            } else {
89
                return false;
90
            }
91
        } else {
92
            return false;
93
        }
94
    } else {
95
        return false;
96
    }
97
    return false;
98
}
99
100
/// Test optional with zero guard condition
101
fn testZeroGuardCondition() -> bool {
102
    let opt: ?i32 = 0;
103
104
    if let x = opt; x >= 0 {
105
        return x == 0;
106
    } else {
107
        return false;
108
    }
109
    return false;
110
}
111
112
/// Test multiple nil assignments
113
fn testMultipleNilAssignments() -> bool {
114
    let mut opt: ?i32 = 42;
115
116
    if let x = opt {
117
        if x == 42 {
118
            opt = nil;
119
            if let y = opt {
120
                return false; // Should not reach here after nil assignment
121
            } else {
122
                opt = 100;
123
                if let z = opt {
124
                    return z == 100;
125
                } else {
126
                    return false;
127
                }
128
            }
129
        } else {
130
            return false;
131
        }
132
    } else {
133
        return false;
134
    }
135
    return false;
136
}
137
138
/// Test nested guard conditions with same variable
139
fn testNestedSameVariableGuards() -> bool {
140
    let opt1: ?i32 = 25;
141
    let opt2: ?i32 = 25;
142
143
    if let x = opt1; x > 20 {
144
        if let x = opt2; x < 30 {
145
            // Inner x shadows outer x, both are 25
146
            return x == 25;
147
        } else {
148
            return false;
149
        }
150
    } else {
151
        return false;
152
    }
153
    return false;
154
}
155
156
/// Test complex boolean expressions in guards
157
fn testComplexGuardExpressions() -> bool {
158
    let opt1: ?i32 = 15;
159
    let opt2: ?i32 = 25;
160
161
    if let x = opt1; x > 10 and x < 20 {
162
        if let y = opt2; y > 20 or y == 25 {
163
            return (x + y) == 40;
164
        } else {
165
            return false;
166
        }
167
    } else {
168
        return false;
169
    }
170
    return false;
171
}
172
173
/// Test guard with arithmetic expressions
174
fn testArithmeticInGuards() -> bool {
175
    let opt: ?i32 = 10;
176
177
    if let x = opt; (x + 5) > 12 and (x * 2) < 25 {
178
        return x == 10;
179
    } else {
180
        return false;
181
    }
182
    return false;
183
}
184
185
/// Test early returns from guard failure
186
fn testEarlyReturnGuardFailure() -> bool {
187
    let opt: ?i32 = 5;
188
189
    if let x = opt; x > 10 {
190
        return false; // Should not reach here
191
    } else {
192
        return true;  // Should reach here due to guard failure
193
    }
194
    return false;
195
}
196
197
/// Test sequential nil checks
198
fn testSequentialNilChecks() -> bool {
199
    let opt1: ?i32 = nil;
200
    let opt2: ?i32 = nil;
201
    let opt3: ?i32 = 42;
202
203
    if let x = opt1 {
204
        return false;
205
    }
206
207
    if let y = opt2 {
208
        return false;
209
    }
210
211
    if let z = opt3 {
212
        return z == 42;
213
    }
214
215
    return false;
216
}
217
218
/// Test mixed regular if and if let
219
fn testMixedIfTypes() -> bool {
220
    let condition: bool = true;
221
    let opt: ?i32 = 30;
222
223
    if condition {
224
        if let x = opt; x == 30 {
225
            if not condition {
226
                return false;
227
            } else {
228
                return true;
229
            }
230
        } else {
231
            return false;
232
        }
233
    } else {
234
        return false;
235
    }
236
    return false;
237
}
238
239
/// Test optional assignment in conditional chains
240
fn testOptionalAssignmentChains() -> bool {
241
    let mut opt: ?i32 = nil;
242
243
    if let x = opt {
244
        return false;
245
    }
246
247
    opt = 10;
248
    if let x = opt; x == 10 {
249
        opt = 20;
250
        if let y = opt; y == 20 {
251
            opt = nil;
252
            if let z = opt {
253
                return false;
254
            } else {
255
                return true;
256
            }
257
        } else {
258
            return false;
259
        }
260
    } else {
261
        return false;
262
    }
263
    return false;
264
}
265
266
@default fn main() -> i32 {
267
    assert testOptionalTypes();
268
    assert testComplexCoercion();
269
    assert testVariableShadowing();
270
    assert testBoundaryValues();
271
    assert testZeroGuardCondition();
272
    assert testMultipleNilAssignments();
273
    assert testNestedSameVariableGuards();
274
    assert testComplexGuardExpressions();
275
    assert testArithmeticInGuards();
276
    assert testEarlyReturnGuardFailure();
277
    assert testSequentialNilChecks();
278
    assert testMixedIfTypes();
279
    assert testOptionalAssignmentChains();
280
    return 0;
281
}