Checks if mixed-type arithmetic operations are allowed, particularly handling
unspecified literals that can be coerced to match the other operand’s type.
Handles the following cases:
Checks if an unspecified float literal is in the valid range for a target type.
This is used when coercing a float literal to a specific floating-point type.
Checks if an unspecified integer literal is in the valid range for a target type.
This is used when coercing an integer literal to a specific integer type.
Determines the final type of a variable in a let statement based on both the
declared type (if any) and the initialization expression’s type.
Handles type inference and coercion of unspecified literals.
Converts unspecified literal types to concrete types.
This is used to assign a default concrete type when an unspecified literal
is used in a context where the type wasn’t explicitly given.