Fix interpreter's incorrect downcast when an upcast is needed #16485
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Fixes #16484
Gemini AI analysis of root cause and fix:
Root Cause
The interpreter's compile_call_arg method in compiler.cr was unconditionally calling downcast when casting an argument type to the target definition's argument type. This is incorrect because:
Downcast is for narrowing types (e.g., Union → String)
Upcast is for widening types (e.g., String → Union)
When calling arg_to_log(a) where a is a String but the method expects Int32 | String, the interpreter incorrectly tried to downcast String to Int32 | String, which failed because no such downcast handler exists (nor should it).
Fix
crystal/src/compiler/crystal/semantic/bindings.cr
Lines 489 to 493 in 07af861