diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2022-09-20 22:02:36 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-09-20 22:02:36 -0400 |
| commit | 62ecc154d9ad065aee57d81afd3a478dd8360fb7 (patch) | |
| tree | 52f17b58d87a2ef83f2a1607f0aecbee31c33661 /test/cases/compile_errors | |
| parent | 521c753fda3cd5ebb79752287ef3c87d84f8d5c3 (diff) | |
| parent | eef653904916dc19540458199366807f8837bf98 (diff) | |
| download | zig-62ecc154d9ad065aee57d81afd3a478dd8360fb7.tar.gz zig-62ecc154d9ad065aee57d81afd3a478dd8360fb7.zip | |
Merge pull request #12904 from Vexu/ptrcast
stage2: pointer casting fixes and improvements
Diffstat (limited to 'test/cases/compile_errors')
17 files changed, 133 insertions, 105 deletions
diff --git a/test/cases/compile_errors/alignOf_bad_type.zig b/test/cases/compile_errors/alignOf_bad_type.zig new file mode 100644 index 0000000000..5408c21314 --- /dev/null +++ b/test/cases/compile_errors/alignOf_bad_type.zig @@ -0,0 +1,9 @@ +export fn entry() usize { + return @alignOf(noreturn); +} + +// error +// backend=stage2 +// target=native +// +// :2:21: error: no align available for type 'noreturn' diff --git a/test/cases/compile_errors/attempted_implicit_cast_from_const_T_to_sliceT.zig b/test/cases/compile_errors/attempted_implicit_cast_from_const_T_to_sliceT.zig index 0634b4696f..ad3b0a7254 100644 --- a/test/cases/compile_errors/attempted_implicit_cast_from_const_T_to_sliceT.zig +++ b/test/cases/compile_errors/attempted_implicit_cast_from_const_T_to_sliceT.zig @@ -9,3 +9,4 @@ export fn entry() void { // target=native // // :3:22: error: expected type '[]u32', found '*const u32' +// :3:22: note: cast discards const qualifier diff --git a/test/cases/compile_errors/implicit_cast_between_C_pointer_and_Zig_pointer-bad_const-align-child.zig b/test/cases/compile_errors/implicit_cast_between_C_pointer_and_Zig_pointer-bad_const-align-child.zig new file mode 100644 index 0000000000..78261f182f --- /dev/null +++ b/test/cases/compile_errors/implicit_cast_between_C_pointer_and_Zig_pointer-bad_const-align-child.zig @@ -0,0 +1,47 @@ +export fn a() void { + var x: [*c]u8 = undefined; + var y: *align(4) u8 = x; + _ = y; +} +export fn b() void { + var x: [*c]const u8 = undefined; + var y: *u8 = x; + _ = y; +} +export fn c() void { + var x: [*c]u8 = undefined; + var y: *u32 = x; + _ = y; +} +export fn d() void { + var y: *align(1) u32 = undefined; + var x: [*c]u32 = y; + _ = x; +} +export fn e() void { + var y: *const u8 = undefined; + var x: [*c]u8 = y; + _ = x; +} +export fn f() void { + var y: *u8 = undefined; + var x: [*c]u32 = y; + _ = x; +} + +// error +// backend=stage2 +// target=native +// +// :3:27: error: expected type '*align(4) u8', found '[*c]u8' +// :3:27: note: pointer alignment '1' cannot cast into pointer alignment '4' +// :8:18: error: expected type '*u8', found '[*c]const u8' +// :8:18: note: cast discards const qualifier +// :13:19: error: expected type '*u32', found '[*c]u8' +// :13:19: note: pointer type child 'u8' cannot cast into pointer type child 'u32' +// :18:22: error: expected type '[*c]u32', found '*align(1) u32' +// :18:22: note: pointer alignment '1' cannot cast into pointer alignment '4' +// :23:21: error: expected type '[*c]u8', found '*const u8' +// :23:21: note: cast discards const qualifier +// :28:22: error: expected type '[*c]u32', found '*u8' +// :28:22: note: pointer type child 'u8' cannot cast into pointer type child 'u32' diff --git a/test/cases/compile_errors/implicit_cast_const_array_to_mutable_slice.zig b/test/cases/compile_errors/implicit_cast_const_array_to_mutable_slice.zig new file mode 100644 index 0000000000..2a80b9ffbc --- /dev/null +++ b/test/cases/compile_errors/implicit_cast_const_array_to_mutable_slice.zig @@ -0,0 +1,26 @@ +export fn entry() void { + const buffer: [1]u8 = [_]u8{8}; + const sliceA: []u8 = &buffer; + _ = sliceA; +} +export fn entry1() void { + const str: *const [0:0]u8 = ""; + const slice: [:0]u8 = str; + _ = slice; +} +export fn entry2() void { + const str: *const [0:0]u8 = ""; + const many: [*]u8 = str; + _ = many; +} + +// error +// backend=stage2 +// target=native +// +// :3:26: error: expected type '[]u8', found '*const [1]u8' +// :3:26: note: cast discards const qualifier +// :8:27: error: expected type '[:0]u8', found '*const [0:0]u8' +// :8:27: note: cast discards const qualifier +// :13:25: error: expected type '[*]u8', found '*const [0:0]u8' +// :13:25: note: cast discards const qualifier diff --git a/test/cases/compile_errors/stage1/obj/implicitly_increasing_slice_alignment.zig b/test/cases/compile_errors/implicitly_increasing_slice_alignment.zig index 2e5c201b5d..84ec6464f4 100644 --- a/test/cases/compile_errors/stage1/obj/implicitly_increasing_slice_alignment.zig +++ b/test/cases/compile_errors/implicitly_increasing_slice_alignment.zig @@ -14,9 +14,8 @@ fn bar(x: []u32) void { } // error -// backend=stage1 +// backend=stage2 // target=native // -// tmp.zig:9:26: error: cast increases pointer alignment -// tmp.zig:9:26: note: '*align(1) u32' has alignment 1 -// tmp.zig:9:26: note: '*[1]u32' has alignment 4 +// :9:22: error: expected type '*[1]u32', found '*align(1) u32' +// :9:22: note: pointer alignment '1' cannot cast into pointer alignment '4' diff --git a/test/cases/compile_errors/stage1/obj/increase_pointer_alignment_in_ptrCast.zig b/test/cases/compile_errors/increase_pointer_alignment_in_ptrCast.zig index f3f67ca4c6..9cc5ed3a42 100644 --- a/test/cases/compile_errors/stage1/obj/increase_pointer_alignment_in_ptrCast.zig +++ b/test/cases/compile_errors/increase_pointer_alignment_in_ptrCast.zig @@ -5,9 +5,9 @@ export fn entry() u32 { } // error -// backend=stage1 +// backend=stage2 // target=native // -// tmp.zig:3:17: error: cast increases pointer alignment -// tmp.zig:3:38: note: '*u8' has alignment 1 -// tmp.zig:3:26: note: '*u32' has alignment 4 +// :3:17: error: cast increases pointer alignment +// :3:32: note: '*u8' has alignment '1' +// :3:26: note: '*u32' has alignment '4' diff --git a/test/cases/compile_errors/stage1/obj/issue_5221_invalid_struct_init_type_referenced_by_typeInfo_and_passed_into_function.zig b/test/cases/compile_errors/issue_5221_invalid_struct_init_type_referenced_by_typeInfo_and_passed_into_function.zig index a622ceb44e..abcccb659e 100644 --- a/test/cases/compile_errors/stage1/obj/issue_5221_invalid_struct_init_type_referenced_by_typeInfo_and_passed_into_function.zig +++ b/test/cases/compile_errors/issue_5221_invalid_struct_init_type_referenced_by_typeInfo_and_passed_into_function.zig @@ -9,8 +9,8 @@ export fn foo() void { } // error -// backend=stage1 +// backend=stage2 // target=native // -// :5:28: error: cannot cast pointer to array literal to slice type '[]u8' -// :5:28: note: cast discards const qualifier +// :4:22: error: expected type '[]u8', found '*const [3:0]u8' +// :4:22: note: cast discards const qualifier 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 index a86fbc0127..baeb3e8c82 100644 --- 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 @@ -1,5 +1,5 @@ export fn entry() void { - const float: f32 = 5.99999999999994648725e-01; + const float: f32 align(@alignOf(i64)) = 5.99999999999994648725e-01; const float_ptr = &float; const int_ptr = @ptrCast(*const i64, float_ptr); const int_val = int_ptr.*; diff --git a/test/cases/compile_errors/peer_cast_then_implicit_cast_const_pointer_to_mutable_C_pointer.zig b/test/cases/compile_errors/peer_cast_then_implicit_cast_const_pointer_to_mutable_C_pointer.zig new file mode 100644 index 0000000000..fd01927889 --- /dev/null +++ b/test/cases/compile_errors/peer_cast_then_implicit_cast_const_pointer_to_mutable_C_pointer.zig @@ -0,0 +1,11 @@ +export fn func() void { + var strValue: [*c]u8 = undefined; + strValue = strValue orelse ""; +} + +// error +// backend=stage2 +// target=native +// +// :3:32: error: expected type '[*c]u8', found '*const [0:0]u8' +// :3:32: note: cast discards const qualifier diff --git a/test/cases/compile_errors/pointer_attributes_checked_when_coercing_pointer_to_anon_literal.zig b/test/cases/compile_errors/pointer_attributes_checked_when_coercing_pointer_to_anon_literal.zig new file mode 100644 index 0000000000..c0a0b06af0 --- /dev/null +++ b/test/cases/compile_errors/pointer_attributes_checked_when_coercing_pointer_to_anon_literal.zig @@ -0,0 +1,24 @@ +comptime { + const c: [][]const u8 = &.{ "hello", "world" }; + _ = c; +} +comptime { + const c: *[2][]const u8 = &.{ "hello", "world" }; + _ = c; +} +const S = struct { a: u8 = 1, b: u32 = 2 }; +comptime { + const c: *S = &.{ .a = 2 }; + _ = c; +} + +// error +// backend=stage2 +// target=native +// +// :2:29: error: expected type '[][]const u8', found '*const tuple{comptime *const [5:0]u8 = "hello", comptime *const [5:0]u8 = "world"}' +// :2:29: note: cast discards const qualifier +// :6:31: error: expected type '*[2][]const u8', found '*const tuple{comptime *const [5:0]u8 = "hello", comptime *const [5:0]u8 = "world"}' +// :6:31: note: cast discards const qualifier +// :11:19: error: expected type '*tmp.S', found '*const struct{comptime a: comptime_int = 2}' +// :11:19: note: cast discards const qualifier diff --git a/test/cases/compile_errors/stage1/obj/ptrCast_discards_const_qualifier.zig b/test/cases/compile_errors/ptrCast_discards_const_qualifier.zig index 1a90ff73f8..a2fea4ff11 100644 --- a/test/cases/compile_errors/stage1/obj/ptrCast_discards_const_qualifier.zig +++ b/test/cases/compile_errors/ptrCast_discards_const_qualifier.zig @@ -5,7 +5,7 @@ export fn entry() void { } // error -// backend=stage1 +// backend=stage2 // target=native // -// tmp.zig:3:15: error: cast discards const qualifier +// :3:15: error: cast discards const qualifier diff --git a/test/cases/compile_errors/reading_past_end_of_pointer_casted_array.zig b/test/cases/compile_errors/reading_past_end_of_pointer_casted_array.zig index 906b292753..d3d9b03ff5 100644 --- a/test/cases/compile_errors/reading_past_end_of_pointer_casted_array.zig +++ b/test/cases/compile_errors/reading_past_end_of_pointer_casted_array.zig @@ -1,7 +1,7 @@ comptime { const array: [4]u8 = "aoeu".*; const sub_array = array[1..]; - const int_ptr = @ptrCast(*const u24, sub_array); + const int_ptr = @ptrCast(*const u24, @alignCast(@alignOf(u24), sub_array)); const deref = int_ptr.*; _ = deref; } diff --git a/test/cases/compile_errors/slice_cannot_have_its_bytes_reinterpreted.zig b/test/cases/compile_errors/slice_cannot_have_its_bytes_reinterpreted.zig index 2280345e15..5fab9c90a9 100644 --- a/test/cases/compile_errors/slice_cannot_have_its_bytes_reinterpreted.zig +++ b/test/cases/compile_errors/slice_cannot_have_its_bytes_reinterpreted.zig @@ -1,5 +1,5 @@ export fn foo() void { - const bytes = [1]u8{ 0xfa } ** 16; + const bytes align(@alignOf([]const u8)) = [1]u8{0xfa} ** 16; var value = @ptrCast(*const []const u8, &bytes).*; _ = value; } diff --git a/test/cases/compile_errors/stage1/obj/implicit_cast_between_C_pointer_and_Zig_pointer-bad_const-align-child.zig b/test/cases/compile_errors/stage1/obj/implicit_cast_between_C_pointer_and_Zig_pointer-bad_const-align-child.zig deleted file mode 100644 index 6ff155b591..0000000000 --- a/test/cases/compile_errors/stage1/obj/implicit_cast_between_C_pointer_and_Zig_pointer-bad_const-align-child.zig +++ /dev/null @@ -1,42 +0,0 @@ -export fn a() void { - var x: [*c]u8 = undefined; - var y: *align(4) u8 = x; - _ = y; -} -export fn b() void { - var x: [*c]const u8 = undefined; - var y: *u8 = x; - _ = y; -} -export fn c() void { - var x: [*c]u8 = undefined; - var y: *u32 = x; - _ = y; -} -export fn d() void { - var y: *align(1) u32 = undefined; - var x: [*c]u32 = y; - _ = x; -} -export fn e() void { - var y: *const u8 = undefined; - var x: [*c]u8 = y; - _ = x; -} -export fn f() void { - var y: *u8 = undefined; - var x: [*c]u32 = y; - _ = x; -} - -// error -// backend=stage1 -// target=native -// -// tmp.zig:3:27: error: cast increases pointer alignment -// tmp.zig:8:18: error: cast discards const qualifier -// tmp.zig:13:19: error: expected type '*u32', found '[*c]u8' -// tmp.zig:13:19: note: pointer type child 'u8' cannot cast into pointer type child 'u32' -// tmp.zig:18:22: error: cast increases pointer alignment -// tmp.zig:23:21: error: cast discards const qualifier -// tmp.zig:28:22: error: expected type '[*c]u32', found '*u8' diff --git a/test/cases/compile_errors/stage1/obj/implicit_cast_const_array_to_mutable_slice.zig b/test/cases/compile_errors/stage1/obj/implicit_cast_const_array_to_mutable_slice.zig deleted file mode 100644 index 3f22cbed6b..0000000000 --- a/test/cases/compile_errors/stage1/obj/implicit_cast_const_array_to_mutable_slice.zig +++ /dev/null @@ -1,12 +0,0 @@ -export fn entry() void { - const buffer: [1]u8 = [_]u8{8}; - const sliceA: []u8 = &buffer; - _ = sliceA; -} - -// error -// backend=stage1 -// target=native -// -// tmp.zig:3:27: error: cannot cast pointer to array literal to slice type '[]u8' -// tmp.zig:3:27: note: cast discards const qualifier diff --git a/test/cases/compile_errors/stage1/obj/peer_cast_then_implicit_cast_const_pointer_to_mutable_C_pointer.zig b/test/cases/compile_errors/stage1/obj/peer_cast_then_implicit_cast_const_pointer_to_mutable_C_pointer.zig deleted file mode 100644 index 7d18e760c3..0000000000 --- a/test/cases/compile_errors/stage1/obj/peer_cast_then_implicit_cast_const_pointer_to_mutable_C_pointer.zig +++ /dev/null @@ -1,11 +0,0 @@ -export fn func() void { - var strValue: [*c]u8 = undefined; - strValue = strValue orelse ""; -} - -// error -// backend=stage1 -// target=native -// -// tmp.zig:3:32: error: expected type '[*c]u8', found '*const [0:0]u8' -// tmp.zig:3:32: note: cast discards const qualifier diff --git a/test/cases/compile_errors/stage1/obj/pointer_attributes_checked_when_coercing_pointer_to_anon_literal.zig b/test/cases/compile_errors/stage1/obj/pointer_attributes_checked_when_coercing_pointer_to_anon_literal.zig deleted file mode 100644 index 8456c8afcb..0000000000 --- a/test/cases/compile_errors/stage1/obj/pointer_attributes_checked_when_coercing_pointer_to_anon_literal.zig +++ /dev/null @@ -1,24 +0,0 @@ -comptime { - const c: [][]const u8 = &.{"hello", "world" }; - _ = c; -} -comptime { - const c: *[2][]const u8 = &.{"hello", "world" }; - _ = c; -} -const S = struct {a: u8 = 1, b: u32 = 2}; -comptime { - const c: *S = &.{}; - _ = c; -} - -// error -// backend=stage1 -// target=native -// -// tmp.zig:2:31: error: cannot cast pointer to array literal to slice type '[][]const u8' -// tmp.zig:2:31: note: cast discards const qualifier -// tmp.zig:6:33: error: cannot cast pointer to array literal to '*[2][]const u8' -// tmp.zig:6:33: note: cast discards const qualifier -// tmp.zig:11:21: error: expected type '*S', found '*const struct:11:21' -// tmp.zig:11:21: note: cast discards const qualifier |
