Commit ca7b85b32e

Andrew Kelley <superjoe30@gmail.com>
2016-01-24 22:51:47
fix number literal implicit cast
1 parent 5c18826
Changed files (2)
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,
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");
     }
 }