diff --git a/src/Sema.zig b/src/Sema.zig index 2ac27cf6b3d74a91cb93786241043d7bc21024e7..b821a32fc71395adaf2140700a9eb3b96d1f1a60 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -17713,6 +17713,10 @@ fn zirFuncFancy(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A break :blk lib_name; } else null; + if ((extra.data.bits.has_align_body or extra.data.bits.has_align_ref) and sema.mod.getTarget().cpu.arch.isWasm()) { + return sema.fail(block, align_src, "'align' is not allowed on functions in wasm", .{}); + } + const @"align": ?u32 = if (extra.data.bits.has_align_body) blk: { const body_len = sema.code.extra[extra_index]; extra_index += 1; diff --git a/test/cases/compile_errors/align_n_expr_function_pointers_is_a_compile_error.zig b/test/cases/compile_errors/align_n_expr_function_pointers_is_a_compile_error.zig new file mode 100644 index 0000000000000000000000000000000000000000..7ceed52edf6083c339c96d090e8f8837faee6c8c --- /dev/null +++ b/test/cases/compile_errors/align_n_expr_function_pointers_is_a_compile_error.zig @@ -0,0 +1,9 @@ +export fn foo() align(1) void { + return; +} + +// error +// backend=stage2 +// target=wasm32-freestanding-none +// +// :1:8: error: 'align' is not allowed on functions in wasm diff --git a/test/cases/compile_errors/array_access_of_non_array.zig b/test/cases/compile_errors/array_access_of_non_array.zig new file mode 100644 index 0000000000000000000000000000000000000000..06fa1569e660deaf142b846f19ead476505f6cd8 --- /dev/null +++ b/test/cases/compile_errors/array_access_of_non_array.zig @@ -0,0 +1,15 @@ +export fn f() void { + var bad : bool = undefined; + bad[0] = bad[0]; +} +export fn g() void { + var bad : bool = undefined; + _ = bad[0]; +} + +// error +// backend=stage2 +// target=native +// +// :3:8: error: element access of non-indexable type 'bool' +// :7:12: error: element access of non-indexable type 'bool' diff --git a/test/cases/compile_errors/array_access_with_non_integer_index.zig b/test/cases/compile_errors/array_access_with_non_integer_index.zig new file mode 100644 index 0000000000000000000000000000000000000000..3d7bde7364df1c727af3bb7d47841335a31131fc --- /dev/null +++ b/test/cases/compile_errors/array_access_with_non_integer_index.zig @@ -0,0 +1,17 @@ +export fn f() void { + var array = "aoeu"; + var bad = false; + array[bad] = array[bad]; +} +export fn g() void { + var array = "aoeu"; + var bad = false; + _ = array[bad]; +} + +// error +// backend=stage2 +// target=native +// +// :4:11: error: expected type 'usize', found 'bool' +// :9:15: error: expected type 'usize', found 'bool' diff --git a/test/cases/compile_errors/control_reaches_end_of_non-void_function.zig b/test/cases/compile_errors/control_reaches_end_of_non-void_function.zig new file mode 100644 index 0000000000000000000000000000000000000000..c92b6b092715d435426a4763a657de647cdbbcf6 --- /dev/null +++ b/test/cases/compile_errors/control_reaches_end_of_non-void_function.zig @@ -0,0 +1,9 @@ +fn a() i32 {} +export fn entry() void { _ = a(); } + +// error +// backend=stage2 +// target=native +// +// :1:13: error: expected type 'i32', found 'void' +// :1:8: note: function return type declared here diff --git a/test/cases/compile_errors/endless_loop_in_function_evaluation.zig b/test/cases/compile_errors/endless_loop_in_function_evaluation.zig new file mode 100644 index 0000000000000000000000000000000000000000..7616bfa5e752d87d0b01a1ebcdbe6385d179f4f5 --- /dev/null +++ b/test/cases/compile_errors/endless_loop_in_function_evaluation.zig @@ -0,0 +1,15 @@ +const seventh_fib_number = fibonacci(7); +fn fibonacci(x: i32) i32 { + return fibonacci(x - 1) + fibonacci(x - 2); +} + +export fn entry() usize { return @sizeOf(@TypeOf(&seventh_fib_number)); } + +// error +// backend=stage2 +// target=native +// +// :3:21: error: evaluation exceeded 1000 backwards branches +// :3:21: note: use @setEvalBranchQuota() to raise the branch limit from 1000 +// :3:21: note: called from here (999 times) +// :1:37: note: called from here diff --git a/test/cases/compile_errors/load_too_many_bytes_from_comptime_reinterpreted_pointer.zig b/test/cases/compile_errors/load_too_many_bytes_from_comptime_reinterpreted_pointer.zig new file mode 100644 index 0000000000000000000000000000000000000000..a86fbc012765076fd3cdb020648a5192b4256f3b --- /dev/null +++ b/test/cases/compile_errors/load_too_many_bytes_from_comptime_reinterpreted_pointer.zig @@ -0,0 +1,13 @@ +export fn entry() void { + const float: f32 = 5.99999999999994648725e-01; + const float_ptr = &float; + const int_ptr = @ptrCast(*const i64, float_ptr); + const int_val = int_ptr.*; + _ = int_val; +} + +// error +// backend=stage2 +// target=native +// +// :5:28: error: dereference of '*const i64' exceeds bounds of containing decl of type 'f32' diff --git a/test/cases/compile_errors/stage1/aligned_variable_of_zero-bit_type.zig b/test/cases/compile_errors/stage1/aligned_variable_of_zero-bit_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..f09f92aca782d98925abbe67f50ae573cbce32e0 --- /dev/null +++ b/test/cases/compile_errors/stage1/aligned_variable_of_zero-bit_type.zig @@ -0,0 +1,10 @@ +export fn f() void { + var s: struct {} align(4) = undefined; + _ = s; +} + +// error +// backend=stage1 +// target=native +// +// tmp.zig:2:5: error: variable 's' of zero-bit type 'struct:2:12' has no in-memory representation, it cannot be aligned diff --git a/test/cases/compile_errors/stage1/implicit_casting_undefined_c_pointer_to_zig_pointer.zig b/test/cases/compile_errors/stage1/implicit_casting_undefined_c_pointer_to_zig_pointer.zig new file mode 100644 index 0000000000000000000000000000000000000000..5554146fa57dd3278dcb1ed933220dd098bf9943 --- /dev/null +++ b/test/cases/compile_errors/stage1/implicit_casting_undefined_c_pointer_to_zig_pointer.zig @@ -0,0 +1,11 @@ +comptime { + var c_ptr: [*c]u8 = undefined; + var zig_ptr: *u8 = c_ptr; + _ = zig_ptr; +} + +// error +// backend=stage1 +// target=native +// +// tmp.zig:3:24: error: use of undefined value here causes undefined behavior diff --git a/test/cases/compile_errors/stage1/obj/align_n_expr_function_pointers_is_a_compile_error.zig b/test/cases/compile_errors/stage1/obj/align_n_expr_function_pointers_is_a_compile_error.zig deleted file mode 100644 index bd41b3e6574b317af3c5e0c1554b8bf39533f7bd..0000000000000000000000000000000000000000 --- a/test/cases/compile_errors/stage1/obj/align_n_expr_function_pointers_is_a_compile_error.zig +++ /dev/null @@ -1,9 +0,0 @@ -export fn foo() align(1) void { - return; -} - -// error -// backend=stage1 -// target=wasm32-freestanding-none -// -// tmp.zig:1:23: error: align(N) expr is not allowed on function prototypes in wasm32/wasm64 diff --git a/test/cases/compile_errors/stage1/obj/aligned_variable_of_zero-bit_type.zig b/test/cases/compile_errors/stage1/obj/aligned_variable_of_zero-bit_type.zig deleted file mode 100644 index f09f92aca782d98925abbe67f50ae573cbce32e0..0000000000000000000000000000000000000000 --- a/test/cases/compile_errors/stage1/obj/aligned_variable_of_zero-bit_type.zig +++ /dev/null @@ -1,10 +0,0 @@ -export fn f() void { - var s: struct {} align(4) = undefined; - _ = s; -} - -// error -// backend=stage1 -// target=native -// -// tmp.zig:2:5: error: variable 's' of zero-bit type 'struct:2:12' has no in-memory representation, it cannot be aligned diff --git a/test/cases/compile_errors/stage1/obj/array_access_of_non_array.zig b/test/cases/compile_errors/stage1/obj/array_access_of_non_array.zig deleted file mode 100644 index 7045f2fdbd304867e7e52ce889c7f69212923e74..0000000000000000000000000000000000000000 --- a/test/cases/compile_errors/stage1/obj/array_access_of_non_array.zig +++ /dev/null @@ -1,15 +0,0 @@ -export fn f() void { - var bad : bool = undefined; - bad[0] = bad[0]; -} -export fn g() void { - var bad : bool = undefined; - _ = bad[0]; -} - -// error -// backend=stage1 -// target=native -// -// tmp.zig:3:8: error: array access of non-array type 'bool' -// tmp.zig:7:12: error: array access of non-array type 'bool' diff --git a/test/cases/compile_errors/stage1/obj/array_access_with_non_integer_index.zig b/test/cases/compile_errors/stage1/obj/array_access_with_non_integer_index.zig deleted file mode 100644 index de0a58656c5789a4f3689cf0a9a7eeed41a6fd26..0000000000000000000000000000000000000000 --- a/test/cases/compile_errors/stage1/obj/array_access_with_non_integer_index.zig +++ /dev/null @@ -1,17 +0,0 @@ -export fn f() void { - var array = "aoeu"; - var bad = false; - array[bad] = array[bad]; -} -export fn g() void { - var array = "aoeu"; - var bad = false; - _ = array[bad]; -} - -// error -// backend=stage1 -// target=native -// -// tmp.zig:4:11: error: expected type 'usize', found 'bool' -// tmp.zig:9:15: error: expected type 'usize', found 'bool' diff --git a/test/cases/compile_errors/stage1/obj/control_reaches_end_of_non-void_function.zig b/test/cases/compile_errors/stage1/obj/control_reaches_end_of_non-void_function.zig deleted file mode 100644 index e15c1bd40bcb827a1d99c629de9f9ecc381cccde..0000000000000000000000000000000000000000 --- a/test/cases/compile_errors/stage1/obj/control_reaches_end_of_non-void_function.zig +++ /dev/null @@ -1,8 +0,0 @@ -fn a() i32 {} -export fn entry() void { _ = a(); } - -// error -// backend=stage1 -// target=native -// -// tmp.zig:1:12: error: expected type 'i32', found 'void' diff --git a/test/cases/compile_errors/stage1/obj/endless_loop_in_function_evaluation.zig b/test/cases/compile_errors/stage1/obj/endless_loop_in_function_evaluation.zig deleted file mode 100644 index 302ee242e094611b64e0dcbee97e895b06016c05..0000000000000000000000000000000000000000 --- a/test/cases/compile_errors/stage1/obj/endless_loop_in_function_evaluation.zig +++ /dev/null @@ -1,12 +0,0 @@ -const seventh_fib_number = fibonacci(7); -fn fibonacci(x: i32) i32 { - return fibonacci(x - 1) + fibonacci(x - 2); -} - -export fn entry() usize { return @sizeOf(@TypeOf(seventh_fib_number)); } - -// error -// backend=stage1 -// target=native -// -// tmp.zig:3:21: error: evaluation exceeded 1000 backwards branches diff --git a/test/cases/compile_errors/stage1/obj/implicit_casting_undefined_c_pointer_to_zig_pointer.zig b/test/cases/compile_errors/stage1/obj/implicit_casting_undefined_c_pointer_to_zig_pointer.zig deleted file mode 100644 index 5554146fa57dd3278dcb1ed933220dd098bf9943..0000000000000000000000000000000000000000 --- a/test/cases/compile_errors/stage1/obj/implicit_casting_undefined_c_pointer_to_zig_pointer.zig +++ /dev/null @@ -1,11 +0,0 @@ -comptime { - var c_ptr: [*c]u8 = undefined; - var zig_ptr: *u8 = c_ptr; - _ = zig_ptr; -} - -// error -// backend=stage1 -// target=native -// -// tmp.zig:3:24: error: use of undefined value here causes undefined behavior diff --git a/test/cases/compile_errors/stage1/obj/load_too_many_bytes_from_comptime_reinterpreted_pointer.zig b/test/cases/compile_errors/stage1/obj/load_too_many_bytes_from_comptime_reinterpreted_pointer.zig deleted file mode 100644 index b275dbbeedbef7f25a3ec42a3c9a3e3c757542bc..0000000000000000000000000000000000000000 --- a/test/cases/compile_errors/stage1/obj/load_too_many_bytes_from_comptime_reinterpreted_pointer.zig +++ /dev/null @@ -1,13 +0,0 @@ -export fn entry() void { - const float: f32 = 5.99999999999994648725e-01; - const float_ptr = &float; - const int_ptr = @ptrCast(*const i64, float_ptr); - const int_val = int_ptr.*; - _ = int_val; -} - -// error -// backend=stage1 -// target=native -// -// tmp.zig:5:28: error: attempt to read 8 bytes from pointer to f32 which is 4 bytes diff --git a/test/cases/compile_errors/stage1/obj/use_implicit_casts_to_assign_null_to_non-nullable_pointer.zig b/test/cases/compile_errors/stage1/obj/use_implicit_casts_to_assign_null_to_non-nullable_pointer.zig deleted file mode 100644 index 4263f38e3e8c56d9bc77513de039fef49060c39a..0000000000000000000000000000000000000000 --- a/test/cases/compile_errors/stage1/obj/use_implicit_casts_to_assign_null_to_non-nullable_pointer.zig +++ /dev/null @@ -1,14 +0,0 @@ -export fn entry() void { - var x: i32 = 1234; - var p: *i32 = &x; - var pp: *?*i32 = &p; - pp.* = null; - var y = p.*; - _ = y; -} - -// error -// backend=stage1 -// target=native -// -// tmp.zig:4:23: error: expected type '*?*i32', found '**i32' diff --git a/test/cases/compile_errors/use_implicit_casts_to_assign_null_to_non-nullable_pointer.zig b/test/cases/compile_errors/use_implicit_casts_to_assign_null_to_non-nullable_pointer.zig new file mode 100644 index 0000000000000000000000000000000000000000..0842e98895787448a8c3d0bdf84297eafeabfcf5 --- /dev/null +++ b/test/cases/compile_errors/use_implicit_casts_to_assign_null_to_non-nullable_pointer.zig @@ -0,0 +1,16 @@ +export fn entry() void { + var x: i32 = 1234; + var p: *i32 = &x; + var pp: *?*i32 = &p; + pp.* = null; + var y = p.*; + _ = y; +} + +// error +// backend=stage2 +// target=native +// +// :4:22: error: expected type '*?*i32', found '**i32' +// :4:22: note: pointer type child '*i32' cannot cast into pointer type child '?*i32' +// :4:22: note: mutable '*i32' allows illegal null values stored to type '?*i32'