From 8ea79933021ca0a5d34560669fdf1ff40ccd2f6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ibrahim=20Numanagic=CC=81?= Date: Mon, 30 Jan 2023 17:26:47 -0800 Subject: [PATCH] Fix #155 --- codon/parser/visitors/typecheck/infer.cpp | 10 ++++++++++ stdlib/internal/core.codon | 4 +++- test/parser/types.codon | 3 +++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/codon/parser/visitors/typecheck/infer.cpp b/codon/parser/visitors/typecheck/infer.cpp index 88877361..b35f4bbf 100644 --- a/codon/parser/visitors/typecheck/infer.cpp +++ b/codon/parser/visitors/typecheck/infer.cpp @@ -838,6 +838,15 @@ TypecheckVisitor::generateSpecialAst(types::FuncType *type) { ll.push_back(format("ret {{}} %{}", as.size())); items[0] = N(N(combine2(ll, "\n"))); ast->suite = N(items); + } else if (startswith(ast->name, "Union.__new__:0")) { + auto unionType = type->funcParent->getUnion(); + seqassert(unionType, "expected union, got {}", type->funcParent); + + StmtPtr suite = N( + N(N("__internal__.new_union:0"), + N(type->ast->args[0].name), + N(unionType->realizedTypeName()))); + ast->suite = suite; } else if (startswith(ast->name, "__internal__.new_union:0")) { // Special case: __internal__.new_union // def __internal__.new_union(value, U[T0, ..., TN]): @@ -876,6 +885,7 @@ TypecheckVisitor::generateSpecialAst(types::FuncType *type) { } suite->stmts.push_back(N(N( N("compile_error"), N("invalid union constructor")))); + LOG("-> {}", suite->toString(2)); ast->suite = suite; } else if (startswith(ast->name, "__internal__.get_union:0")) { // Special case: __internal__.get_union diff --git a/stdlib/internal/core.codon b/stdlib/internal/core.codon index d8525436..94130d47 100644 --- a/stdlib/internal/core.codon +++ b/stdlib/internal/core.codon @@ -108,7 +108,9 @@ class Ref[T]: @__internal__ @tuple class Union[TU]: - pass + # compiler-generated + def __new__(val): + TU # dummy @__internal__ diff --git a/test/parser/types.codon b/test/parser/types.codon index 389b12a0..26d88296 100644 --- a/test/parser/types.codon +++ b/test/parser/types.codon @@ -1477,6 +1477,9 @@ x : Union[A,B,C] = A() print x.foo(), x.foo().__class__.__name__ #: 1 Union[List[bool],int,str] +xx = Union[int, str](0) +print(xx) #: 0 + #%% generator_capture_nonglobal,barebones # Issue #49 def foo(iter):