Skip to content

Commit

Permalink
gccrs: feat: Made changes to ensure no wrong assignments are done.
Browse files Browse the repository at this point in the history
gcc/rust/ChangeLog:

	* backend/rust-compile-base.cc (HIRCompileBase::lvalue_p): Created a function that
	checks for lvalue.
	* backend/rust-compile-base.h: Created the Signature for above function.
	* backend/rust-compile-expr.cc (CompileExpr::visit): Made changes to ensure
	proper readability and checking for wrong assignments.

gcc/testsuite/ChangeLog:

	* rust/compile/issue-3297.rs: New test.

Signed-off-by: Sri Ganesh Thota <[email protected]>
  • Loading branch information
sriganeshres committed Dec 15, 2024
1 parent 55a9d8d commit e6a88dc
Show file tree
Hide file tree
Showing 4 changed files with 70 additions and 0 deletions.
46 changes: 46 additions & 0 deletions gcc/rust/backend/rust-compile-base.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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
1 change: 1 addition & 0 deletions gcc/rust/backend/rust-compile-base.h
Original file line number Diff line number Diff line change
Expand Up @@ -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) {}
Expand Down
11 changes: 11 additions & 0 deletions gcc/rust/backend/rust-compile-expr.cc
Original file line number Diff line number Diff line change
Expand Up @@ -964,6 +964,17 @@ CompileExpr::visit (HIR::AssignmentExpr &expr)
auto lvalue = CompileExpr::Compile (expr.get_lhs (), ctx);
auto rvalue = CompileExpr::Compile (expr.get_rhs (), ctx);

bool validl_value = lvalue_p (lvalue);

if (!validl_value
|| expr.get_lhs ().get_expression_type ()
== HIR::Expr::ExprType::Operator)
{
rust_error_at (expr.get_lhs ().get_locus (), ErrorCode::E0770,
"invalid left-hand side of assignment");
return;
}

// assignments are coercion sites so lets convert the rvalue if necessary
TyTy::BaseType *expected = nullptr;
TyTy::BaseType *actual = nullptr;
Expand Down
12 changes: 12 additions & 0 deletions gcc/testsuite/rust/compile/issue-3297.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
extern "C" {
fn printf(s: *const i8, ...);
}

pub fn main() {
unsafe {
let mut x = 42;
x + 1= 2; // { dg-error "invalid left-hand side of assignment" }
let format = "Result: %d\n\0" as *const str as *const i8;
printf(format, x);
}
}

0 comments on commit e6a88dc

Please sign in to comment.