@@ -10331,15 +10331,31 @@ fn genMethodCall(self: *Codegen, fa: Ast.FieldAccessExpr, args: []const *const A
1033110331 var vec_obj_type = obj_type;
1033210332 var vec_obj_val = obj_val;
1033310333 var vec_recv_ptr_override: ?c.LLVMValueRef = null;
10334- if (!self.isVecType(vec_obj_type) and fa.expr.kind == .ident) {
10334+ if (fa.expr.kind == .ident) {
1033510335 const recv_sym = fa.expr.kind.ident;
1033610336 if (self.vec_local_types.get(recv_sym)) |tracked_vec_ty| {
10337+ if (tracked_vec_ty != vec_obj_type) {
10338+ if (self.locals.get(recv_sym)) |recv_local| {
10339+ if (c.LLVMGetTypeKind(recv_local.ty) == c.LLVMPointerTypeKind) {
10340+ const vec_ptr = c.LLVMBuildLoad2(self.builder, recv_local.ty, recv_local.alloca, "vec.ref.ptr");
10341+ vec_recv_ptr_override = vec_ptr;
10342+ vec_obj_type = tracked_vec_ty;
10343+ vec_obj_val = c.LLVMBuildLoad2(self.builder, tracked_vec_ty, vec_ptr, "vec.ref.val");
10344+ } else {
10345+ vec_obj_type = tracked_vec_ty;
10346+ }
10347+ }
10348+ }
10349+ } else if (!self.isVecType(vec_obj_type)) {
10350+ // Fallback: check locals for pointer-to-vec pattern
1033710351 if (self.locals.get(recv_sym)) |recv_local| {
1033810352 if (c.LLVMGetTypeKind(recv_local.ty) == c.LLVMPointerTypeKind) {
10339- const vec_ptr = c.LLVMBuildLoad2(self.builder, recv_local.ty, recv_local.alloca, "vec.ref.ptr");
10340- vec_recv_ptr_override = vec_ptr;
10341- vec_obj_type = tracked_vec_ty;
10342- vec_obj_val = c.LLVMBuildLoad2(self.builder, tracked_vec_ty, vec_ptr, "vec.ref.val");
10353+ if (self.isVecType(recv_local.ty)) {
10354+ const vec_ptr = c.LLVMBuildLoad2(self.builder, recv_local.ty, recv_local.alloca, "vec.ref.ptr");
10355+ vec_recv_ptr_override = vec_ptr;
10356+ vec_obj_type = recv_local.ty;
10357+ vec_obj_val = c.LLVMBuildLoad2(self.builder, recv_local.ty, vec_ptr, "vec.ref.val");
10358+ }
1034310359 }
1034410360 }
1034510361 }
@@ -10358,8 +10374,23 @@ fn genMethodCall(self: *Codegen, fa: Ast.FieldAccessExpr, args: []const *const A
1035810374 } else if (std.mem.eql(u8, method_name, "push")) {
1035910375 if (args.len < 1) return error.UnsupportedExpr;
1036010376 const val = try self.genExpr(args[0]);
10377+ const actual_elem_ty = c.LLVMTypeOf(val);
10378+ // If the Vec was created without a type annotation (defaulting to
10379+ // i32), upgrade the Vec type to match the first push.
10380+ var push_vec_type = vec_obj_type;
10381+ const cached_elem = self.getVecElemType(vec_obj_type);
10382+ if (cached_elem != null and cached_elem.? != actual_elem_ty) {
10383+ const vec_info = self.getOrCreateVecType(actual_elem_ty) catch null;
10384+ if (vec_info) |vi| {
10385+ push_vec_type = vi.llvm_type;
10386+ if (fa.expr.kind == .ident) {
10387+ const recv_sym = fa.expr.kind.ident;
10388+ self.vec_local_types.put(self.allocator, recv_sym, vi.llvm_type) catch {};
10389+ }
10390+ }
10391+ }
1036110392 const recv_ptr = vec_recv_ptr_override orelse try self.getMutableReceiverPtr(fa.expr);
10362- return self.genVecPush(recv_ptr, vec_obj_type , val);
10393+ return self.genVecPush(recv_ptr, push_vec_type , val);
1036310394 } else if (std.mem.eql(u8, method_name, "set_i32")) {
1036410395 if (args.len < 2) return error.UnsupportedExpr;
1036510396 const idx = try self.genExpr(args[0]);
0 commit comments