diff options
Diffstat (limited to 'gcc/cp/coroutines.cc')
-rw-r--r-- | gcc/cp/coroutines.cc | 43 |
1 files changed, 21 insertions, 22 deletions
diff --git a/gcc/cp/coroutines.cc b/gcc/cp/coroutines.cc index 60b8466..01a3e83 100644 --- a/gcc/cp/coroutines.cc +++ b/gcc/cp/coroutines.cc @@ -1732,7 +1732,7 @@ expand_one_await_expression (tree *stmt, tree *await_expr, void *d) if (!same_type_ignoring_top_level_qualifiers_p (susp_type, void_coro_handle_type)) r = build1_loc (loc, VIEW_CONVERT_EXPR, void_coro_handle_type, r); - r = build2_loc (loc, INIT_EXPR, void_coro_handle_type, data->conthand, r); + r = cp_build_init_expr (loc, data->conthand, r); r = build1 (CONVERT_EXPR, void_type_node, r); append_to_statement_list (r, &body_list); is_cont = true; @@ -1755,7 +1755,7 @@ expand_one_await_expression (tree *stmt, tree *await_expr, void *d) r = build_call_expr_internal_loc (loc, IFN_CO_YIELD, integer_type_node, 5, susp_idx, final_susp, r_l, d_l, data->coro_fp); - r = build2 (INIT_EXPR, integer_type_node, cond, r); + r = cp_build_init_expr (cond, r); finish_switch_cond (r, sw); r = build_case_label (build_int_cst (integer_type_node, 0), NULL_TREE, create_anon_label_with_ctx (loc, actor)); @@ -2304,7 +2304,7 @@ build_actor_fn (location_t loc, tree coro_frame_type, tree actor, tree fnbody, vec<tree, va_gc> *args = make_tree_vector_single (r); tree hfa = build_new_method_call (ash, hfa_m, &args, NULL_TREE, LOOKUP_NORMAL, NULL, tf_warning_or_error); - r = build2 (INIT_EXPR, handle_type, ash, hfa); + r = cp_build_init_expr (ash, hfa); r = coro_build_cvt_void_expr_stmt (r, loc); add_stmt (r); release_tree_vector (args); @@ -2776,17 +2776,19 @@ flatten_await_stmt (var_nest_node *n, hash_set<tree> *promoted, if (!VOID_TYPE_P (TREE_TYPE (then_cl))) { gcc_checking_assert (TREE_CODE (then_cl) != STATEMENT_LIST); - then_cl - = build2 (init_expr ? INIT_EXPR : MODIFY_EXPR, var_type, - var, then_cl); + if (init_expr) + then_cl = cp_build_init_expr (var, then_cl); + else + then_cl = build2 (MODIFY_EXPR, var_type, var, then_cl); } tree else_cl = COND_EXPR_ELSE (old_expr); if (!VOID_TYPE_P (TREE_TYPE (else_cl))) { gcc_checking_assert (TREE_CODE (else_cl) != STATEMENT_LIST); - else_cl - = build2 (init_expr ? INIT_EXPR : MODIFY_EXPR, var_type, - var, else_cl); + if (init_expr) + else_cl = cp_build_init_expr (var, else_cl); + else + else_cl = build2 (MODIFY_EXPR, var_type, var, else_cl); } n->init = build3 (COND_EXPR, var_type, cond, then_cl, else_cl); } @@ -2804,7 +2806,7 @@ flatten_await_stmt (var_nest_node *n, hash_set<tree> *promoted, DECL_ARTIFICIAL (cond_var) = true; layout_decl (cond_var, 0); gcc_checking_assert (!TYPE_NEEDS_CONSTRUCTING (cond_type)); - cond = build2 (INIT_EXPR, cond_type, cond_var, cond); + cond = cp_build_init_expr (cond_var, cond); var_nest_node *ins = new var_nest_node (cond_var, cond, n->prev, n); COND_EXPR_COND (n->init) = cond_var; @@ -2957,8 +2959,7 @@ handle_nested_conditionals (var_nest_node *n, vec<tree>& list, expression that performs the init and then records that the variable is live (and the DTOR should be run at the scope exit. */ - tree set_flag = build2 (INIT_EXPR, boolean_type_node, - flag, boolean_true_node); + tree set_flag = cp_build_init_expr (flag, boolean_true_node); n->init = build2 (COMPOUND_EXPR, boolean_type_node, n->init, set_flag); } @@ -3471,8 +3472,7 @@ await_statement_walker (tree *stmt, int *do_subtree, void *d) /* We want to initialize the new variable with the expression that contains the await(s) and potentially also needs to have truth_if expressions expanded. */ - tree new_s = build2_loc (sloc, INIT_EXPR, boolean_type_node, - newvar, cond_inner); + tree new_s = cp_build_init_expr (sloc, newvar, cond_inner); finish_expr_stmt (new_s); IF_COND (if_stmt) = newvar; add_stmt (if_stmt); @@ -3656,7 +3656,7 @@ await_statement_walker (tree *stmt, int *do_subtree, void *d) if (TREE_CODE (cond_inner) == CLEANUP_POINT_EXPR) cond_inner = TREE_OPERAND (cond_inner, 0); location_t sloc = EXPR_LOCATION (SWITCH_STMT_COND (sw_stmt)); - tree new_s = build2_loc (sloc, INIT_EXPR, sw_type, newvar, + tree new_s = cp_build_init_expr (sloc, newvar, cond_inner); finish_expr_stmt (new_s); SWITCH_STMT_COND (sw_stmt) = newvar; @@ -4735,7 +4735,7 @@ morph_fn_to_coro (tree orig, tree *resumer, tree *destroyer) } tree allocated = build1 (CONVERT_EXPR, coro_frame_ptr, new_fn); - tree r = build2 (INIT_EXPR, TREE_TYPE (coro_fp), coro_fp, allocated); + tree r = cp_build_init_expr (coro_fp, allocated); r = coro_build_cvt_void_expr_stmt (r, fn_start); add_stmt (r); @@ -4796,7 +4796,7 @@ morph_fn_to_coro (tree orig, tree *resumer, tree *destroyer) 1, 0,tf_warning_or_error); tree fnf_x = build_class_member_access_expr (deref_fp, fnf_m, NULL_TREE, false, tf_warning_or_error); - r = build2 (INIT_EXPR, boolean_type_node, fnf_x, boolean_true_node); + r = cp_build_init_expr (fnf_x, boolean_true_node); r = coro_build_cvt_void_expr_stmt (r, fn_start); add_stmt (r); @@ -4808,7 +4808,7 @@ morph_fn_to_coro (tree orig, tree *resumer, tree *destroyer) /*protect=*/1, /*want_type=*/0, tf_warning_or_error); tree resume_x = build_class_member_access_expr (deref_fp, resume_m, NULL_TREE, false, tf_warning_or_error); - r = build2_loc (fn_start, INIT_EXPR, act_des_fn_ptr, resume_x, actor_addr); + r = cp_build_init_expr (fn_start, resume_x, actor_addr); finish_expr_stmt (r); tree destroy_addr = build1 (ADDR_EXPR, act_des_fn_ptr, destroy); @@ -4818,7 +4818,7 @@ morph_fn_to_coro (tree orig, tree *resumer, tree *destroyer) tree destroy_x = build_class_member_access_expr (deref_fp, destroy_m, NULL_TREE, false, tf_warning_or_error); - r = build2_loc (fn_start, INIT_EXPR, act_des_fn_ptr, destroy_x, destroy_addr); + r = cp_build_init_expr (fn_start, destroy_x, destroy_addr); finish_expr_stmt (r); /* [dcl.fct.def.coroutine] /13 @@ -5011,8 +5011,7 @@ morph_fn_to_coro (tree orig, tree *resumer, tree *destroyer) release_tree_vector (arg); } else - r = build2_loc (fn_start, INIT_EXPR, gro_type, - DECL_RESULT (orig), get_ro); + r = cp_build_init_expr (fn_start, DECL_RESULT (orig), get_ro); if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (gro_type)) /* If some part of the initalization code (prior to the await_resume @@ -5067,7 +5066,7 @@ morph_fn_to_coro (tree orig, tree *resumer, tree *destroyer) = build_class_member_access_expr (deref_fp, resume_idx_m, NULL_TREE, false, tf_warning_or_error); r = build_int_cst (short_unsigned_type_node, 0); - r = build2_loc (fn_start, INIT_EXPR, short_unsigned_type_node, resume_idx, r); + r = cp_build_init_expr (fn_start, resume_idx, r); r = coro_build_cvt_void_expr_stmt (r, fn_start); add_stmt (r); |