| ... | @@ -2479,7 +2479,7 @@ pub fn addCases(cases: &tests.CompileErrorContext) { | ... | @@ -2479,7 +2479,7 @@ pub fn addCases(cases: &tests.CompileErrorContext) { |
| 2479 | \\ A: i32 = 20, | 2479 | \\ A: i32 = 20, |
| 2480 | \\}; | 2480 | \\}; |
| 2481 | \\export fn entry() { | 2481 | \\export fn entry() { |
| 2482 | \\ var x: MultipleChoice = undefined; | 2482 | \\ var x: MultipleChoice = undefined; |
| 2483 | \\} | 2483 | \\} |
| 2484 | , | 2484 | , |
| 2485 | ".tmp_source.zig:2:14: error: non-enum union field assignment", | 2485 | ".tmp_source.zig:2:14: error: non-enum union field assignment", |
| ... | @@ -2493,6 +2493,14 @@ pub fn addCases(cases: &tests.CompileErrorContext) { | ... | @@ -2493,6 +2493,14 @@ pub fn addCases(cases: &tests.CompileErrorContext) { |
| 2493 | , | 2493 | , |
| 2494 | ".tmp_source.zig:1:13: error: enums must have 1 or more fields"); | 2494 | ".tmp_source.zig:1:13: error: enums must have 1 or more fields"); |
| 2495 | | 2495 | |
| | 2496 | cases.add("union with 0 fields", |
| | 2497 | \\const Foo = union {}; |
| | 2498 | \\export fn entry() -> usize { |
| | 2499 | \\ return @sizeOf(Foo); |
| | 2500 | \\} |
| | 2501 | , |
| | 2502 | ".tmp_source.zig:1:13: error: unions must have 1 or more fields"); |
| | 2503 | |
| 2496 | cases.add("enum value already taken", | 2504 | cases.add("enum value already taken", |
| 2497 | \\const MultipleChoice = enum(u32) { | 2505 | \\const MultipleChoice = enum(u32) { |
| 2498 | \\ A = 20, | 2506 | \\ A = 20, |
| ... | @@ -2571,4 +2579,109 @@ pub fn addCases(cases: &tests.CompileErrorContext) { | ... | @@ -2571,4 +2579,109 @@ pub fn addCases(cases: &tests.CompileErrorContext) { |
| 2571 | ".tmp_source.zig:6:9: error: enum tag value 60 already taken", | 2579 | ".tmp_source.zig:6:9: error: enum tag value 60 already taken", |
| 2572 | ".tmp_source.zig:4:9: note: other occurrence here"); | 2580 | ".tmp_source.zig:4:9: note: other occurrence here"); |
| 2573 | | 2581 | |
| | 2582 | cases.add("union enum field does not match enum", |
| | 2583 | \\const Letter = enum { |
| | 2584 | \\ A, |
| | 2585 | \\ B, |
| | 2586 | \\ C, |
| | 2587 | \\}; |
| | 2588 | \\const Payload = union(Letter) { |
| | 2589 | \\ A: i32, |
| | 2590 | \\ B: f64, |
| | 2591 | \\ C: bool, |
| | 2592 | \\ D: bool, |
| | 2593 | \\}; |
| | 2594 | \\export fn entry() { |
| | 2595 | \\ var a = Payload {.A = 1234}; |
| | 2596 | \\} |
| | 2597 | , |
| | 2598 | ".tmp_source.zig:10:5: error: enum field not found: 'D'", |
| | 2599 | ".tmp_source.zig:1:16: note: enum declared here"); |
| | 2600 | |
| | 2601 | cases.add("field type supplied in an enum", |
| | 2602 | \\const Letter = enum { |
| | 2603 | \\ A: void, |
| | 2604 | \\ B, |
| | 2605 | \\ C, |
| | 2606 | \\}; |
| | 2607 | \\export fn entry() { |
| | 2608 | \\ var b = Letter.B; |
| | 2609 | \\} |
| | 2610 | , |
| | 2611 | ".tmp_source.zig:2:8: error: structs and unions, not enums, support field types", |
| | 2612 | ".tmp_source.zig:1:16: note: consider 'union(enum)' here"); |
| | 2613 | |
| | 2614 | cases.add("struct field missing type", |
| | 2615 | \\const Letter = struct { |
| | 2616 | \\ A, |
| | 2617 | \\}; |
| | 2618 | \\export fn entry() { |
| | 2619 | \\ var a = Letter { .A = {} }; |
| | 2620 | \\} |
| | 2621 | , |
| | 2622 | ".tmp_source.zig:2:5: error: struct field missing type"); |
| | 2623 | |
| | 2624 | cases.add("extern union field missing type", |
| | 2625 | \\const Letter = extern union { |
| | 2626 | \\ A, |
| | 2627 | \\}; |
| | 2628 | \\export fn entry() { |
| | 2629 | \\ var a = Letter { .A = {} }; |
| | 2630 | \\} |
| | 2631 | , |
| | 2632 | ".tmp_source.zig:2:5: error: union field missing type"); |
| | 2633 | |
| | 2634 | cases.add("extern union given enum tag type", |
| | 2635 | \\const Letter = enum { |
| | 2636 | \\ A, |
| | 2637 | \\ B, |
| | 2638 | \\ C, |
| | 2639 | \\}; |
| | 2640 | \\const Payload = extern union(Letter) { |
| | 2641 | \\ A: i32, |
| | 2642 | \\ B: f64, |
| | 2643 | \\ C: bool, |
| | 2644 | \\}; |
| | 2645 | \\export fn entry() { |
| | 2646 | \\ var a = Payload { .A = { 1234 } }; |
| | 2647 | \\} |
| | 2648 | , |
| | 2649 | ".tmp_source.zig:6:29: error: extern union does not support enum tag type"); |
| | 2650 | |
| | 2651 | cases.add("packed union given enum tag type", |
| | 2652 | \\const Letter = enum { |
| | 2653 | \\ A, |
| | 2654 | \\ B, |
| | 2655 | \\ C, |
| | 2656 | \\}; |
| | 2657 | \\const Payload = packed union(Letter) { |
| | 2658 | \\ A: i32, |
| | 2659 | \\ B: f64, |
| | 2660 | \\ C: bool, |
| | 2661 | \\}; |
| | 2662 | \\export fn entry() { |
| | 2663 | \\ var a = Payload { .A = { 1234 } }; |
| | 2664 | \\} |
| | 2665 | , |
| | 2666 | ".tmp_source.zig:6:29: error: packed union does not support enum tag type"); |
| | 2667 | |
| | 2668 | cases.add("switch on union with no attached enum", |
| | 2669 | \\const Payload = union { |
| | 2670 | \\ A: i32, |
| | 2671 | \\ B: f64, |
| | 2672 | \\ C: bool, |
| | 2673 | \\}; |
| | 2674 | \\export fn entry() { |
| | 2675 | \\ const a = Payload { .A = { 1234 } }; |
| | 2676 | \\ foo(a); |
| | 2677 | \\} |
| | 2678 | \\fn foo(a: &const Payload) { |
| | 2679 | \\ switch (*a) { |
| | 2680 | \\ Payload.A => {}, |
| | 2681 | \\ else => unreachable, |
| | 2682 | \\ } |
| | 2683 | \\} |
| | 2684 | , |
| | 2685 | ".tmp_source.zig:11:13: error: switch on union which has no attached enum", |
| | 2686 | ".tmp_source.zig:1:17: note: consider 'union(enum)' here"); |
| 2574 | } | 2687 | } |