From: Brendan Hansen Date: Sat, 26 Dec 2020 05:00:12 +0000 (-0600) Subject: small #solidify bugfix X-Git-Url: https://git.brendanfh.com/?a=commitdiff_plain;h=06393537597f2eb7582c5504653e5568e6a097ef;p=onyx.git small #solidify bugfix --- diff --git a/docs/todo b/docs/todo index 7a6faf3b..6da2e100 100644 --- a/docs/todo +++ b/docs/todo @@ -112,7 +112,7 @@ Language Cohesion: [ ] Add macros. - [ ] #solidify polymoprhic procedures. + [X] #solidify polymoprhic procedures. API Expansion: There are many different places where the standard API for WASI and JS diff --git a/onyx b/onyx index 4777151a..90cf0736 100755 Binary files a/onyx and b/onyx differ diff --git a/progs/poly_solidify.onyx b/progs/poly_solidify.onyx index f71cb85f..3437f761 100644 --- a/progs/poly_solidify.onyx +++ b/progs/poly_solidify.onyx @@ -6,7 +6,8 @@ max_f32 :: #solidify math.max { T = f32 }; compose :: proc (a: $A, f: proc (A) -> $B, g: proc (B) -> $C) -> C do return g(f(a)); -specific_compose :: #solidify compose { A = f32, B = f32, C = u32 }; +specific_compose_0 :: #solidify compose { B = u32 }; +specific_compose_1 :: #solidify specific_compose_0 { A = f32 }; main :: proc (args: [] cstr) { printf("max(1, 2) = %i\n", math.max(1, 2)); @@ -14,5 +15,8 @@ main :: proc (args: [] cstr) { // printf("max_f32(1, 2) = %i\n", max_f32(cast(u32) 1, cast(u32) 2)); - + println(specific_compose_1( + 2, + proc (a: f32) -> i32 { return ~~(a * 2); }, + proc (b: i32) -> i32 { return ~~(b + 6); })); } \ No newline at end of file diff --git a/src/onyxsymres.c b/src/onyxsymres.c index e145dab6..278a5d25 100644 --- a/src/onyxsymres.c +++ b/src/onyxsymres.c @@ -604,6 +604,10 @@ static void symres_directive_solidify(AstDirectiveSolidify** psolid) { *psolid = (AstDirectiveSolidify *) solid->resolved_proc; symres_expression((AstTyped **) &solid->poly_proc); + if (solid->poly_proc && solid->poly_proc->kind == Ast_Kind_Directive_Solidify) { + solid->poly_proc = (AstPolyProc *) ((AstDirectiveSolidify *) solid->poly_proc)->resolved_proc; + } + if (!solid->poly_proc || solid->poly_proc->kind != Ast_Kind_Polymorphic_Proc) { onyx_report_error(solid->token->pos, "Expected polymorphic procedure in #solidify directive."); return;