Commit 52eb347188

Andrew Kelley <andrew@ziglang.org>
2019-06-08 07:16:19
hook up result locs for `try`
1 parent a2fff26
src/all_types.hpp
@@ -430,7 +430,7 @@ enum NodeType {
     NodeTypeVariableDeclaration,
     NodeTypeTestDecl,
     NodeTypeBinOpExpr,
-    NodeTypeUnwrapErrorExpr,
+    NodeTypeCatchExpr,
     NodeTypeFloatLiteral,
     NodeTypeIntLiteral,
     NodeTypeStringLiteral,
src/analyze.cpp
@@ -2993,7 +2993,7 @@ void scan_decls(CodeGen *g, ScopeDecls *decls_scope, AstNode *node) {
         case NodeTypeBlock:
         case NodeTypeGroupedExpr:
         case NodeTypeBinOpExpr:
-        case NodeTypeUnwrapErrorExpr:
+        case NodeTypeCatchExpr:
         case NodeTypeFnCallExpr:
         case NodeTypeArrayAccessExpr:
         case NodeTypeSliceExpr:
src/ast_render.cpp
@@ -165,8 +165,8 @@ static const char *node_type_str(NodeType node_type) {
             return "Parens";
         case NodeTypeBinOpExpr:
             return "BinOpExpr";
-        case NodeTypeUnwrapErrorExpr:
-            return "UnwrapErrorExpr";
+        case NodeTypeCatchExpr:
+            return "CatchExpr";
         case NodeTypeFnCallExpr:
             return "FnCallExpr";
         case NodeTypeArrayAccessExpr:
@@ -1100,7 +1100,7 @@ static void render_node_extra(AstRender *ar, AstNode *node, bool grouped) {
                 fprintf(ar->f, "]");
                 break;
             }
-        case NodeTypeUnwrapErrorExpr:
+        case NodeTypeCatchExpr:
             {
                 render_node_ungrouped(ar, node->data.unwrap_err_expr.op1);
                 fprintf(ar->f, " catch ");
src/ir.cpp
@@ -3383,7 +3383,7 @@ static IrInstruction *ir_gen_async_return(IrBuilder *irb, Scope *scope, AstNode
     return ir_build_cond_br(irb, scope, node, is_canceled_bool, irb->exec->coro_final_cleanup_block, irb->exec->coro_early_final, is_comptime);
 }
 
-static IrInstruction *ir_gen_return(IrBuilder *irb, Scope *scope, AstNode *node, LVal lval) {
+static IrInstruction *ir_gen_return(IrBuilder *irb, Scope *scope, AstNode *node, LVal lval, ResultLoc *result_loc) {
     assert(node->type == NodeTypeReturnExpr);
 
     ZigFn *fn_entry = exec_fn_entry(irb->exec);
@@ -3508,7 +3508,7 @@ static IrInstruction *ir_gen_return(IrBuilder *irb, Scope *scope, AstNode *node,
                 if (lval == LValPtr)
                     return unwrapped_ptr;
                 else
-                    return ir_build_load_ptr(irb, scope, node, unwrapped_ptr);
+                    return ir_expr_wrap(irb, scope, ir_build_load_ptr(irb, scope, node, unwrapped_ptr), result_loc);
             }
     }
     zig_unreachable();
@@ -7083,7 +7083,7 @@ static IrInstruction *ir_gen_slice(IrBuilder *irb, Scope *scope, AstNode *node)
 static IrInstruction *ir_gen_catch(IrBuilder *irb, Scope *parent_scope, AstNode *node, LVal lval,
         ResultLoc *result_loc)
 {
-    assert(node->type == NodeTypeUnwrapErrorExpr);
+    assert(node->type == NodeTypeCatchExpr);
 
     AstNode *op1_node = node->data.unwrap_err_expr.op1;
     AstNode *op2_node = node->data.unwrap_err_expr.op2;
@@ -7895,7 +7895,7 @@ static IrInstruction *ir_gen_node_raw(IrBuilder *irb, AstNode *node, Scope *scop
         case NodeTypeArrayAccessExpr:
             return ir_gen_array_access(irb, scope, node, lval, result_loc);
         case NodeTypeReturnExpr:
-            return ir_gen_return(irb, scope, node, lval);
+            return ir_gen_return(irb, scope, node, lval, result_loc);
         case NodeTypeFieldAccessExpr:
             {
                 IrInstruction *ptr_instruction = ir_gen_field_access(irb, scope, node);
@@ -7968,7 +7968,7 @@ static IrInstruction *ir_gen_node_raw(IrBuilder *irb, AstNode *node, Scope *scop
             return ir_lval_wrap(irb, scope, ir_gen_defer(irb, scope, node), lval, result_loc);
         case NodeTypeSliceExpr:
             return ir_lval_wrap(irb, scope, ir_gen_slice(irb, scope, node), lval, result_loc);
-        case NodeTypeUnwrapErrorExpr:
+        case NodeTypeCatchExpr:
             return ir_gen_catch(irb, scope, node, lval, result_loc);
         case NodeTypeContainerDecl:
             return ir_lval_wrap(irb, scope, ir_gen_container_decl(irb, scope, node), lval, result_loc);
src/parser.cpp
@@ -341,7 +341,7 @@ static AstNode *ast_parse_bin_op_expr(
                 op->data.bin_op_expr.op1 = left;
                 op->data.bin_op_expr.op2 = right;
                 break;
-            case NodeTypeUnwrapErrorExpr:
+            case NodeTypeCatchExpr:
                 op->data.unwrap_err_expr.op1 = left;
                 op->data.unwrap_err_expr.op2 = right;
                 break;
@@ -2377,7 +2377,7 @@ static AstNode *ast_parse_bitwise_op(ParseContext *pc) {
     Token *catch_token = eat_token_if(pc, TokenIdKeywordCatch);
     if (catch_token != nullptr) {
         Token *payload = ast_parse_payload(pc);
-        AstNode *res = ast_create_node(pc, NodeTypeUnwrapErrorExpr, catch_token);
+        AstNode *res = ast_create_node(pc, NodeTypeCatchExpr, catch_token);
         if (payload != nullptr)
             res->data.unwrap_err_expr.symbol = token_symbol(pc, payload);
 
@@ -2864,7 +2864,7 @@ void ast_visit_node_children(AstNode *node, void (*visit)(AstNode **, void *cont
             visit_field(&node->data.bin_op_expr.op1, visit, context);
             visit_field(&node->data.bin_op_expr.op2, visit, context);
             break;
-        case NodeTypeUnwrapErrorExpr:
+        case NodeTypeCatchExpr:
             visit_field(&node->data.unwrap_err_expr.op1, visit, context);
             visit_field(&node->data.unwrap_err_expr.symbol, visit, context);
             visit_field(&node->data.unwrap_err_expr.op2, visit, context);