From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1643) id 45EA9383E682; Wed, 8 Jun 2022 12:41:26 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 45EA9383E682 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Thomas Schwinge To: gcc-cvs@gcc.gnu.org Subject: [gcc/devel/rust/master] Fix address expression to respect reference/pointer types X-Act-Checkin: gcc X-Git-Author: Philip Herron X-Git-Refname: refs/heads/devel/rust/master X-Git-Oldrev: f38bf60c3ac7f039db5ff5c7c0587325097892c8 X-Git-Newrev: 44c058c30dd1d36f87c36f2c487355a5736d0afc Message-Id: <20220608124126.45EA9383E682@sourceware.org> Date: Wed, 8 Jun 2022 12:41:26 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 08 Jun 2022 12:41:26 -0000 https://gcc.gnu.org/g:44c058c30dd1d36f87c36f2c487355a5736d0afc commit 44c058c30dd1d36f87c36f2c487355a5736d0afc Author: Philip Herron Date: Fri Apr 29 15:27:53 2022 +0100 Fix address expression to respect reference/pointer types Diff: --- gcc/rust/backend/rust-compile-base.cc | 5 ++-- gcc/rust/backend/rust-compile-base.h | 2 +- gcc/rust/backend/rust-compile-expr.cc | 37 ++++++++++++++++++++------- gcc/rust/backend/rust-compile-implitem.cc | 9 +++++-- gcc/rust/backend/rust-compile-item.cc | 9 +++++-- gcc/rust/backend/rust-compile-resolve-path.cc | 6 +++-- gcc/rust/backend/rust-compile.cc | 5 ++-- 7 files changed, 53 insertions(+), 20 deletions(-) diff --git a/gcc/rust/backend/rust-compile-base.cc b/gcc/rust/backend/rust-compile-base.cc index b969b7a6efc..928306fa9d8 100644 --- a/gcc/rust/backend/rust-compile-base.cc +++ b/gcc/rust/backend/rust-compile-base.cc @@ -317,7 +317,7 @@ HIRCompileBase::mark_addressable (tree exp, Location locus) } tree -HIRCompileBase::address_expression (tree expr, Location location) +HIRCompileBase::address_expression (tree expr, tree ptrtype, Location location) { if (expr == error_mark_node) return error_mark_node; @@ -325,7 +325,8 @@ HIRCompileBase::address_expression (tree expr, Location location) if (!mark_addressable (expr, location)) return error_mark_node; - return build_fold_addr_expr_loc (location.gcc_location (), expr); + return build_fold_addr_expr_with_type_loc (location.gcc_location (), expr, + ptrtype); } std::vector diff --git a/gcc/rust/backend/rust-compile-base.h b/gcc/rust/backend/rust-compile-base.h index c09c5620e53..d58fd193123 100644 --- a/gcc/rust/backend/rust-compile-base.h +++ b/gcc/rust/backend/rust-compile-base.h @@ -98,7 +98,7 @@ protected: static void setup_abi_options (tree fndecl, ABI abi); - static tree address_expression (tree, Location); + static tree address_expression (tree expr, tree ptrtype, Location locus); static bool mark_addressable (tree, Location); diff --git a/gcc/rust/backend/rust-compile-expr.cc b/gcc/rust/backend/rust-compile-expr.cc index edeea8d2fbd..5f9334cd1d1 100644 --- a/gcc/rust/backend/rust-compile-expr.cc +++ b/gcc/rust/backend/rust-compile-expr.cc @@ -123,7 +123,14 @@ void CompileExpr::visit (HIR::BorrowExpr &expr) { tree main_expr = CompileExpr::Compile (expr.get_expr ().get (), ctx); - translated = address_expression (main_expr, expr.get_locus ()); + + TyTy::BaseType *tyty = nullptr; + if (!ctx->get_tyctx ()->lookup_type (expr.get_mappings ().get_hirid (), + &tyty)) + return; + + tree ptrtype = TyTyResolveCompile::compile (ctx, tyty); + translated = address_expression (main_expr, ptrtype, expr.get_locus ()); } void @@ -707,7 +714,8 @@ CompileExpr::resolve_method_address (TyTy::FnType *fntype, HirId ref, tree fn = NULL_TREE; if (ctx->lookup_function_decl (fntype->get_ty_ref (), &fn)) { - return address_expression (fn, expr_locus); + return address_expression (fn, build_pointer_type (TREE_TYPE (fn)), + expr_locus); } // Now we can try and resolve the address since this might be a forward @@ -983,7 +991,8 @@ CompileExpr::compile_string_literal (const HIR::LiteralExpr &expr, auto base = ctx->get_backend ()->string_constant_expression ( literal_value.as_string ()); - return address_expression (base, expr.get_locus ()); + return address_expression (base, build_pointer_type (TREE_TYPE (base)), + expr.get_locus ()); } tree @@ -1016,7 +1025,8 @@ CompileExpr::compile_byte_string_literal (const HIR::LiteralExpr &expr, vals, expr.get_locus ()); - return address_expression (constructed, expr.get_locus ()); + return address_expression (constructed, build_pointer_type (array_type), + expr.get_locus ()); } tree @@ -1233,8 +1243,11 @@ HIRCompileBase::resolve_adjustements ( return error_mark_node; case Resolver::Adjustment::AdjustmentType::IMM_REF: - case Resolver::Adjustment::AdjustmentType::MUT_REF: - e = address_expression (e, locus); + case Resolver::Adjustment::AdjustmentType::MUT_REF: { + tree ptrtype + = TyTyResolveCompile::compile (ctx, adjustment.get_expected ()); + e = address_expression (e, ptrtype, locus); + } break; case Resolver::Adjustment::AdjustmentType::DEREF: @@ -1280,7 +1293,10 @@ HIRCompileBase::resolve_deref_adjustment (Resolver::Adjustment &adjustment, != Resolver::Adjustment::AdjustmentType::ERROR; if (needs_borrow) { - adjusted_argument = address_expression (expression, locus); + adjusted_argument + = address_expression (expression, + build_reference_type (TREE_TYPE (expression)), + locus); } // make the call @@ -1316,7 +1332,9 @@ HIRCompileBase::resolve_unsized_adjustment (Resolver::Adjustment &adjustment, = TyTyResolveCompile::compile (ctx, adjustment.get_expected ()); // make a constructor for this - tree data = address_expression (expression, locus); + tree data + = address_expression (expression, + build_reference_type (TREE_TYPE (expression)), locus); // fetch the size from the domain tree domain = TYPE_DOMAIN (expr_type); @@ -1414,7 +1432,8 @@ CompileExpr::visit (HIR::IdentifierExpr &expr) else if (ctx->lookup_function_decl (ref, &fn)) { TREE_USED (fn) = 1; - translated = address_expression (fn, expr.get_locus ()); + translated = address_expression (fn, build_pointer_type (TREE_TYPE (fn)), + expr.get_locus ()); } else if (ctx->lookup_var_decl (ref, &var)) { diff --git a/gcc/rust/backend/rust-compile-implitem.cc b/gcc/rust/backend/rust-compile-implitem.cc index 9dc6d14d629..c13556aaa91 100644 --- a/gcc/rust/backend/rust-compile-implitem.cc +++ b/gcc/rust/backend/rust-compile-implitem.cc @@ -68,7 +68,10 @@ CompileTraitItem::visit (HIR::TraitItemFunc &func) { ctx->insert_function_decl (fntype, lookup); } - reference = address_expression (lookup, ref_locus); + reference + = address_expression (lookup, + build_pointer_type (TREE_TYPE (lookup)), + ref_locus); return; } } @@ -95,7 +98,9 @@ CompileTraitItem::visit (HIR::TraitItemFunc &func) func.get_outer_attrs (), func.get_locus (), func.get_block_expr ().get (), canonical_path, fntype, function.has_return_type ()); - reference = address_expression (fndecl, ref_locus); + reference + = address_expression (fndecl, build_pointer_type (TREE_TYPE (fndecl)), + ref_locus); } } // namespace Compile diff --git a/gcc/rust/backend/rust-compile-item.cc b/gcc/rust/backend/rust-compile-item.cc index 969c852d516..36fa78757ac 100644 --- a/gcc/rust/backend/rust-compile-item.cc +++ b/gcc/rust/backend/rust-compile-item.cc @@ -146,7 +146,10 @@ CompileItem::visit (HIR::Function &function) ctx->insert_function_decl (fntype, lookup); } - reference = address_expression (lookup, ref_locus); + reference + = address_expression (lookup, + build_pointer_type (TREE_TYPE (lookup)), + ref_locus); return; } } @@ -171,7 +174,9 @@ CompileItem::visit (HIR::Function &function) function.get_outer_attrs (), function.get_locus (), function.get_definition ().get (), canonical_path, fntype, function.has_function_return_type ()); - reference = address_expression (fndecl, ref_locus); + reference + = address_expression (fndecl, build_pointer_type (TREE_TYPE (fndecl)), + ref_locus); } void diff --git a/gcc/rust/backend/rust-compile-resolve-path.cc b/gcc/rust/backend/rust-compile-resolve-path.cc index 55a2fffe9dd..bd44bf45791 100644 --- a/gcc/rust/backend/rust-compile-resolve-path.cc +++ b/gcc/rust/backend/rust-compile-resolve-path.cc @@ -141,14 +141,16 @@ ResolvePathRef::resolve (const HIR::PathIdentSegment &final_segment, if (ctx->lookup_function_decl (fntype->get_ty_ref (), &fn)) { TREE_USED (fn) = 1; - return address_expression (fn, expr_locus); + return address_expression (fn, build_pointer_type (TREE_TYPE (fn)), + expr_locus); } else if (fntype->get_abi () == ABI::INTRINSIC) { Intrinsics compile (ctx); fn = compile.compile (fntype); TREE_USED (fn) = 1; - return address_expression (fn, expr_locus); + return address_expression (fn, build_pointer_type (TREE_TYPE (fn)), + expr_locus); } } diff --git a/gcc/rust/backend/rust-compile.cc b/gcc/rust/backend/rust-compile.cc index bd782b00390..ad36a3790d1 100644 --- a/gcc/rust/backend/rust-compile.cc +++ b/gcc/rust/backend/rust-compile.cc @@ -299,8 +299,9 @@ HIRCompileBase::coerce_to_dyn_object (tree compiled_ref, || it->get_type () == Resolver::Adjustment::AdjustmentType::MUT_REF; rust_assert (ok); - resulting_dyn_object_ref - = address_expression (resulting_dyn_object_ref, locus); + resulting_dyn_object_ref = address_expression ( + resulting_dyn_object_ref, + build_reference_type (TREE_TYPE (resulting_dyn_object_ref)), locus); } return resulting_dyn_object_ref; }