Skip to content

Commit

Permalink
Move errors with locations
Browse files Browse the repository at this point in the history
gcc/rust/ChangeLog:

	* checks/errors/borrowck/rust-borrow-checker-diagnostics.cc
	(BorrowCheckerDiagnostics::report_move_errors): Specify
	locations for code causing errors and related moves.

gcc/testsuite/ChangeLog:

	* rust/borrowck/test_move.rs: Test rich-errors related to moves.
	* rust/borrowck/test_move_conditional.rs: Likewise.

Signed-off-by: Kushal Pal <[email protected]>
  • Loading branch information
braw-lee authored and P-E-P committed Aug 16, 2024
1 parent c6d0824 commit e61d37a
Show file tree
Hide file tree
Showing 3 changed files with 96 additions and 10 deletions.
39 changes: 35 additions & 4 deletions gcc/rust/checks/errors/borrowck/rust-borrow-checker-diagnostics.cc
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,42 @@ BorrowCheckerDiagnostics::report_errors ()
void
BorrowCheckerDiagnostics::report_move_errors ()
{
if (!move_errors.empty ())
for (const auto &pair : move_errors)
{
rust_error_at (hir_function->get_locus (),
"Found move errors in function %s",
hir_function->get_function_name ().as_string ().c_str ());
auto error_location = get_statement (pair.first).get_location ();

// in future, we can use the assigned at location to hint the
// user to implement copy trait for the type
/*
for (auto it : facts.path_assigned_at_base)
{
if (pair.second[0] == it.first)
{
auto point_assigned_at = it.second;
auto assigned_at_location
= get_statement (point_assigned_at).get_location ();
}
}
*/

std::vector<LabelLocationPair> labels{
{"moved value used here", error_location}};
// add labels to all the moves for the given path
for (auto it : facts.path_moved_at_base)
{
if (pair.second[0] == it.first)
{
auto point_moved_at = it.second;
// don't label the move location where the error occured
if (pair.first != point_moved_at)
{
auto move_at_location
= get_statement (point_moved_at).get_location ();
labels.push_back ({"value moved here", move_at_location});
}
}
}
multi_label_error ("use of moved value", error_location, labels);
}
}

Expand Down
22 changes: 19 additions & 3 deletions gcc/testsuite/rust/borrowck/test_move.rs
Original file line number Diff line number Diff line change
@@ -1,11 +1,27 @@
// { dg-additional-options "-frust-compile-until=compilation -frust-borrowcheck" }
fn test_move() { // { dg-error "Found move errors in function test_move" }
// { dg-additional-options "-frust-compile-until=compilation -frust-borrowcheck -fdiagnostics-show-caret -fdiagnostics-show-line-numbers" }
// { dg-enable-nn-line-numbers "" }

fn test_move() {
struct A {
i: i32,
}
let a = A { i: 1 };
let b = a;
let c = a;
let c = a; //~ ERROR
// { dg-error "use of moved value" "" { target *-*-* } .-1 }
/*
{ dg-begin-multiline-output "" }
NN | let b = a;
| ~
| |
| value moved here
NN | let c = a; //~ ERROR
| ^
| |
| moved value used here
{ dg-end-multiline-output "" }
*/

}

fn test_move_fixed() {
Expand Down
45 changes: 42 additions & 3 deletions gcc/testsuite/rust/borrowck/test_move_conditional.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
// { dg-additional-options "-frust-compile-until=compilation -frust-borrowcheck" }
// { dg-additional-options "-frust-compile-until=compilation -frust-borrowcheck -fdiagnostics-show-caret -fdiagnostics-show-line-numbers" }
// { dg-enable-nn-line-numbers "" }

fn test_move_conditional(b1: bool, b2:bool) { // { dg-error "Found move errors in function test_move" }
fn test_move_conditional(b1: bool, b2:bool) {
struct A {
i: i32,
}
Expand All @@ -9,9 +10,47 @@ fn test_move_conditional(b1: bool, b2:bool) { // { dg-error "Found move errors i
let b = a;
if b1 {
let b = a;
// { dg-error "use of moved value" "" { target *-*-* } .-1 }
/*
{ dg-begin-multiline-output "" }
NN | let b = a;
| ~
| |
| value moved here
NN | if b1 {
NN | let b = a;
| ~
| |
| value moved here
......
NN | let c = a;
| ^
| |
| moved value used here
{ dg-end-multiline-output "" }
*/
}
if b2 {
let c = a;
// { dg-error "use of moved value" "" { target *-*-* } .-1 }
/*
{ dg-begin-multiline-output "" }
NN | let b = a;
| ~
| |
| value moved here
NN | if b1 {
NN | let b = a;
| ^
| |
| moved value used here
......
NN | let c = a;
| ~
| |
| value moved here
{ dg-end-multiline-output "" }
*/
}
}

Expand All @@ -25,4 +64,4 @@ fn test_move_fixed(b1: bool, b2:bool) {
if b2 {
let c = a;
}
}
}

0 comments on commit e61d37a

Please sign in to comment.