authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-07-12 14:22:57+03:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-07-21 12:21:30-07:00
log29815fe9de50be3b07e39cd02ccfcc801a54c455
tree2f5fd0f724fa00b4629aa9509e533bc63dcc3d8f
parent62120e3d0e382274dec2962f376ceb1e645f1a30

Sema: disallow 'align' on functions on wasm


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
1771317713 break :blk lib_name;
1771417714 } else null;
1771517715
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
1771617720 const @"align": ?u32 = if (extra.data.bits.has_align_body) blk: {
1771717721 const body_len = sema.code.extra[extra_index];
1771817722 extra_index += 1;
test/cases/compile_errors/align_n_expr_function_pointers_is_a_compile_error.zig created+9
......@@ -0,0 +1,9 @@
1export 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 @@
1export fn f() void {
2 var bad : bool = undefined;
3 bad[0] = bad[0];
4}
5export 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 @@
1export fn f() void {
2 var array = "aoeu";
3 var bad = false;
4 array[bad] = array[bad];
5}
6export 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 @@
1fn a() i32 {}
2export 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 @@
1const seventh_fib_number = fibonacci(7);
2fn fibonacci(x: i32) i32 {
3 return fibonacci(x - 1) + fibonacci(x - 2);
4}
5
6export 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 @@
1export 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 @@
1export 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 @@
1comptime {
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 @@
1export 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 @@
1export 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 @@
1export fn f() void {
2 var bad : bool = undefined;
3 bad[0] = bad[0];
4}
5export 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 @@
1export fn f() void {
2 var array = "aoeu";
3 var bad = false;
4 array[bad] = array[bad];
5}
6export 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 @@
1fn a() i32 {}
2export 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 @@
1const seventh_fib_number = fibonacci(7);
2fn fibonacci(x: i32) i32 {
3 return fibonacci(x - 1) + fibonacci(x - 2);
4}
5
6export 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 @@
1comptime {
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 @@
1export 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 @@
1export 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 @@
1export 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'