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
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 | } |