#attribute("test") fn empty_function() {} /** * multi line doc comment */ /// this is a documentation comment /// doc comment line 2 #attribute("test") fn comments() { comments_f1(/* mid-line comment /* nested */ */ "OK\n"); } fn comments_f1(s: []u8) {} #attribute("test") fn fn_call_of_struct_field() { if (call_struct_field(Foo {.ptr = a_func,}) != 13) { unreachable{}; } } struct Foo { ptr: fn() -> i32, } fn a_func() -> i32 { 13 } fn call_struct_field(foo: Foo) -> i32 { return foo.ptr(); } #attribute("test") fn redefinition_of_error_values_allowed() { if (error.AnError == error.SecondError) unreachable{} } error AnError; error AnError; error SecondError; #attribute("test") fn constant_enum_with_payload() { var empty = AnEnumWithPayload.Empty; var full = AnEnumWithPayload.Full(13); should_be_empty(empty); should_be_not_empty(full); } fn should_be_empty(x: AnEnumWithPayload) { switch (x) { Empty => {}, else => unreachable{}, } } fn should_be_not_empty(x: AnEnumWithPayload) { switch (x) { Empty => unreachable{}, else => {}, } } enum AnEnumWithPayload { Empty, Full: i32, } #attribute("test") fn continue_in_for_loop() { const array = []i32 {1, 2, 3, 4, 5}; var sum : i32 = 0; for (array) |x| { sum += x; if (x < 3) { continue; } break; } if (sum != 6) unreachable{} } #attribute("test") fn cast_bool_to_int() { const t = true; const f = false; if (i32(t) != i32(1)) unreachable{} if (i32(f) != i32(0)) unreachable{} non_const_cast_bool_to_int(t, f); } fn non_const_cast_bool_to_int(t: bool, f: bool) { if (i32(t) != i32(1)) unreachable{} if (i32(f) != i32(0)) unreachable{} } #attribute("test") fn switch_on_enum() { const fruit = Fruit.Orange; switch (fruit) { Apple => unreachable{}, Orange => {}, Banana => unreachable{}, } non_const_switch_on_enum(fruit); } enum Fruit { Apple, Orange, Banana, } fn non_const_switch_on_enum(fruit: Fruit) { switch (fruit) { Apple => unreachable{}, Orange => {}, Banana => unreachable{}, } } #attribute("test") fn switch_statement() { const foo = SwitchStatmentFoo.C; const val: i32 = switch (foo) { A => 1, B => 2, C => 3, D => 4, }; if (val != 3) unreachable{}; } enum SwitchStatmentFoo { A, B, C, D, } #attribute("test") fn switch_prong_with_var() { switch_prong_with_var_fn(SwitchProngWithVarEnum.One(13)); switch_prong_with_var_fn(SwitchProngWithVarEnum.Two(13.0)); switch_prong_with_var_fn(SwitchProngWithVarEnum.Meh); } enum SwitchProngWithVarEnum { One: i32, Two: f32, Meh, } fn switch_prong_with_var_fn(a: SwitchProngWithVarEnum) { switch(a) { One => |x| { if (x != 13) unreachable{}; }, Two => |x| { if (x != 13.0) unreachable{}; }, Meh => |x| { const v: void = x; }, } } #attribute("test") fn err_return_in_assignment() { %%do_err_return_in_assignment(); } fn do_err_return_in_assignment() -> %void { var x : i32 = undefined; x = %return make_a_non_err(); } fn make_a_non_err() -> %i32 { return 1; } #attribute("test") fn rhs_maybe_unwrap_return() { const x = ?true; const y = x ?? return; } #attribute("test") fn implicit_cast_fn_unreachable_return() { wants_fn_with_void(fn_with_unreachable); } fn wants_fn_with_void(f: fn()) { } fn fn_with_unreachable() -> unreachable { unreachable {} } #attribute("test") fn explicit_cast_maybe_pointers() { const a: ?&i32 = undefined; const b: ?&f32 = (?&f32)(a); } #attribute("test") fn const_expr_eval_on_single_expr_blocks() { if (const_expr_eval_on_single_expr_blocks_fn(1, true) != 3) unreachable{} } fn const_expr_eval_on_single_expr_blocks_fn(x: i32, b: bool) -> i32 { const literal = 3; const result = if (b) { literal } else { x }; return result; } #attribute("test") fn builtin_const_eval() { const x : i32 = @const_eval(1 + 2 + 3); if (x != @const_eval(6)) unreachable{}; } #attribute("test") fn slicing() { var array : [20]i32 = undefined; array[5] = 1234; var slice = array[5...10]; if (slice.len != 5) unreachable{}; const ptr = &slice[0]; if (ptr[0] != 1234) unreachable{}; var slice_rest = array[10...]; if (slice_rest.len != 10) unreachable{}; } #attribute("test") fn memcpy_and_memset_intrinsics() { var foo : [20]u8 = undefined; var bar : [20]u8 = undefined; @memset(&foo[0], 'A', foo.len); @memcpy(&bar[0], &foo[0], bar.len); if (bar[11] != 'A') unreachable{}; }