arrays can cast to slices of the same type
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Wed, 13 Jan 2021 23:26:19 +0000 (17:26 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Wed, 13 Jan 2021 23:26:19 +0000 (17:26 -0600)
src/onyxastnodes.c
src/onyxwasm.c

index 8f8edcdef2e20dacbbe8287db377cbcb7ad3aecf..f0a90ccaf5109d1434680eda27dd00018c376d5e 100644 (file)
@@ -263,9 +263,8 @@ AstTyped* ast_reduce(bh_allocator a, AstTyped* node) {
     switch (node->kind) {
         case Ast_Kind_Binary_Op:  return (AstTyped *) ast_reduce_binop(a, (AstBinaryOp *) node);
         case Ast_Kind_Unary_Op:   return (AstTyped *) ast_reduce_unaryop(a, (AstUnaryOp *) node);
-        case Ast_Kind_NumLit:     return node;
         case Ast_Kind_Enum_Value: return (AstTyped *) ((AstEnumValue *) node)->value;
-        default:                  return NULL;
+        default:                  return node;
     }
 }
 
@@ -510,6 +509,15 @@ b32 cast_is_legal(Type* from_, Type* to_, char** err_msg) {
         return 0;
     }
 
+    if (to->kind == Type_Kind_Slice && from->kind == Type_Kind_Array) {
+        if (!types_are_compatible(to->Slice.ptr_to_data->Pointer.elem, from->Array.elem)) {
+            *err_msg = "Array to slice cast is not valid here because the types are different.";
+            return 0;
+        } else {
+            return 1;
+        }
+    }
+
     if (from->kind == Type_Kind_Slice || to->kind == Type_Kind_Slice) {
         *err_msg = "Cannot cast to or from a slice.";
         return 0;
index 7ae928703c3baf5f2935d4ee1bf48455e1321d19..bd504314835df2bf5207aa4065609d2ae7c6bead 100644 (file)
@@ -2495,6 +2495,12 @@ EMIT_FUNC(cast, AstUnaryOp* cast) {
         return;
     }
 
+    if (to->kind == Type_Kind_Slice && from->kind == Type_Kind_Array) {
+        WID(WI_I32_CONST, from->Array.count);
+        *pcode = code;
+        return;
+    }
+
     i32 fromidx = -1, toidx = -1;
     if (from->Basic.flags & Basic_Flag_Pointer || from->kind == Type_Kind_Array) {
         fromidx = 10;