diff options
author | Bad Diode <bd@badd10de.dev> | 2024-06-24 16:00:12 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2024-06-24 16:00:12 +0200 |
commit | 6d8b7b0bf66d22d6de13474b18617204adfe32e9 (patch) | |
tree | 075dbe936dd23ddd68d2202691abbb02a0861319 /src | |
parent | ec7faebe81c6d4aad7f2927962fae5c9f414eb66 (diff) | |
download | bdl-6d8b7b0bf66d22d6de13474b18617204adfe32e9.tar.gz bdl-6d8b7b0bf66d22d6de13474b18617204adfe32e9.zip |
Fix typechecking issues for bitops tests
Diffstat (limited to 'src')
-rw-r--r-- | src/main.c | 20 |
1 files changed, 13 insertions, 7 deletions
@@ -415,7 +415,9 @@ Type | |||
415 | type_inference(Analyzer *a, Node *node, TypeScope *scope) { | 415 | type_inference(Analyzer *a, Node *node, TypeScope *scope) { |
416 | assert(a); | 416 | assert(a); |
417 | assert(scope); | 417 | assert(scope); |
418 | assert(node); | 418 | if (!node) { |
419 | return cstr(""); | ||
420 | } | ||
419 | // NOTE: For now we are not going to do implicit numeric conversions. | 421 | // NOTE: For now we are not going to do implicit numeric conversions. |
420 | switch (node->kind) { | 422 | switch (node->kind) { |
421 | case NODE_LET: { | 423 | case NODE_LET: { |
@@ -600,7 +602,16 @@ type_inference(Analyzer *a, Node *node, TypeScope *scope) { | |||
600 | node->type = cstr("bool"); | 602 | node->type = cstr("bool"); |
601 | return node->type; | 603 | return node->type; |
602 | } break; | 604 | } break; |
603 | case NODE_BITNOT: | 605 | case NODE_BITNOT: { |
606 | Type left = type_inference(a, node->left, scope); | ||
607 | if (!strset_lookup(&a->integer_types, left)) { | ||
608 | emit_semantic_error( | ||
609 | a, node, cstr("non integer type on bit twiddling expr")); | ||
610 | return cstr(""); | ||
611 | } | ||
612 | node->type = left; | ||
613 | return node->type; | ||
614 | } break; | ||
604 | case NODE_BITAND: | 615 | case NODE_BITAND: |
605 | case NODE_BITOR: | 616 | case NODE_BITOR: |
606 | case NODE_BITLSHIFT: | 617 | case NODE_BITLSHIFT: |
@@ -613,11 +624,6 @@ type_inference(Analyzer *a, Node *node, TypeScope *scope) { | |||
613 | a, node, cstr("non integer type on bit twiddling expr")); | 624 | a, node, cstr("non integer type on bit twiddling expr")); |
614 | return cstr(""); | 625 | return cstr(""); |
615 | } | 626 | } |
616 | if (!str_eq(left, right)) { | ||
617 | emit_semantic_error( | ||
618 | a, node, cstr("mismatched types on binary expression")); | ||
619 | return cstr(""); | ||
620 | } | ||
621 | node->type = left; | 627 | node->type = left; |
622 | return node->type; | 628 | return node->type; |
623 | } break; | 629 | } break; |