From 1705a21f804a79d5267a198dc28d8a91dc0dc201 Mon Sep 17 00:00:00 2001 From: Veikka Tuominen Date: Tue, 19 Jul 2022 01:25:10 +0300 Subject: Sema: more union and enum tag type validation --- .../extern_union_given_enum_tag_type.zig | 20 ++++++++++++++++++++ .../non-enum_tag_type_passed_to_union.zig | 13 +++++++++++++ .../non-integer_tag_type_to_automatic_union_enum.zig | 13 +++++++++++++ .../compile_errors/non-integer_tag_type_to_enum.zig | 13 +++++++++++++ .../stage1/obj/extern_union_given_enum_tag_type.zig | 20 -------------------- .../stage1/obj/non-enum_tag_type_passed_to_union.zig | 13 ------------- .../non-integer_tag_type_to_automatic_union_enum.zig | 13 ------------- .../stage2/union_enum_field_missing.zig | 2 +- .../compile_errors/stage2/union_extra_field.zig | 2 +- .../switch_expression-missing_enumeration_prong.zig | 2 +- .../switch_on_enum_with_1_field_with_no_prongs.zig | 2 +- .../switching_with_non-exhaustive_enums.zig | 2 +- .../union_with_specified_enum_omits_field.zig | 2 +- 13 files changed, 65 insertions(+), 52 deletions(-) create mode 100644 test/cases/compile_errors/extern_union_given_enum_tag_type.zig create mode 100644 test/cases/compile_errors/non-enum_tag_type_passed_to_union.zig create mode 100644 test/cases/compile_errors/non-integer_tag_type_to_automatic_union_enum.zig create mode 100644 test/cases/compile_errors/non-integer_tag_type_to_enum.zig delete mode 100644 test/cases/compile_errors/stage1/obj/extern_union_given_enum_tag_type.zig delete mode 100644 test/cases/compile_errors/stage1/obj/non-enum_tag_type_passed_to_union.zig delete mode 100644 test/cases/compile_errors/stage1/obj/non-integer_tag_type_to_automatic_union_enum.zig (limited to 'test/cases/compile_errors') diff --git a/test/cases/compile_errors/extern_union_given_enum_tag_type.zig b/test/cases/compile_errors/extern_union_given_enum_tag_type.zig new file mode 100644 index 0000000000..6a691eb2e2 --- /dev/null +++ b/test/cases/compile_errors/extern_union_given_enum_tag_type.zig @@ -0,0 +1,20 @@ +const Letter = enum { + A, + B, + C, +}; +const Payload = extern union(Letter) { + A: i32, + B: f64, + C: bool, +}; +export fn entry() void { + var a = Payload { .A = 1234 }; + _ = a; +} + +// error +// backend=stage2 +// target=native +// +// :6:30: error: extern union does not support enum tag type diff --git a/test/cases/compile_errors/non-enum_tag_type_passed_to_union.zig b/test/cases/compile_errors/non-enum_tag_type_passed_to_union.zig new file mode 100644 index 0000000000..addc970425 --- /dev/null +++ b/test/cases/compile_errors/non-enum_tag_type_passed_to_union.zig @@ -0,0 +1,13 @@ +const Foo = union(u32) { + A: i32, +}; +export fn entry() void { + const x = @typeInfo(Foo).Union.tag_type.?; + _ = x; +} + +// error +// backend=stage2 +// target=native +// +// :1:19: error: expected enum tag type, found 'u32' diff --git a/test/cases/compile_errors/non-integer_tag_type_to_automatic_union_enum.zig b/test/cases/compile_errors/non-integer_tag_type_to_automatic_union_enum.zig new file mode 100644 index 0000000000..3483ea8a5c --- /dev/null +++ b/test/cases/compile_errors/non-integer_tag_type_to_automatic_union_enum.zig @@ -0,0 +1,13 @@ +const Foo = union(enum(f32)) { + A: i32, +}; +export fn entry() void { + const x = @typeInfo(Foo).Union.tag_type.?; + _ = x; +} + +// error +// backend=stage2 +// target=native +// +// :1:24: error: expected integer tag type, found 'f32' diff --git a/test/cases/compile_errors/non-integer_tag_type_to_enum.zig b/test/cases/compile_errors/non-integer_tag_type_to_enum.zig new file mode 100644 index 0000000000..85ffc5b4b6 --- /dev/null +++ b/test/cases/compile_errors/non-integer_tag_type_to_enum.zig @@ -0,0 +1,13 @@ +const Foo = enum(f32) { + A, +}; +export fn entry() void { + var f: Foo = undefined; + _ = f; +} + +// error +// backend=stage2 +// target=native +// +// :1:18: error: expected integer tag type, found 'f32' diff --git a/test/cases/compile_errors/stage1/obj/extern_union_given_enum_tag_type.zig b/test/cases/compile_errors/stage1/obj/extern_union_given_enum_tag_type.zig deleted file mode 100644 index 86ac42cccf..0000000000 --- a/test/cases/compile_errors/stage1/obj/extern_union_given_enum_tag_type.zig +++ /dev/null @@ -1,20 +0,0 @@ -const Letter = enum { - A, - B, - C, -}; -const Payload = extern union(Letter) { - A: i32, - B: f64, - C: bool, -}; -export fn entry() void { - var a = Payload { .A = 1234 }; - _ = a; -} - -// error -// backend=stage1 -// target=native -// -// tmp.zig:6:30: error: extern union does not support enum tag type diff --git a/test/cases/compile_errors/stage1/obj/non-enum_tag_type_passed_to_union.zig b/test/cases/compile_errors/stage1/obj/non-enum_tag_type_passed_to_union.zig deleted file mode 100644 index e188a3f819..0000000000 --- a/test/cases/compile_errors/stage1/obj/non-enum_tag_type_passed_to_union.zig +++ /dev/null @@ -1,13 +0,0 @@ -const Foo = union(u32) { - A: i32, -}; -export fn entry() void { - const x = @typeInfo(Foo).Union.tag_type.?; - _ = x; -} - -// error -// backend=stage1 -// target=native -// -// tmp.zig:1:19: error: expected enum tag type, found 'u32' diff --git a/test/cases/compile_errors/stage1/obj/non-integer_tag_type_to_automatic_union_enum.zig b/test/cases/compile_errors/stage1/obj/non-integer_tag_type_to_automatic_union_enum.zig deleted file mode 100644 index 41d5e14163..0000000000 --- a/test/cases/compile_errors/stage1/obj/non-integer_tag_type_to_automatic_union_enum.zig +++ /dev/null @@ -1,13 +0,0 @@ -const Foo = union(enum(f32)) { - A: i32, -}; -export fn entry() void { - const x = @typeInfo(Foo).Union.tag_type.?; - _ = x; -} - -// error -// backend=stage1 -// target=native -// -// tmp.zig:1:24: error: expected integer tag type, found 'f32' diff --git a/test/cases/compile_errors/stage2/union_enum_field_missing.zig b/test/cases/compile_errors/stage2/union_enum_field_missing.zig index 25ec477894..81bc83cf18 100644 --- a/test/cases/compile_errors/stage2/union_enum_field_missing.zig +++ b/test/cases/compile_errors/stage2/union_enum_field_missing.zig @@ -16,6 +16,6 @@ export fn entry() usize { // error // target=native // -// :7:1: error: enum field(s) missing in union +// :7:11: error: enum field(s) missing in union // :4:5: note: field 'c' missing, declared here // :1:11: note: enum declared here diff --git a/test/cases/compile_errors/stage2/union_extra_field.zig b/test/cases/compile_errors/stage2/union_extra_field.zig index e3bc0deb33..0488ce183c 100644 --- a/test/cases/compile_errors/stage2/union_extra_field.zig +++ b/test/cases/compile_errors/stage2/union_extra_field.zig @@ -16,5 +16,5 @@ export fn entry() usize { // error // target=native // -// :6:1: error: enum 'tmp.E' has no field named 'd' +// :10:5: error: enum 'tmp.E' has no field named 'd' // :1:11: note: enum declared here diff --git a/test/cases/compile_errors/switch_expression-missing_enumeration_prong.zig b/test/cases/compile_errors/switch_expression-missing_enumeration_prong.zig index 20b373f6b7..1075b837de 100644 --- a/test/cases/compile_errors/switch_expression-missing_enumeration_prong.zig +++ b/test/cases/compile_errors/switch_expression-missing_enumeration_prong.zig @@ -19,5 +19,5 @@ export fn entry() usize { return @sizeOf(@TypeOf(&f)); } // target=native // // :8:5: error: switch must handle all possibilities -// :8:5: note: unhandled enumeration value: 'Four' +// :5:5: note: unhandled enumeration value: 'Four' // :1:16: note: enum 'tmp.Number' declared here diff --git a/test/cases/compile_errors/switch_on_enum_with_1_field_with_no_prongs.zig b/test/cases/compile_errors/switch_on_enum_with_1_field_with_no_prongs.zig index dbf1cd948f..cf6fc141de 100644 --- a/test/cases/compile_errors/switch_on_enum_with_1_field_with_no_prongs.zig +++ b/test/cases/compile_errors/switch_on_enum_with_1_field_with_no_prongs.zig @@ -10,5 +10,5 @@ export fn entry() void { // target=native // // :5:5: error: switch must handle all possibilities -// :5:5: note: unhandled enumeration value: 'M' +// :1:20: note: unhandled enumeration value: 'M' // :1:13: note: enum 'tmp.Foo' declared here diff --git a/test/cases/compile_errors/switching_with_non-exhaustive_enums.zig b/test/cases/compile_errors/switching_with_non-exhaustive_enums.zig index e33d686d86..435d409dd4 100644 --- a/test/cases/compile_errors/switching_with_non-exhaustive_enums.zig +++ b/test/cases/compile_errors/switching_with_non-exhaustive_enums.zig @@ -35,7 +35,7 @@ pub export fn entry3() void { // target=native // // :12:5: error: switch must handle all possibilities -// :12:5: note: unhandled enumeration value: 'b' +// :3:5: note: unhandled enumeration value: 'b' // :1:11: note: enum 'tmp.E' declared here // :19:5: error: switch on non-exhaustive enum must include 'else' or '_' prong // :26:5: error: '_' prong only allowed when switching on non-exhaustive enums diff --git a/test/cases/compile_errors/union_with_specified_enum_omits_field.zig b/test/cases/compile_errors/union_with_specified_enum_omits_field.zig index 3033feb376..5c2b735875 100644 --- a/test/cases/compile_errors/union_with_specified_enum_omits_field.zig +++ b/test/cases/compile_errors/union_with_specified_enum_omits_field.zig @@ -15,6 +15,6 @@ export fn entry() usize { // backend=stage2 // target=native // -// :6:1: error: enum field(s) missing in union +// :6:17: error: enum field(s) missing in union // :4:5: note: field 'C' missing, declared here // :1:16: note: enum declared here -- cgit v1.2.3