@@ -4316,6 +4316,110 @@ fn checkDeferredStaticDispatchConstraints(self: *Self, env: *Env) std.mem.Alloca
43164316 };
43174317
43184318 const result = try self .unify (local_def_var , constraint .fn_var , env );
4319+
4320+ if (false and std .mem .indexOf (u8 , qualified_name_bytes , "I128.plus" ) != null ) {
4321+ const resolved_local = self .types .resolveVar (local_def_var );
4322+ std .debug .print ("\n === DEBUG: I128.plus Method Signature ===\n " , .{});
4323+ std .debug .print (" Qualified name: {s}\n " , .{qualified_name_bytes });
4324+ std .debug .print (" local_def_var: {d}\n " , .{@intFromEnum (local_def_var )});
4325+ std .debug .print (" Resolved var: {d}\n " , .{@intFromEnum (resolved_local .var_ )});
4326+ std .debug .print (" Content: {s}\n " , .{@tagName (resolved_local .desc .content )});
4327+ if (resolved_local .desc .content == .structure ) {
4328+ const struct_content = resolved_local .desc .content .structure ;
4329+ if (struct_content == .fn_pure or struct_content == .fn_effectful or struct_content == .fn_unbound ) {
4330+ const func = switch (struct_content ) {
4331+ .fn_pure = > | f | f ,
4332+ .fn_effectful = > | f | f ,
4333+ .fn_unbound = > | f | f ,
4334+ else = > unreachable ,
4335+ };
4336+ const resolved_ret = self .types .resolveVar (func .ret );
4337+ std .debug .print (" Function type: {s}\n " , .{@tagName (struct_content )});
4338+ std .debug .print (" Return type var: {d}\n " , .{@intFromEnum (func .ret )});
4339+ std .debug .print (" Resolved return var: {d}\n " , .{@intFromEnum (resolved_ret .var_ )});
4340+ std .debug .print (" Return content: {s}\n " , .{@tagName (resolved_ret .desc .content )});
4341+ if (resolved_ret .desc .content == .structure ) {
4342+ std .debug .print (" Return structure: {s}\n " , .{@tagName (resolved_ret .desc .content .structure )});
4343+ if (resolved_ret .desc .content .structure == .num ) {
4344+ const num_val = resolved_ret .desc .content .structure .num ;
4345+ std .debug .print (" Num variant: {s}\n " , .{@tagName (num_val )});
4346+ if (num_val == .num_compact ) {
4347+ const compact = num_val .num_compact ;
4348+ std .debug .print (" Compact type: {s}\n " , .{@tagName (compact )});
4349+ switch (compact ) {
4350+ .int = > | int_prec | std .debug .print (" Int precision: {s}\n " , .{@tagName (int_prec )}),
4351+ .frac = > | frac_prec | std .debug .print (" Frac precision: {s}\n " , .{@tagName (frac_prec )}),
4352+ }
4353+ }
4354+ }
4355+ }
4356+ }
4357+ }
4358+ std .debug .print (" constraint.fn_var: {d}\n " , .{@intFromEnum (constraint .fn_var )});
4359+
4360+ // Also check what constraint.fn_var looks like
4361+ const resolved_constraint_fn = self .types .resolveVar (constraint .fn_var );
4362+ std .debug .print (" Constraint fn type var: {d}\n " , .{@intFromEnum (resolved_constraint_fn .var_ )});
4363+ std .debug .print (" Constraint fn content: {s}\n " , .{@tagName (resolved_constraint_fn .desc .content )});
4364+ if (resolved_constraint_fn .desc .content == .structure ) {
4365+ std .debug .print (" Constraint structure: {s}\n " , .{@tagName (resolved_constraint_fn .desc .content .structure )});
4366+ const struct_content = resolved_constraint_fn .desc .content .structure ;
4367+ if (struct_content == .fn_pure or struct_content == .fn_effectful or struct_content == .fn_unbound ) {
4368+ const constraint_func = switch (struct_content ) {
4369+ .fn_pure = > | f | f ,
4370+ .fn_effectful = > | f | f ,
4371+ .fn_unbound = > | f | f ,
4372+ else = > unreachable ,
4373+ };
4374+ const resolved_constraint_ret = self .types .resolveVar (constraint_func .ret );
4375+ std .debug .print (" Constraint ret var: {d}\n " , .{@intFromEnum (constraint_func .ret )});
4376+ std .debug .print (" Constraint ret resolved var: {d}\n " , .{@intFromEnum (resolved_constraint_ret .var_ )});
4377+ std .debug .print (" Constraint ret content: {s}\n " , .{@tagName (resolved_constraint_ret .desc .content )});
4378+ if (resolved_constraint_ret .desc .content == .structure and resolved_constraint_ret .desc .content .structure == .num ) {
4379+ std .debug .print (" Constraint ret num: {s}\n " , .{@tagName (resolved_constraint_ret .desc .content .structure .num )});
4380+ }
4381+ }
4382+ }
4383+
4384+ std .debug .print (" About to unify local_def_var={d} with constraint.fn_var={d}\n " , .{@intFromEnum (local_def_var ), @intFromEnum (constraint .fn_var )});
4385+ std .debug .print ("==========================================\n " , .{});
4386+ }
4387+
4388+ // DEBUG: After unification, check what happened to the return types
4389+ if (false and std .mem .indexOf (u8 , qualified_name_bytes , "I128.plus" ) != null ) {
4390+ const resolved_local_after = self .types .resolveVar (local_def_var );
4391+ const resolved_constraint_after = self .types .resolveVar (constraint .fn_var );
4392+ std .debug .print ("\n === AFTER UNIFICATION ===\n " , .{});
4393+ std .debug .print (" Unification result: {s}\n " , .{@tagName (result )});
4394+ std .debug .print (" local_def_var: {d} -> {d}\n " , .{@intFromEnum (local_def_var ), @intFromEnum (resolved_local_after .var_ )});
4395+ std .debug .print (" constraint.fn_var: {d} -> {d}\n " , .{@intFromEnum (constraint .fn_var ), @intFromEnum (resolved_constraint_after .var_ )});
4396+
4397+ // Check if they unified to the same var
4398+ if (resolved_local_after .var_ == resolved_constraint_after .var_ ) {
4399+ std .debug .print (" -> Both now point to same var: {d}\n " , .{@intFromEnum (resolved_local_after .var_ )});
4400+ }
4401+
4402+ // Check the resolved function structure
4403+ if (resolved_constraint_after .desc .content == .structure ) {
4404+ const struct_content = resolved_constraint_after .desc .content .structure ;
4405+ std .debug .print (" Constraint structure after: {s}\n " , .{@tagName (struct_content )});
4406+ if (struct_content == .fn_pure or struct_content == .fn_effectful or struct_content == .fn_unbound ) {
4407+ const func_after = switch (struct_content ) {
4408+ .fn_pure = > | f | f ,
4409+ .fn_effectful = > | f | f ,
4410+ .fn_unbound = > | f | f ,
4411+ else = > unreachable ,
4412+ };
4413+ const ret_after = self .types .resolveVar (func_after .ret );
4414+ std .debug .print (" Return var: {d} -> {d}\n " , .{@intFromEnum (func_after .ret ), @intFromEnum (ret_after .var_ )});
4415+ std .debug .print (" Return content: {s}\n " , .{@tagName (ret_after .desc .content )});
4416+ if (ret_after .desc .content == .structure and ret_after .desc .content .structure == .num ) {
4417+ std .debug .print (" Return num: {s}\n " , .{@tagName (ret_after .desc .content .structure .num )});
4418+ }
4419+ }
4420+ }
4421+ std .debug .print ("=========================\n " , .{});
4422+ }
43194423 if (result .isProblem ()) {
43204424 try self .unifyWith (deferred_constraint .var_ , .err , env );
43214425 try self .unifyWith (resolved_func .ret , .err , env );
0 commit comments