aboutsummaryrefslogtreecommitdiff
path: root/test/cases/compile_errors
diff options
context:
space:
mode:
authorVeikka Tuominen <git@vexu.eu>2022-07-11 17:54:53 +0300
committerVeikka Tuominen <git@vexu.eu>2022-07-11 18:47:29 +0300
commitd00da05ecbeca36e8ca25dcb1238bf98b38081a5 (patch)
tree3c47892fb4a3485ba7a3400a523729b16484646b /test/cases/compile_errors
parent3ceb27c8401df17e5a7f522d68104da79501b5b6 (diff)
downloadzig-d00da05ecbeca36e8ca25dcb1238bf98b38081a5.tar.gz
zig-d00da05ecbeca36e8ca25dcb1238bf98b38081a5.zip
Sema: validate extern types
Diffstat (limited to 'test/cases/compile_errors')
-rw-r--r--test/cases/compile_errors/c_pointer_to_void.zig11
-rw-r--r--test/cases/compile_errors/exported_enum_without_explicit_integer_tag_type.zig18
-rw-r--r--test/cases/compile_errors/extern_struct_with_extern-compatible_but_inferred_integer_tag_type.zig (renamed from test/cases/compile_errors/stage1/obj/extern_struct_with_extern-compatible_but_inferred_integer_tag_type.zig)10
-rw-r--r--test/cases/compile_errors/extern_struct_with_non-extern-compatible_integer_tag_type.zig17
-rw-r--r--test/cases/compile_errors/invalid_optional_type_in_extern_struct.zig11
-rw-r--r--test/cases/compile_errors/stage1/obj/exported_enum_without_explicit_integer_tag_type.zig15
-rw-r--r--test/cases/compile_errors/stage1/obj/extern_struct_with_non-extern-compatible_integer_tag_type.zig14
-rw-r--r--test/cases/compile_errors/stage1/obj/invalid_optional_type_in_extern_struct.zig10
-rw-r--r--test/cases/compile_errors/stage1/optional_pointer_to_void_in_extern_struct.zig (renamed from test/cases/compile_errors/stage1/obj/optional_pointer_to_void_in_extern_struct.zig)0
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