feat: add algebraic enums (tagged unions) support

- Generate tagged unions in C backend for enums with data
- Add HirEnumVariant type with fields and namedFields
- Support _Tag and _Data field access in sema
- Support enum variant constants (Result_Ok, Result_Err)
- Support _Data union field access (Ok_0, Err_0, etc.)
- Add algebraic_enums.bux example

Example:
  enum Result {
      Ok(int),
      Err(String)
  }

  let r: Result = Result { tag: Result_Ok };
  r.data.Ok_0 = 42;
This commit is contained in:
2026-05-30 23:50:33 +03:00
parent b59e852330
commit cf074bec89
5 changed files with 181 additions and 22 deletions
+29
View File
@@ -0,0 +1,29 @@
// Algebraic Enums - Enums with data (tagged unions)
extern func Std_Io_PrintLine(s: String);
extern func Std_Io_PrintInt(n: int);
enum Result {
Ok(int),
Err(String)
}
func Main() -> int {
let r1: Result = Result { tag: Result_Ok };
r1.data.Ok_0 = 42;
let r2: Result = Result { tag: Result_Err };
r2.data.Err_0 = "error message";
if r1.tag == Result_Ok {
Std_Io_PrintLine("r1 is Ok:");
Std_Io_PrintInt(r1.data.Ok_0);
Std_Io_PrintLine("");
}
if r2.tag == Result_Err {
Std_Io_PrintLine("r2 is Err:");
Std_Io_PrintLine(r2.data.Err_0);
}
return 0;
}