@@ -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