Skip to content

Commit 0fd8938

Browse files
gh-134: Fix APPEND.
1 parent 041a403 commit 0fd8938

1 file changed

Lines changed: 23 additions & 1 deletion

File tree

src/builtins.c

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3881,7 +3881,29 @@ static Value builtin_append(Interpreter* interp, Value* args, int argc, Expr** a
38813881
size_t old_len = t->shape[0];
38823882
size_t new_len = old_len + 1;
38833883
size_t shape[1] = { new_len };
3884-
Value out = value_tns_new(t->elem_type, 1, shape);
3884+
/* Determine resulting element DeclType. If the target tensor's
3885+
static element type differs from the appended element's DeclType,
3886+
the result must be TYPE_UNKNOWN (heterogeneous). If the target
3887+
is unknown but empty, adopt the appended element's DeclType. */
3888+
DeclType appended_decl;
3889+
switch (args[0].type) {
3890+
case VAL_BOOL: appended_decl = TYPE_BOOL; break;
3891+
case VAL_INT: appended_decl = TYPE_INT; break;
3892+
case VAL_FLT: appended_decl = TYPE_FLT; break;
3893+
case VAL_STR: appended_decl = TYPE_STR; break;
3894+
case VAL_TNS: appended_decl = TYPE_TNS; break;
3895+
case VAL_FUNC: appended_decl = TYPE_FUNC; break;
3896+
default: appended_decl = TYPE_UNKNOWN; break;
3897+
}
3898+
3899+
DeclType out_elem_type = t->elem_type;
3900+
if (out_elem_type == TYPE_UNKNOWN) {
3901+
if (old_len == 0) out_elem_type = appended_decl;
3902+
} else {
3903+
if (appended_decl != out_elem_type) out_elem_type = TYPE_UNKNOWN;
3904+
}
3905+
3906+
Value out = value_tns_new(out_elem_type, 1, shape);
38853907
Tensor* ot = out.as.tns;
38863908

38873909
// copy existing elements

0 commit comments

Comments
 (0)