From ca7b85b32e26acfd716c02047966254a34cd2237 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Sun, 24 Jan 2016 14:51:47 -0700 Subject: [PATCH] fix number literal implicit cast --- src/analyze.cpp | 47 ++++++++++++++++++++++++++++++----------------- src/codegen.cpp | 20 +++++++++++++------- 2 files changed, 43 insertions(+), 24 deletions(-) diff --git a/src/analyze.cpp b/src/analyze.cpp index 8f5db687b..bc4f463dd 100644 --- a/src/analyze.cpp +++ b/src/analyze.cpp @@ -1951,17 +1951,7 @@ static TypeTableEntry *resolve_expr_const_val_as_unsigned_num_lit(CodeGen *g, As expr->const_val.ok = true; bignum_init_unsigned(&expr->const_val.data.x_bignum, x); - - if (expected_type) { - if (expected_type->id == TypeTableEntryIdMaybe) { - return g->builtin_types.entry_num_lit_int; - } else { - num_lit_fits_in_other_type(g, node, expected_type); - return expected_type; - } - } else { - return g->builtin_types.entry_num_lit_int; - } + return g->builtin_types.entry_num_lit_int; } static 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, normalize_parent_ptrs(node); } - if (node->data.return_expr.kind != ReturnKindUnconditional) { - zig_panic("TODO analyze_return_expr conditional"); - } - TypeTableEntry *expected_return_type = get_return_type(context); - analyze_expression(g, import, context, expected_return_type, node->data.return_expr.expr); - return g->builtin_types.entry_unreachable; + switch (node->data.return_expr.kind) { + case ReturnKindUnconditional: + { + analyze_expression(g, import, context, expected_return_type, node->data.return_expr.expr); + + return g->builtin_types.entry_unreachable; + } + case ReturnKindError: + { + TypeTableEntry *expected_err_type; + if (expected_type) { + expected_err_type = get_error_type(g, expected_type); + } else { + expected_err_type = nullptr; + } + TypeTableEntry *resolved_type = analyze_expression(g, import, context, expected_err_type, + node->data.return_expr.expr); + if (resolved_type->id == TypeTableEntryIdInvalid) { + return resolved_type; + } else if (resolved_type->id == TypeTableEntryIdErrorUnion) { + return resolved_type->data.error.child_type; + } else { + add_node_error(g, node->data.return_expr.expr, + buf_sprintf("expected error type, got '%s'", buf_ptr(&resolved_type->name))); + } + } + case ReturnKindMaybe: + zig_panic("TODO"); + } } static TypeTableEntry *analyze_string_literal_expr(CodeGen *g, ImportTableEntry *import, BlockContext *context, diff --git a/src/codegen.cpp b/src/codegen.cpp index be96fe1b9..10395dd89 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -1239,14 +1239,20 @@ static LLVMValueRef gen_bin_op_expr(CodeGen *g, AstNode *node) { static LLVMValueRef gen_return_expr(CodeGen *g, AstNode *node) { assert(node->type == NodeTypeReturnExpr); AstNode *param_node = node->data.return_expr.expr; - if (param_node) { - LLVMValueRef value = gen_expr(g, param_node); + assert(param_node); - add_debug_source_node(g, node); - return LLVMBuildRet(g->builder, value); - } else { - add_debug_source_node(g, node); - return LLVMBuildRetVoid(g->builder); + switch (node->data.return_expr.kind) { + case ReturnKindUnconditional: + { + LLVMValueRef value = gen_expr(g, param_node); + + add_debug_source_node(g, node); + return LLVMBuildRet(g->builder, value); + } + case ReturnKindError: + zig_panic("TODO"); + case ReturnKindMaybe: + zig_panic("TODO"); } }