From 2a551f5027b8d8199882c0bf368c27210561bb22 Mon Sep 17 00:00:00 2001 From: Sri Ganesh Thota Date: Thu, 12 Dec 2024 01:09:13 +0530 Subject: [PATCH] gccrs: feat: Made changes to ensure no wrong assignments are done. gcc/rust/ChangeLog: * backend/rust-compile-base.cc (HIRCompileBase::lvalue_p): Created a function that checks the lvalue. * backend/rust-compile-base.h: Created the Signature for above function * backend/rust-compile-expr.cc (lvalue_p): Moved the function from here to rust-compile-base. (CompileExpr::visit): Made changes to ensure proper readability and checking for wrong assignments. Signed-off-by: Sri Ganesh Thota --- gcc/rust/backend/rust-compile-base.cc | 46 ++++++++++++++++++++++ gcc/rust/backend/rust-compile-base.h | 1 + gcc/rust/backend/rust-compile-expr.cc | 56 ++------------------------- 3 files changed, 51 insertions(+), 52 deletions(-) diff --git a/gcc/rust/backend/rust-compile-base.cc b/gcc/rust/backend/rust-compile-base.cc index a4d0d062accc..b17c354b41e4 100644 --- a/gcc/rust/backend/rust-compile-base.cc +++ b/gcc/rust/backend/rust-compile-base.cc @@ -1015,5 +1015,51 @@ HIRCompileBase::unit_expression (location_t locus) return Backend::constructor_expression (unit_type, false, {}, -1, locus); } +bool +HIRCompileBase::lvalue_p (const_tree ref) +{ + const enum tree_code code = TREE_CODE (ref); + + switch (code) + { + case REALPART_EXPR: + case IMAGPART_EXPR: + case COMPONENT_REF: + return lvalue_p (TREE_OPERAND (ref, 0)); + + case COMPOUND_LITERAL_EXPR: + case STRING_CST: + case CONST_DECL: + case INTEGER_CST: + return true; + + case MEM_REF: + case TARGET_MEM_REF: + /* MEM_REFs can appear from -fgimple parsing or folding, so allow them + here as well. */ + case INDIRECT_REF: + case ARRAY_REF: + case VAR_DECL: + case PARM_DECL: + case RESULT_DECL: + case ERROR_MARK: + return (TREE_CODE (TREE_TYPE (ref)) != FUNCTION_TYPE + && TREE_CODE (TREE_TYPE (ref)) != METHOD_TYPE); + + case BIND_EXPR: + return TREE_CODE (TREE_TYPE (ref)) == ARRAY_TYPE; + case PLUS_EXPR: + case MINUS_EXPR: + case MULT_EXPR: + case POINTER_PLUS_EXPR: + case POINTER_DIFF_EXPR: + case MULT_HIGHPART_EXPR: + case TRUNC_DIV_EXPR: + return false; + default: + return false; + } +} + } // namespace Compile } // namespace Rust diff --git a/gcc/rust/backend/rust-compile-base.h b/gcc/rust/backend/rust-compile-base.h index 3c50535552f5..5d9b015d94eb 100644 --- a/gcc/rust/backend/rust-compile-base.h +++ b/gcc/rust/backend/rust-compile-base.h @@ -30,6 +30,7 @@ class HIRCompileBase virtual ~HIRCompileBase () {} static tree address_expression (tree expr, location_t locus); + bool lvalue_p (const_tree ref); protected: HIRCompileBase (Context *ctx) : ctx (ctx) {} diff --git a/gcc/rust/backend/rust-compile-expr.cc b/gcc/rust/backend/rust-compile-expr.cc index 1a3ba1961e03..af8b73e88430 100644 --- a/gcc/rust/backend/rust-compile-expr.cc +++ b/gcc/rust/backend/rust-compile-expr.cc @@ -851,7 +851,7 @@ CompileExpr::visit (HIR::ContinueExpr &expr) if (!ctx->lookup_label_decl (ref, &label)) { - rust_error_at (expr.get_label ().get_locus (), + rust_error_at (expr.get_label ().get_locus (), ErrorCode::E0770, "failed to lookup compiled label"); return; } @@ -958,63 +958,15 @@ CompileExpr::visit (HIR::LiteralExpr &expr) } } -bool -lvalue_p (const_tree ref) -{ - const enum tree_code code = TREE_CODE (ref); - - switch (code) - { - case REALPART_EXPR: - case IMAGPART_EXPR: - case COMPONENT_REF: - return lvalue_p (TREE_OPERAND (ref, 0)); - - case C_MAYBE_CONST_EXPR: - return lvalue_p (TREE_OPERAND (ref, 1)); - - case COMPOUND_LITERAL_EXPR: - case STRING_CST: - case CONST_DECL: - case INTEGER_CST: - return true; - - case MEM_REF: - case TARGET_MEM_REF: - /* MEM_REFs can appear from -fgimple parsing or folding, so allow them - here as well. */ - case INDIRECT_REF: - case ARRAY_REF: - case VAR_DECL: - case PARM_DECL: - case RESULT_DECL: - case ERROR_MARK: - return (TREE_CODE (TREE_TYPE (ref)) != FUNCTION_TYPE - && TREE_CODE (TREE_TYPE (ref)) != METHOD_TYPE); - - case BIND_EXPR: - return TREE_CODE (TREE_TYPE (ref)) == ARRAY_TYPE; - case PLUS_EXPR: - case MINUS_EXPR: - case MULT_EXPR: - case POINTER_PLUS_EXPR: - case POINTER_DIFF_EXPR: - case MULT_HIGHPART_EXPR: - case TRUNC_DIV_EXPR: - return false; - default: - rust_debug ("unknown"); - return false; - } -} - void CompileExpr::visit (HIR::AssignmentExpr &expr) { auto lvalue = CompileExpr::Compile (expr.get_lhs (), ctx); auto rvalue = CompileExpr::Compile (expr.get_rhs (), ctx); - if (!lvalue_p (lvalue) + bool validl_value = lvalue_p (lvalue); + + if (!validl_value || expr.get_lhs ().get_expression_type () == HIR::Expr::ExprType::Operator) {