Browse Source

Fix type assertion bug #619

gingerBill 5 years ago
parent
commit
4236e870d7
2 changed files with 8 additions and 5 deletions
  1. 6 2
      core/runtime/internal.odin
  2. 2 3
      src/check_expr.cpp

+ 6 - 2
core/runtime/internal.odin

@@ -235,8 +235,12 @@ print_caller_location :: proc(fd: os.Handle, using loc: Source_Code_Location) {
 	os.write_byte(fd, ')');
 	os.write_byte(fd, ')');
 }
 }
 print_typeid :: proc(fd: os.Handle, id: typeid) {
 print_typeid :: proc(fd: os.Handle, id: typeid) {
-	ti := type_info_of(id);
-	print_type(fd, ti);
+	if id == nil {
+		os.write_string(fd, "nil");
+	} else {
+		ti := type_info_of(id);
+		print_type(fd, ti);
+	}
 }
 }
 print_type :: proc(fd: os.Handle, ti: ^Type_Info) {
 print_type :: proc(fd: os.Handle, ti: ^Type_Info) {
 	if ti == nil {
 	if ti == nil {

+ 2 - 3
src/check_expr.cpp

@@ -5750,9 +5750,8 @@ bool check_assignment_arguments(CheckerContext *ctx, Array<Operand> const &lhs,
 
 
 				optional_ok = true;
 				optional_ok = true;
 				tuple_index += 2;
 				tuple_index += 2;
-			} else if (o.mode == Addressing_OptionalOk) {
+			} else if (o.mode == Addressing_OptionalOk && is_type_tuple(o.type)) {
 				Type *tuple = o.type;
 				Type *tuple = o.type;
-				GB_ASSERT(is_type_tuple(tuple));
 				GB_ASSERT(tuple->Tuple.variables.count == 2);
 				GB_ASSERT(tuple->Tuple.variables.count == 2);
 				Ast *expr = unparen_expr(o.expr);
 				Ast *expr = unparen_expr(o.expr);
 				if (expr->kind == Ast_CallExpr) {
 				if (expr->kind == Ast_CallExpr) {
@@ -5769,7 +5768,7 @@ bool check_assignment_arguments(CheckerContext *ctx, Array<Operand> const &lhs,
 			}
 			}
 		} else {
 		} else {
 			TypeTuple *tuple = &o.type->Tuple;
 			TypeTuple *tuple = &o.type->Tuple;
-			if (o.mode == Addressing_OptionalOk && lhs.count == 1) {
+			if (o.mode == Addressing_OptionalOk  && is_type_tuple(o.type) && lhs.count == 1) {
 				GB_ASSERT(tuple->variables.count == 2);
 				GB_ASSERT(tuple->variables.count == 2);
 				Ast *expr = unparen_expr(o.expr);
 				Ast *expr = unparen_expr(o.expr);
 				if (expr->kind == Ast_CallExpr) {
 				if (expr->kind == Ast_CallExpr) {