fix(0098): enum literal resolves against the unwrapped optional child; non-enum targets are diagnosed
lowerEnumLiteral resolved the variant against the raw destination type,
so any non-enum destination fell into resolveVariantValue's silent
return-0 tail with the enum_init stamped as the wrong type:
- ?E destinations produced variant 0 mis-typed as the optional
(observed as variant 0 OR null, layout-dependent);
- builtin destinations (i64) silently became 0;
- unknown variants of real enums silently became variant 0;
- a destination-less literal panicked LLVM emission (unresolved
type reached codegen).
Now: optional destinations unwrap to the child enum (the coercion
layer's .optional_wrap handles E -> ?E), and the remaining shapes are
diagnosed — unknown variant (with the variant list, via the new
emitBadEnumVariant twin of emitBadVariant), non-enum destination, and
no destination (cascade-guarded: silent when the destination's type
already failed to resolve and was reported).
Regression tests: examples/0183 (return/assign/reassign into ?Enum,
non-zero variants, null path) + examples/1169/1170 (each diagnostic);
all three FAIL on pre-fix master. zig build test 426/426;
tests/run_examples.sh 598/598.
This commit is contained in:
@@ -0,0 +1 @@
|
||||
0
|
||||
@@ -0,0 +1 @@
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
ok
|
||||
@@ -0,0 +1 @@
|
||||
1
|
||||
@@ -0,0 +1,11 @@
|
||||
error: 'nonexistent' is not a variant of 'Platform' (variants are: ios, android_apk)
|
||||
--> examples/1169-diagnostics-enum-literal-bad-target.sx:10:20
|
||||
|
|
||||
10 | a : Platform = .nonexistent; // unknown variant: lists the real ones
|
||||
| ^^^^^^^^^^^^
|
||||
|
||||
error: enum literal '.foo' cannot type itself from non-enum destination 'i64'
|
||||
--> examples/1169-diagnostics-enum-literal-bad-target.sx:11:15
|
||||
|
|
||||
11 | b : i64 = .foo; // non-enum destination
|
||||
| ^^^^
|
||||
@@ -0,0 +1 @@
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
1
|
||||
@@ -0,0 +1,5 @@
|
||||
error: enum literal '.ios' has no destination type to resolve against
|
||||
--> examples/1170-diagnostics-enum-literal-no-target.sx:8:10
|
||||
|
|
||||
8 | c := .ios;
|
||||
| ^^^^
|
||||
@@ -0,0 +1 @@
|
||||
|
||||
Reference in New Issue
Block a user