Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

gccrs: feat: Made changes to ensure no wrong assignments are done. #3300

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

sriganeshres
Copy link

gcc/rust/ChangeLog:

* backend/rust-compile-expr.cc (lvalue_p): Created a function that checks the lvalue. (CompileExpr::visit): Modified the function to check the lvalue using the above mentioned function and also checks the type of lvalue expression.

gcc/testsuite/ChangeLog:

* rust/compile/issue-3287.rs: New test for testing wrong assignments.

Fixes #3287

Copy link
Member

@philberty philberty left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are changes required here i think we can get away wit this check but not totally convinced yet

Also it will need to be applied to the other assignments such as:

x +=1 etc

@@ -958,12 +958,71 @@ CompileExpr::visit (HIR::LiteralExpr &expr)
}
}

bool
lvalue_p (const_tree ref)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this should be renamed and moved into rust-compile-base.cc or into rust-tree.cc call it is_lvalue_tree

case COMPONENT_REF:
return lvalue_p (TREE_OPERAND (ref, 0));

case C_MAYBE_CONST_EXPR:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

c_ TREE's dont exists here remove this case

case RESULT_DECL:
case ERROR_MARK:
return (TREE_CODE (TREE_TYPE (ref)) != FUNCTION_TYPE
&& TREE_CODE (TREE_TYPE (ref)) != METHOD_TYPE);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

iirc METHOD_TYPE might not be a common tree type either

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should i remove that

case TRUNC_DIV_EXPR:
return false;
default:
rust_debug ("unknown");
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

remove this useless debug

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)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I dont like if statements like this its hard to read:

it should be:

bool valid_lvalue = XXX
if (!valid_lvalue) {
-- error diagnostic
}

|| expr.get_lhs ().get_expression_type ()
== HIR::Expr::ExprType::Operator)
{
rust_error_at (expr.get_lhs ().get_locus (),
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you need to add in the rust error code ussing the proper interface

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you give me more clarity

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you need to pass the rust error code into this function like we do in other places take a look through the other parts of the code to check

@philberty philberty added the diagnostic diagnostic static analysis label Dec 11, 2024
@sriganeshres sriganeshres force-pushed the feat-wrong-assignment branch 2 times, most recently from 9bd6356 to 5748d31 Compare December 11, 2024 19:53
@sriganeshres sriganeshres force-pushed the feat-wrong-assignment branch 4 times, most recently from fc569e4 to 2a551f5 Compare December 14, 2024 16:29
@sriganeshres
Copy link
Author

There are changes required here i think we can get away wit this check but not totally convinced yet

Also it will need to be applied to the other assignments such as:

x +=1 etc

Can you give me more information about the case we are missing as x+= 1 is valid as long as x is mutable in rust.

@sriganeshres sriganeshres force-pushed the feat-wrong-assignment branch 3 times, most recently from 944688f to 1089291 Compare December 15, 2024 13:25
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]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
diagnostic diagnostic static analysis
Projects
None yet
Development

Successfully merging this pull request may close these issues.

gccrs does not check if something is assignable
2 participants