| author | |
| committer | |
| log | 29815fe9de50be3b07e39cd02ccfcc801a54c455 |
| tree | 2f5fd0f724fa00b4629aa9509e533bc63dcc3d8f |
| parent | 62120e3d0e382274dec2962f376ceb1e645f1a30 |
19 files changed, 119 insertions(+), 109 deletions(-)
src/Sema.zig+4| ... | @@ -17713,6 +17713,10 @@ fn zirFuncFancy(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A | ... | @@ -17713,6 +17713,10 @@ fn zirFuncFancy(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A |
| 17713 | break :blk lib_name; | 17713 | break :blk lib_name; |
| 17714 | } else null; | 17714 | } else null; |
| 17715 | 17715 | ||
| 17716 | if ((extra.data.bits.has_align_body or extra.data.bits.has_align_ref) and sema.mod.getTarget().cpu.arch.isWasm()) { | ||
| 17717 | return sema.fail(block, align_src, "'align' is not allowed on functions in wasm", .{}); | ||
| 17718 | } | ||
| 17719 | |||
| 17716 | const @"align": ?u32 = if (extra.data.bits.has_align_body) blk: { | 17720 | const @"align": ?u32 = if (extra.data.bits.has_align_body) blk: { |
| 17717 | const body_len = sema.code.extra[extra_index]; | 17721 | const body_len = sema.code.extra[extra_index]; |
| 17718 | extra_index += 1; | 17722 | extra_index += 1; |
test/cases/compile_errors/align_n_expr_function_pointers_is_a_compile_error.zig created+9| ... | @@ -0,0 +1,9 @@ | ||
| 1 | export fn foo() align(1) void { | ||
| 2 | return; | ||
| 3 | } | ||
| 4 | |||
| 5 | // error | ||
| 6 | // backend=stage2 | ||
| 7 | // target=wasm32-freestanding-none | ||
| 8 | // | ||
| 9 | // :1:8: error: 'align' is not allowed on functions in wasm | ||
test/cases/compile_errors/array_access_of_non_array.zig created+15| ... | @@ -0,0 +1,15 @@ | ||
| 1 | export fn f() void { | ||
| 2 | var bad : bool = undefined; | ||
| 3 | bad[0] = bad[0]; | ||
| 4 | } | ||
| 5 | export fn g() void { | ||
| 6 | var bad : bool = undefined; | ||
| 7 | _ = bad[0]; | ||
| 8 | } | ||
| 9 | |||
| 10 | // error | ||
| 11 | // backend=stage2 | ||
| 12 | // target=native | ||
| 13 | // | ||
| 14 | // :3:8: error: element access of non-indexable type 'bool' | ||
| 15 | // :7:12: error: element access of non-indexable type 'bool' | ||
test/cases/compile_errors/array_access_with_non_integer_index.zig created+17| ... | @@ -0,0 +1,17 @@ | ||
| 1 | export fn f() void { | ||
| 2 | var array = "aoeu"; | ||
| 3 | var bad = false; | ||
| 4 | array[bad] = array[bad]; | ||
| 5 | } | ||
| 6 | export fn g() void { | ||
| 7 | var array = "aoeu"; | ||
| 8 | var bad = false; | ||
| 9 | _ = array[bad]; | ||
| 10 | } | ||
| 11 | |||
| 12 | // error | ||
| 13 | // backend=stage2 | ||
| 14 | // target=native | ||
| 15 | // | ||
| 16 | // :4:11: error: expected type 'usize', found 'bool' | ||
| 17 | // :9:15: error: expected type 'usize', found 'bool' | ||
test/cases/compile_errors/control_reaches_end_of_non-void_function.zig created+9| ... | @@ -0,0 +1,9 @@ | ||
| 1 | fn a() i32 {} | ||
| 2 | export fn entry() void { _ = a(); } | ||
| 3 | |||
| 4 | // error | ||
| 5 | // backend=stage2 | ||
| 6 | // target=native | ||
| 7 | // | ||
| 8 | // :1:13: error: expected type 'i32', found 'void' | ||
| 9 | // :1:8: note: function return type declared here | ||
test/cases/compile_errors/endless_loop_in_function_evaluation.zig created+15| ... | @@ -0,0 +1,15 @@ | ||
| 1 | const seventh_fib_number = fibonacci(7); | ||
| 2 | fn fibonacci(x: i32) i32 { | ||
| 3 | return fibonacci(x - 1) + fibonacci(x - 2); | ||
| 4 | } | ||
| 5 | |||
| 6 | export fn entry() usize { return @sizeOf(@TypeOf(&seventh_fib_number)); } | ||
| 7 | |||
| 8 | // error | ||
| 9 | // backend=stage2 | ||
| 10 | // target=native | ||
| 11 | // | ||
| 12 | // :3:21: error: evaluation exceeded 1000 backwards branches | ||
| 13 | // :3:21: note: use @setEvalBranchQuota() to raise the branch limit from 1000 | ||
| 14 | // :3:21: note: called from here (999 times) | ||
| 15 | // :1:37: note: called from here | ||
test/cases/compile_errors/load_too_many_bytes_from_comptime_reinterpreted_pointer.zig created+13| ... | @@ -0,0 +1,13 @@ | ||
| 1 | export fn entry() void { | ||
| 2 | const float: f32 = 5.99999999999994648725e-01; | ||
| 3 | const float_ptr = &float; | ||
| 4 | const int_ptr = @ptrCast(*const i64, float_ptr); | ||
| 5 | const int_val = int_ptr.*; | ||
| 6 | _ = int_val; | ||
| 7 | } | ||
| 8 | |||
| 9 | // error | ||
| 10 | // backend=stage2 | ||
| 11 | // target=native | ||
| 12 | // | ||
| 13 | // :5:28: error: dereference of '*const i64' exceeds bounds of containing decl of type 'f32' | ||
test/cases/compile_errors/stage1/aligned_variable_of_zero-bit_type.zig created+10| ... | @@ -0,0 +1,10 @@ | ||
| 1 | export fn f() void { | ||
| 2 | var s: struct {} align(4) = undefined; | ||
| 3 | _ = s; | ||
| 4 | } | ||
| 5 | |||
| 6 | // error | ||
| 7 | // backend=stage1 | ||
| 8 | // target=native | ||
| 9 | // | ||
| 10 | // tmp.zig:2:5: error: variable 's' of zero-bit type 'struct:2:12' has no in-memory representation, it cannot be aligned | ||
test/cases/compile_errors/stage1/implicit_casting_undefined_c_pointer_to_zig_pointer.zig created+11| ... | @@ -0,0 +1,11 @@ | ||
| 1 | comptime { | ||
| 2 | var c_ptr: [*c]u8 = undefined; | ||
| 3 | var zig_ptr: *u8 = c_ptr; | ||
| 4 | _ = zig_ptr; | ||
| 5 | } | ||
| 6 | |||
| 7 | // error | ||
| 8 | // backend=stage1 | ||
| 9 | // target=native | ||
| 10 | // | ||
| 11 | // tmp.zig:3:24: error: use of undefined value here causes undefined behavior | ||
test/cases/compile_errors/stage1/obj/align_n_expr_function_pointers_is_a_compile_error.zig deleted-9| ... | @@ -1,9 +0,0 @@ | ||
| 1 | export fn foo() align(1) void { | ||
| 2 | return; | ||
| 3 | } | ||
| 4 | |||
| 5 | // error | ||
| 6 | // backend=stage1 | ||
| 7 | // target=wasm32-freestanding-none | ||
| 8 | // | ||
| 9 | // tmp.zig:1:23: error: align(N) expr is not allowed on function prototypes in wasm32/wasm64 | ||
test/cases/compile_errors/stage1/obj/aligned_variable_of_zero-bit_type.zig deleted-10| ... | @@ -1,10 +0,0 @@ | ||
| 1 | export fn f() void { | ||
| 2 | var s: struct {} align(4) = undefined; | ||
| 3 | _ = s; | ||
| 4 | } | ||
| 5 | |||
| 6 | // error | ||
| 7 | // backend=stage1 | ||
| 8 | // target=native | ||
| 9 | // | ||
| 10 | // tmp.zig:2:5: error: variable 's' of zero-bit type 'struct:2:12' has no in-memory representation, it cannot be aligned | ||
test/cases/compile_errors/stage1/obj/array_access_of_non_array.zig deleted-15| ... | @@ -1,15 +0,0 @@ | ||
| 1 | export fn f() void { | ||
| 2 | var bad : bool = undefined; | ||
| 3 | bad[0] = bad[0]; | ||
| 4 | } | ||
| 5 | export fn g() void { | ||
| 6 | var bad : bool = undefined; | ||
| 7 | _ = bad[0]; | ||
| 8 | } | ||
| 9 | |||
| 10 | // error | ||
| 11 | // backend=stage1 | ||
| 12 | // target=native | ||
| 13 | // | ||
| 14 | // tmp.zig:3:8: error: array access of non-array type 'bool' | ||
| 15 | // tmp.zig:7:12: error: array access of non-array type 'bool' | ||
test/cases/compile_errors/stage1/obj/array_access_with_non_integer_index.zig deleted-17| ... | @@ -1,17 +0,0 @@ | ||
| 1 | export fn f() void { | ||
| 2 | var array = "aoeu"; | ||
| 3 | var bad = false; | ||
| 4 | array[bad] = array[bad]; | ||
| 5 | } | ||
| 6 | export fn g() void { | ||
| 7 | var array = "aoeu"; | ||
| 8 | var bad = false; | ||
| 9 | _ = array[bad]; | ||
| 10 | } | ||
| 11 | |||
| 12 | // error | ||
| 13 | // backend=stage1 | ||
| 14 | // target=native | ||
| 15 | // | ||
| 16 | // tmp.zig:4:11: error: expected type 'usize', found 'bool' | ||
| 17 | // tmp.zig:9:15: error: expected type 'usize', found 'bool' | ||
test/cases/compile_errors/stage1/obj/control_reaches_end_of_non-void_function.zig deleted-8| ... | @@ -1,8 +0,0 @@ | ||
| 1 | fn a() i32 {} | ||
| 2 | export fn entry() void { _ = a(); } | ||
| 3 | |||
| 4 | // error | ||
| 5 | // backend=stage1 | ||
| 6 | // target=native | ||
| 7 | // | ||
| 8 | // tmp.zig:1:12: error: expected type 'i32', found 'void' | ||
test/cases/compile_errors/stage1/obj/endless_loop_in_function_evaluation.zig deleted-12| ... | @@ -1,12 +0,0 @@ | ||
| 1 | const seventh_fib_number = fibonacci(7); | ||
| 2 | fn fibonacci(x: i32) i32 { | ||
| 3 | return fibonacci(x - 1) + fibonacci(x - 2); | ||
| 4 | } | ||
| 5 | |||
| 6 | export fn entry() usize { return @sizeOf(@TypeOf(seventh_fib_number)); } | ||
| 7 | |||
| 8 | // error | ||
| 9 | // backend=stage1 | ||
| 10 | // target=native | ||
| 11 | // | ||
| 12 | // tmp.zig:3:21: error: evaluation exceeded 1000 backwards branches | ||
test/cases/compile_errors/stage1/obj/implicit_casting_undefined_c_pointer_to_zig_pointer.zig deleted-11| ... | @@ -1,11 +0,0 @@ | ||
| 1 | comptime { | ||
| 2 | var c_ptr: [*c]u8 = undefined; | ||
| 3 | var zig_ptr: *u8 = c_ptr; | ||
| 4 | _ = zig_ptr; | ||
| 5 | } | ||
| 6 | |||
| 7 | // error | ||
| 8 | // backend=stage1 | ||
| 9 | // target=native | ||
| 10 | // | ||
| 11 | // tmp.zig:3:24: error: use of undefined value here causes undefined behavior | ||
test/cases/compile_errors/stage1/obj/load_too_many_bytes_from_comptime_reinterpreted_pointer.zig deleted-13| ... | @@ -1,13 +0,0 @@ | ||
| 1 | export fn entry() void { | ||
| 2 | const float: f32 = 5.99999999999994648725e-01; | ||
| 3 | const float_ptr = &float; | ||
| 4 | const int_ptr = @ptrCast(*const i64, float_ptr); | ||
| 5 | const int_val = int_ptr.*; | ||
| 6 | _ = int_val; | ||
| 7 | } | ||
| 8 | |||
| 9 | // error | ||
| 10 | // backend=stage1 | ||
| 11 | // target=native | ||
| 12 | // | ||
| 13 | // tmp.zig:5:28: error: attempt to read 8 bytes from pointer to f32 which is 4 bytes | ||
test/cases/compile_errors/stage1/obj/use_implicit_casts_to_assign_null_to_non-nullable_pointer.zig deleted-14| ... | @@ -1,14 +0,0 @@ | ||
| 1 | export fn entry() void { | ||
| 2 | var x: i32 = 1234; | ||
| 3 | var p: *i32 = &x; | ||
| 4 | var pp: *?*i32 = &p; | ||
| 5 | pp.* = null; | ||
| 6 | var y = p.*; | ||
| 7 | _ = y; | ||
| 8 | } | ||
| 9 | |||
| 10 | // error | ||
| 11 | // backend=stage1 | ||
| 12 | // target=native | ||
| 13 | // | ||
| 14 | // tmp.zig:4:23: error: expected type '*?*i32', found '**i32' | ||
test/cases/compile_errors/use_implicit_casts_to_assign_null_to_non-nullable_pointer.zig created+16| ... | @@ -0,0 +1,16 @@ | ||
| 1 | export fn entry() void { | ||
| 2 | var x: i32 = 1234; | ||
| 3 | var p: *i32 = &x; | ||
| 4 | var pp: *?*i32 = &p; | ||
| 5 | pp.* = null; | ||
| 6 | var y = p.*; | ||
| 7 | _ = y; | ||
| 8 | } | ||
| 9 | |||
| 10 | // error | ||
| 11 | // backend=stage2 | ||
| 12 | // target=native | ||
| 13 | // | ||
| 14 | // :4:22: error: expected type '*?*i32', found '**i32' | ||
| 15 | // :4:22: note: pointer type child '*i32' cannot cast into pointer type child '?*i32' | ||
| 16 | // :4:22: note: mutable '*i32' allows illegal null values stored to type '?*i32' | ||