diff --git a/examples/0621-comptime-metatype-make-enum-sliced.sx b/examples/0621-comptime-metatype-make-enum-sliced.sx new file mode 100644 index 00000000..bd8acc4d --- /dev/null +++ b/examples/0621-comptime-metatype-make-enum-sliced.sx @@ -0,0 +1,30 @@ +// Comptime slice over a non-string AGGREGATE: assemble a pool of candidate +// variants in a local array, then mint an enum from a SUBSLICE of it. This +// exercises the interp's `subslice` op on an array VALUE (`dirs[0..2]`) — which +// used to bail ("slice over non-string aggregates not yet supported") — now +// yielding a real `[]EnumVariant` the `define` decoder reads. +// +// `Axis` is built from only the first two of four directions, so `.south` / +// `.west` are NOT variants of it. +#import "modules/std.sx"; +#import "modules/std/meta.sx"; + +build_axis :: () -> Type { + dirs := EnumVariant.[ + EnumVariant.{ name = "north", payload = void }, + EnumVariant.{ name = "east", payload = i64 }, // carries a bearing + EnumVariant.{ name = "south", payload = void }, + EnumVariant.{ name = "west", payload = void }, + ]; + return make_enum("Axis", dirs[0..2]); // first two only — a comptime subslice +} + +Axis :: build_axis(); + +main :: () -> i32 { + a : Axis = .north; + b : Axis = .east(90); + if a == { case .north: { print("north\n"); } case .east: (d) { print("east {}\n", d); } } + if b == { case .north: { print("north\n"); } case .east: (d) { print("east {}\n", d); } } + return 0; +} diff --git a/examples/expected/0621-comptime-metatype-make-enum-sliced.exit b/examples/expected/0621-comptime-metatype-make-enum-sliced.exit new file mode 100644 index 00000000..573541ac --- /dev/null +++ b/examples/expected/0621-comptime-metatype-make-enum-sliced.exit @@ -0,0 +1 @@ +0 diff --git a/examples/expected/0621-comptime-metatype-make-enum-sliced.stderr b/examples/expected/0621-comptime-metatype-make-enum-sliced.stderr new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/examples/expected/0621-comptime-metatype-make-enum-sliced.stderr @@ -0,0 +1 @@ + diff --git a/examples/expected/0621-comptime-metatype-make-enum-sliced.stdout b/examples/expected/0621-comptime-metatype-make-enum-sliced.stdout new file mode 100644 index 00000000..e83689fe --- /dev/null +++ b/examples/expected/0621-comptime-metatype-make-enum-sliced.stdout @@ -0,0 +1,2 @@ +north +east 90