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
19511951 expr->const_val.ok = true;
19521952
19531953 bignum_init_unsigned(&expr->const_val.data.x_bignum, x);
1954
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 }
1954 return g->builtin_types.entry_num_lit_int;
19651955}
19661956
19671957static 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,
36653655 normalize_parent_ptrs(node);
36663656 }
36673657
3668 if (node->data.return_expr.kind != ReturnKindUnconditional) {
3669 zig_panic("TODO analyze_return_expr conditional");
3670 }
3671
36723658 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 }
36763689}
36773690
36783691static 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) {
12391239static LLVMValueRef gen_return_expr(CodeGen *g, AstNode *node) {
12401240 assert(node->type == NodeTypeReturnExpr);
12411241 AstNode *param_node = node->data.return_expr.expr;
1242 if (param_node) {
1243 LLVMValueRef value = gen_expr(g, param_node);
1242 assert(param_node);
12441243
1245 add_debug_source_node(g, node);
1246 return LLVMBuildRet(g->builder, value);
1247 } else {
1248 add_debug_source_node(g, node);
1249 return LLVMBuildRetVoid(g->builder);
1244 switch (node->data.return_expr.kind) {
1245 case ReturnKindUnconditional:
1246 {
1247 LLVMValueRef value = gen_expr(g, param_node);
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");
12501256 }
12511257}
12521258