aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2024-06-24 16:00:12 +0200
committerBad Diode <bd@badd10de.dev>2024-06-24 16:00:12 +0200
commit6d8b7b0bf66d22d6de13474b18617204adfe32e9 (patch)
tree075dbe936dd23ddd68d2202691abbb02a0861319
parentec7faebe81c6d4aad7f2927962fae5c9f414eb66 (diff)
downloadbdl-6d8b7b0bf66d22d6de13474b18617204adfe32e9.tar.gz
bdl-6d8b7b0bf66d22d6de13474b18617204adfe32e9.zip
Fix typechecking issues for bitops tests
-rw-r--r--src/main.c20
-rw-r--r--tests/variables.bad2
2 files changed, 14 insertions, 8 deletions
diff --git a/src/main.c b/src/main.c
index 88d49ed..4cbce58 100644
--- a/src/main.c
+++ b/src/main.c
@@ -415,7 +415,9 @@ Type
415type_inference(Analyzer *a, Node *node, TypeScope *scope) { 415type_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.
3let a: str 3let a: str
4let b: f64 4let b: f64
5let c:u64 = 20 5let 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.
8set a = "hello" 8set a = "hello"