small #solidify bugfix
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Sat, 26 Dec 2020 05:00:12 +0000 (23:00 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Sat, 26 Dec 2020 05:00:12 +0000 (23:00 -0600)
docs/todo
onyx
progs/poly_solidify.onyx
src/onyxsymres.c

index 7a6faf3be931e42e037857a8f2d98c96e8de44fa..6da2e1001e1cd36cfc9e87a32339ce1542173405 100644 (file)
--- 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 4777151a3e66e23a4bff5fdb082f623d16365f80..90cf0736fe79d3ebf3fdbdb33dfce98c88b2125a 100755 (executable)
Binary files a/onyx and b/onyx differ
index f71cb85fa5031cd612aab867735bab0151509667..3437f76193e95b2b7fb58f3462e48285509a7ad0 100644 (file)
@@ -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
index e145dab67f275ab44626ba69bfab8c91e28e2e64..278a5d2563ad08a179fbbc3a2b8b743a3927180f 100644 (file)
@@ -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;