Browse Source

Fix `cast` to `any` of untyped constants

Ginger Bill 8 years ago
parent
commit
70f9cacdce
1 changed files with 8 additions and 3 deletions
  1. 8 3
      src/check_expr.c

+ 8 - 3
src/check_expr.c

@@ -2324,10 +2324,10 @@ void check_cast(Checker *c, Operand *x, Type *type) {
 			}
 			}
 		}
 		}
 	} else if (check_is_castable_to(c, x, type)) {
 	} else if (check_is_castable_to(c, x, type)) {
-		if (x->mode != Addressing_Constant) {
+		can_convert = true;
+		if (x->mode != Addressing_Constant || is_type_any(type)) {
 			x->mode = Addressing_Value;
 			x->mode = Addressing_Value;
 		}
 		}
-		can_convert = true;
 	}
 	}
 
 
 	if (!can_convert) {
 	if (!can_convert) {
@@ -2348,7 +2348,9 @@ void check_cast(Checker *c, Operand *x, Type *type) {
 		if (is_const_expr && !is_type_constant_type(type)) {
 		if (is_const_expr && !is_type_constant_type(type)) {
 			final_type = default_type(x->type);
 			final_type = default_type(x->type);
 		}
 		}
-		update_expr_type(c, x->expr, final_type, true);
+		if (!is_type_any(final_type)) {
+			update_expr_type(c, x->expr, final_type, true);
+		}
 	}
 	}
 
 
 	x->type = type;
 	x->type = type;
@@ -5349,6 +5351,7 @@ ExprKind check_expr_base_internal(Checker *c, Operand *o, AstNode *node, Type *t
 		switch (ce->token.kind) {
 		switch (ce->token.kind) {
 		case Token_cast:
 		case Token_cast:
 			check_cast(c, o, t);
 			check_cast(c, o, t);
+			o->expr = node;
 			break;
 			break;
 		case Token_transmute: {
 		case Token_transmute: {
 			if (o->mode == Addressing_Constant) {
 			if (o->mode == Addressing_Constant) {
@@ -5459,6 +5462,8 @@ ExprKind check_expr_base_internal(Checker *c, Operand *o, AstNode *node, Type *t
 		default:
 		default:
 			GB_PANIC("Unknown cast expression");
 			GB_PANIC("Unknown cast expression");
 		}
 		}
+
+		o->expr = node;
 	case_end;
 	case_end;