From e291034e462862e9b19a59031b2ddb32a468f53d Mon Sep 17 00:00:00 2001 From: agra Date: Wed, 17 Jun 2026 05:26:35 +0300 Subject: [PATCH] test(metatype): lock duplicate-variant-name rejection (examples/1180) Diagnostics example for the define duplicate-name guard (b2db2c5): two 'value' variants -> build-gating error naming the duplicate, exit 1. --- ...80-diagnostics-metatype-duplicate-variant.sx | 17 +++++++++++++++++ ...-diagnostics-metatype-duplicate-variant.exit | 1 + ...iagnostics-metatype-duplicate-variant.stderr | 13 +++++++++++++ ...iagnostics-metatype-duplicate-variant.stdout | 1 + 4 files changed, 32 insertions(+) create mode 100644 examples/1180-diagnostics-metatype-duplicate-variant.sx create mode 100644 examples/expected/1180-diagnostics-metatype-duplicate-variant.exit create mode 100644 examples/expected/1180-diagnostics-metatype-duplicate-variant.stderr create mode 100644 examples/expected/1180-diagnostics-metatype-duplicate-variant.stdout diff --git a/examples/1180-diagnostics-metatype-duplicate-variant.sx b/examples/1180-diagnostics-metatype-duplicate-variant.sx new file mode 100644 index 00000000..bce38e8b --- /dev/null +++ b/examples/1180-diagnostics-metatype-duplicate-variant.sx @@ -0,0 +1,17 @@ +// A comptime-constructed enum (declare/define) with two same-named variants is +// rejected loudly. Two `value` variants would make construction (`.value`) and +// matching ambiguous — `define` bails naming the duplicate, instead of silently +// minting a malformed enum that picks one arbitrarily. +#import "modules/std.sx"; +#import "modules/std/meta.sx"; + +Bad :: define(declare("Bad"), .enum(.{ variants = .[ + EnumVariant.{ name = "value", payload = i64 }, + EnumVariant.{ name = "closed", payload = void }, + EnumVariant.{ name = "value", payload = f64 }, // duplicate name +] })); + +main :: () -> i32 { + b : Bad = ---; + return 0; +} diff --git a/examples/expected/1180-diagnostics-metatype-duplicate-variant.exit b/examples/expected/1180-diagnostics-metatype-duplicate-variant.exit new file mode 100644 index 00000000..d00491fd --- /dev/null +++ b/examples/expected/1180-diagnostics-metatype-duplicate-variant.exit @@ -0,0 +1 @@ +1 diff --git a/examples/expected/1180-diagnostics-metatype-duplicate-variant.stderr b/examples/expected/1180-diagnostics-metatype-duplicate-variant.stderr new file mode 100644 index 00000000..2b8031be --- /dev/null +++ b/examples/expected/1180-diagnostics-metatype-duplicate-variant.stderr @@ -0,0 +1,13 @@ +error: comptime type construction failed: comptime define(): duplicate variant name 'value' + --> examples/1180-diagnostics-metatype-duplicate-variant.sx:8:8 + | + 8 | Bad :: define(declare("Bad"), .enum(.{ variants = .[ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + 9 | EnumVariant.{ name = "value", payload = i64 }, + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +10 | EnumVariant.{ name = "closed", payload = void }, + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +11 | EnumVariant.{ name = "value", payload = f64 }, // duplicate name + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +12 | ] })); + | ^^^^^ diff --git a/examples/expected/1180-diagnostics-metatype-duplicate-variant.stdout b/examples/expected/1180-diagnostics-metatype-duplicate-variant.stdout new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/examples/expected/1180-diagnostics-metatype-duplicate-variant.stdout @@ -0,0 +1 @@ +