authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-01-24 14:51:47-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-01-24 14:51:47-07:00
logca7b85b32e26acfd716c02047966254a34cd2237
tree85457f08b9cd94e9fb23e73240a7a6a79478e325
parent5c18826240fe983a30a9de6e04d3848643db7cf6

fix number literal implicit cast


2 files changed, 43 insertions(+), 24 deletions(-)

src/analyze.cpp+30-17
...@@ -1951,17 +1951,7 @@ static TypeTableEntry *resolve_expr_const_val_as_unsigned_num_lit(CodeGen *g, As...@@ -1951,17 +1951,7 @@ static TypeTableEntry *resolve_expr_const_val_as_unsigned_num_lit(CodeGen *g, As
1951 expr->const_val.ok = true;1951 expr->const_val.ok = true;
19521952
1953 bignum_init_unsigned(&expr->const_val.data.x_bignum, x);1953 bignum_init_unsigned(&expr->const_val.data.x_bignum, x);
19541954 return g->builtin_types.entry_num_lit_int;
1955 if (expected_type) {
1956 if (expected_type->id == TypeTableEntryIdMaybe) {
1957 return g->builtin_types.entry_num_lit_int;
1958 } else {
1959 num_lit_fits_in_other_type(g, node, expected_type);
1960 return expected_type;
1961 }
1962 } else {
1963 return g->builtin_types.entry_num_lit_int;
1964 }
1965}1955}
19661956
1967static TypeTableEntry *resolve_expr_const_val_as_float_num_lit(CodeGen *g, AstNode *node,1957static TypeTableEntry *resolve_expr_const_val_as_float_num_lit(CodeGen *g, AstNode *node,
...@@ -3665,14 +3655,37 @@ static TypeTableEntry *analyze_return_expr(CodeGen *g, ImportTableEntry *import,...@@ -3665,14 +3655,37 @@ static TypeTableEntry *analyze_return_expr(CodeGen *g, ImportTableEntry *import,
3665 normalize_parent_ptrs(node);3655 normalize_parent_ptrs(node);
3666 }3656 }
36673657
3668 if (node->data.return_expr.kind != ReturnKindUnconditional) {
3669 zig_panic("TODO analyze_return_expr conditional");
3670 }
3671
3672 TypeTableEntry *expected_return_type = get_return_type(context);3658 TypeTableEntry *expected_return_type = get_return_type(context);
3673 analyze_expression(g, import, context, expected_return_type, node->data.return_expr.expr);
36743659
3675 return g->builtin_types.entry_unreachable;3660 switch (node->data.return_expr.kind) {
3661 case ReturnKindUnconditional:
3662 {
3663 analyze_expression(g, import, context, expected_return_type, node->data.return_expr.expr);
3664
3665 return g->builtin_types.entry_unreachable;
3666 }
3667 case ReturnKindError:
3668 {
3669 TypeTableEntry *expected_err_type;
3670 if (expected_type) {
3671 expected_err_type = get_error_type(g, expected_type);
3672 } else {
3673 expected_err_type = nullptr;
3674 }
3675 TypeTableEntry *resolved_type = analyze_expression(g, import, context, expected_err_type,
3676 node->data.return_expr.expr);
3677 if (resolved_type->id == TypeTableEntryIdInvalid) {
3678 return resolved_type;
3679 } else if (resolved_type->id == TypeTableEntryIdErrorUnion) {
3680 return resolved_type->data.error.child_type;
3681 } else {
3682 add_node_error(g, node->data.return_expr.expr,
3683 buf_sprintf("expected error type, got '%s'", buf_ptr(&resolved_type->name)));
3684 }
3685 }
3686 case ReturnKindMaybe:
3687 zig_panic("TODO");
3688 }
3676}3689}
36773690
3678static TypeTableEntry *analyze_string_literal_expr(CodeGen *g, ImportTableEntry *import, BlockContext *context,3691static TypeTableEntry *analyze_string_literal_expr(CodeGen *g, ImportTableEntry *import, BlockContext *context,
src/codegen.cpp+13-7
...@@ -1239,14 +1239,20 @@ static LLVMValueRef gen_bin_op_expr(CodeGen *g, AstNode *node) {...@@ -1239,14 +1239,20 @@ static LLVMValueRef gen_bin_op_expr(CodeGen *g, AstNode *node) {
1239static LLVMValueRef gen_return_expr(CodeGen *g, AstNode *node) {1239static LLVMValueRef gen_return_expr(CodeGen *g, AstNode *node) {
1240 assert(node->type == NodeTypeReturnExpr);1240 assert(node->type == NodeTypeReturnExpr);
1241 AstNode *param_node = node->data.return_expr.expr;1241 AstNode *param_node = node->data.return_expr.expr;
1242 if (param_node) {1242 assert(param_node);
1243 LLVMValueRef value = gen_expr(g, param_node);
12441243
1245 add_debug_source_node(g, node);1244 switch (node->data.return_expr.kind) {
1246 return LLVMBuildRet(g->builder, value);1245 case ReturnKindUnconditional:
1247 } else {1246 {
1248 add_debug_source_node(g, node);1247 LLVMValueRef value = gen_expr(g, param_node);
1249 return LLVMBuildRetVoid(g->builder);1248
1249 add_debug_source_node(g, node);
1250 return LLVMBuildRet(g->builder, value);
1251 }
1252 case ReturnKindError:
1253 zig_panic("TODO");
1254 case ReturnKindMaybe:
1255 zig_panic("TODO");
1250 }1256 }
1251}1257}
12521258