diff options
| author | Veikka Tuominen <git@vexu.eu> | 2022-07-11 17:54:53 +0300 |
|---|---|---|
| committer | Veikka Tuominen <git@vexu.eu> | 2022-07-11 18:47:29 +0300 |
| commit | d00da05ecbeca36e8ca25dcb1238bf98b38081a5 (patch) | |
| tree | 3c47892fb4a3485ba7a3400a523729b16484646b /test/cases/compile_errors | |
| parent | 3ceb27c8401df17e5a7f522d68104da79501b5b6 (diff) | |
| download | zig-d00da05ecbeca36e8ca25dcb1238bf98b38081a5.tar.gz zig-d00da05ecbeca36e8ca25dcb1238bf98b38081a5.zip | |
Sema: validate extern types
Diffstat (limited to 'test/cases/compile_errors')
9 files changed, 63 insertions, 43 deletions
diff --git a/test/cases/compile_errors/c_pointer_to_void.zig b/test/cases/compile_errors/c_pointer_to_void.zig new file mode 100644 index 0000000000..aeb5f42dec --- /dev/null +++ b/test/cases/compile_errors/c_pointer_to_void.zig @@ -0,0 +1,11 @@ +export fn entry() void { + var a: [*c]void = undefined; + _ = a; +} + +// error +// backend=stage2 +// target=native +// +// :1:1: error: C pointers cannot point to non-C-ABI-compatible type 'void' +// :1:1: note: 'void' is a zero bit type; for C 'void' use 'anyopaque' diff --git a/test/cases/compile_errors/exported_enum_without_explicit_integer_tag_type.zig b/test/cases/compile_errors/exported_enum_without_explicit_integer_tag_type.zig new file mode 100644 index 0000000000..606dda4b6e --- /dev/null +++ b/test/cases/compile_errors/exported_enum_without_explicit_integer_tag_type.zig @@ -0,0 +1,18 @@ +const E = enum { one, two }; +comptime { + @export(E, .{ .name = "E" }); +} +const e: E = .two; +comptime { + @export(e, .{ .name = "e" }); +} + +// error +// backend=stage2 +// target=native +// +// :3:5: error: unable to export type 'type' +// :7:5: error: unable to export type 'tmp.E' +// :7:5: note: enum tag type 'u1' is not extern compatible +// :7:5: note: only integers with power of two bits are extern compatible +// :1:11: note: enum declared here diff --git a/test/cases/compile_errors/stage1/obj/extern_struct_with_extern-compatible_but_inferred_integer_tag_type.zig b/test/cases/compile_errors/extern_struct_with_extern-compatible_but_inferred_integer_tag_type.zig index 8f45a0e5dc..1740574389 100644 --- a/test/cases/compile_errors/stage1/obj/extern_struct_with_extern-compatible_but_inferred_integer_tag_type.zig +++ b/test/cases/compile_errors/extern_struct_with_extern-compatible_but_inferred_integer_tag_type.zig @@ -25,19 +25,21 @@ pub const E = enum { @"227",@"228",@"229",@"230",@"231",@"232",@"233",@"234",@"235", @"236",@"237",@"238",@"239",@"240",@"241",@"242",@"243",@"244", @"245",@"246",@"247",@"248",@"249",@"250",@"251",@"252",@"253", -@"254",@"255" +@"254",@"255", @"256" }; pub const S = extern struct { e: E, }; export fn entry() void { - if (@typeInfo(E).Enum.tag_type != u8) @compileError("did not infer u8 tag type"); const s: S = undefined; _ = s; } // error -// backend=stage1 +// backend=stage2 // target=native // -// tmp.zig:31:5: error: extern structs cannot contain fields of type 'E' +// :33:8: error: extern structs cannot contain fields of type 'tmp.E' +// :33:8: note: enum tag type 'u9' is not extern compatible +// :33:8: note: only integers with power of two bits are extern compatible +// :1:15: note: enum declared here diff --git a/test/cases/compile_errors/extern_struct_with_non-extern-compatible_integer_tag_type.zig b/test/cases/compile_errors/extern_struct_with_non-extern-compatible_integer_tag_type.zig new file mode 100644 index 0000000000..5fb36b707d --- /dev/null +++ b/test/cases/compile_errors/extern_struct_with_non-extern-compatible_integer_tag_type.zig @@ -0,0 +1,17 @@ +pub const E = enum(u31) { A, B, C }; +pub const S = extern struct { + e: E, +}; +export fn entry() void { + const s: S = undefined; + _ = s; +} + +// error +// backend=stage2 +// target=native +// +// :5:8: error: extern structs cannot contain fields of type 'tmp.E' +// :5:8: note: enum tag type 'u31' is not extern compatible +// :5:8: note: only integers with power of two bits are extern compatible +// :1:15: note: enum declared here diff --git a/test/cases/compile_errors/invalid_optional_type_in_extern_struct.zig b/test/cases/compile_errors/invalid_optional_type_in_extern_struct.zig new file mode 100644 index 0000000000..9a6c77363c --- /dev/null +++ b/test/cases/compile_errors/invalid_optional_type_in_extern_struct.zig @@ -0,0 +1,11 @@ +const stroo = extern struct { + moo: ?[*c]u8, +}; +export fn testf(fluff: *stroo) void { _ = fluff; } + +// error +// backend=stage2 +// target=native +// +// :4:8: error: extern structs cannot contain fields of type '?[*c]u8' +// :4:8: note: only pointer like optionals are extern compatible diff --git a/test/cases/compile_errors/stage1/obj/exported_enum_without_explicit_integer_tag_type.zig b/test/cases/compile_errors/stage1/obj/exported_enum_without_explicit_integer_tag_type.zig deleted file mode 100644 index c432bedd6b..0000000000 --- a/test/cases/compile_errors/stage1/obj/exported_enum_without_explicit_integer_tag_type.zig +++ /dev/null @@ -1,15 +0,0 @@ -const E = enum { one, two }; -comptime { - @export(E, .{ .name = "E" }); -} -const e: E = .two; -comptime { - @export(e, .{ .name = "e" }); -} - -// error -// backend=stage1 -// target=native -// -// tmp.zig:3:13: error: exported enum without explicit integer tag type -// tmp.zig:7:13: error: exported enum value without explicit integer tag type diff --git a/test/cases/compile_errors/stage1/obj/extern_struct_with_non-extern-compatible_integer_tag_type.zig b/test/cases/compile_errors/stage1/obj/extern_struct_with_non-extern-compatible_integer_tag_type.zig deleted file mode 100644 index aa508056a1..0000000000 --- a/test/cases/compile_errors/stage1/obj/extern_struct_with_non-extern-compatible_integer_tag_type.zig +++ /dev/null @@ -1,14 +0,0 @@ -pub const E = enum(u31) { A, B, C }; -pub const S = extern struct { - e: E, -}; -export fn entry() void { - const s: S = undefined; - _ = s; -} - -// error -// backend=stage1 -// target=native -// -// tmp.zig:3:5: error: extern structs cannot contain fields of type 'E' diff --git a/test/cases/compile_errors/stage1/obj/invalid_optional_type_in_extern_struct.zig b/test/cases/compile_errors/stage1/obj/invalid_optional_type_in_extern_struct.zig deleted file mode 100644 index dc2e2690b8..0000000000 --- a/test/cases/compile_errors/stage1/obj/invalid_optional_type_in_extern_struct.zig +++ /dev/null @@ -1,10 +0,0 @@ -const stroo = extern struct { - moo: ?[*c]u8, -}; -export fn testf(fluff: *stroo) void { _ = fluff; } - -// error -// backend=stage1 -// target=native -// -// tmp.zig:2:5: error: extern structs cannot contain fields of type '?[*c]u8' diff --git a/test/cases/compile_errors/stage1/obj/optional_pointer_to_void_in_extern_struct.zig b/test/cases/compile_errors/stage1/optional_pointer_to_void_in_extern_struct.zig index 552f672ad6..552f672ad6 100644 --- a/test/cases/compile_errors/stage1/obj/optional_pointer_to_void_in_extern_struct.zig +++ b/test/cases/compile_errors/stage1/optional_pointer_to_void_in_extern_struct.zig |
