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 | |
parent | ec7faebe81c6d4aad7f2927962fae5c9f414eb66 (diff) | |
download | bdl-6d8b7b0bf66d22d6de13474b18617204adfe32e9.tar.gz bdl-6d8b7b0bf66d22d6de13474b18617204adfe32e9.zip |
Fix typechecking issues for bitops tests
-rw-r--r-- | src/main.c | 20 | ||||
-rw-r--r-- | tests/variables.bad | 2 |
2 files changed, 14 insertions, 8 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; |
diff --git a/tests/variables.bad b/tests/variables.bad index bb449f6..61d1956 100644 --- a/tests/variables.bad +++ b/tests/variables.bad | |||
@@ -2,7 +2,7 @@ | |||
2 | ; inferred, but can also be manually specified. | 2 | ; inferred, but can also be manually specified. |
3 | let a: str | 3 | let a: str |
4 | let b: f64 | 4 | let b: f64 |
5 | let c:u64 = 20 | 5 | let c:int = 20 |
6 | 6 | ||
7 | ; No infix '=', instead we use `set` to bind values. | 7 | ; No infix '=', instead we use `set` to bind values. |
8 | set a = "hello" | 8 | set a = "hello" |