diff options
| author | Bruce Hill <bruce@bruce-hill.com> | 2024-09-11 23:13:41 -0400 |
|---|---|---|
| committer | Bruce Hill <bruce@bruce-hill.com> | 2024-09-11 23:13:41 -0400 |
| commit | cfef667a899339a0fd5b79214d581db6ede10748 (patch) | |
| tree | 6bcb59e695888c8b691cf39a6789202df7691112 /compile.c | |
| parent | 0f7cf28af1b204d0f979dd7b97133329f16ffe55 (diff) | |
Fix optional integer promotion
Diffstat (limited to 'compile.c')
| -rw-r--r-- | compile.c | 13 |
1 files changed, 7 insertions, 6 deletions
@@ -44,6 +44,7 @@ CORD promote_to_optional(type_t *t, CORD code) return code; } } + static bool promote(env_t *env, CORD *code, type_t *actual, type_t *needed) { if (type_eq(actual, needed)) @@ -52,6 +53,12 @@ static bool promote(env_t *env, CORD *code, type_t *actual, type_t *needed) if (!can_promote(actual, needed)) return false; + // Optional promotion: + if (needed->tag == OptionalType && type_eq(actual, Match(needed, OptionalType)->type)) { + *code = promote_to_optional(actual, *code); + return true; + } + if (actual->tag == IntType && needed->tag == BigIntType) { *code = CORD_all("I(", *code, ")"); return true; @@ -81,12 +88,6 @@ static bool promote(env_t *env, CORD *code, type_t *actual, type_t *needed) return promote(env, code, Match(actual, PointerType)->pointed, needed); } - // Optional promotion: - if (needed->tag == OptionalType && type_eq(actual, Match(needed, OptionalType)->type)) { - *code = promote_to_optional(actual, *code); - return true; - } - // Stack ref promotion: if (actual->tag == PointerType && needed->tag == PointerType) return true; |
