aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAntonio Gomes <antoniospg100@gmail.com>2024-07-14 01:45:24 -0300
committerP-E-P <32375388+P-E-P@users.noreply.github.com>2024-07-17 11:41:19 +0000
commit5f001bab74ab079b03694191aaf342edf1c18b86 (patch)
treeaa54fe5c5540fcb267f997f51ef591612ebe19c9 /gcc
parentc1ba8985c6599a8cde5c9462e38515f29e54f69e (diff)
downloadgcc-5f001bab74ab079b03694191aaf342edf1c18b86.zip
gcc-5f001bab74ab079b03694191aaf342edf1c18b86.tar.gz
gcc-5f001bab74ab079b03694191aaf342edf1c18b86.tar.bz2
Improve error messages for operator expressions
gcc/rust/ChangeLog: * hir/tree/rust-hir-expr.h: Add new get_operator_str method in ArithmeticOrLogicalExpr and CompoundAssignmentExpr * hir/tree/rust-hir.cc: Likewise * typecheck/rust-hir-type-check-expr.cc: Improve error message for operator expressions to display the correct operator symbol gcc/testsuite/ChangeLog: * rust/compile/shadow1.rs: Fix test for new error message Signed-off-by: Antonio Gomes <antoniospg100@gmail.com>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/hir/tree/rust-hir-expr.h4
-rw-r--r--gcc/rust/hir/tree/rust-hir.cc19
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-expr.cc6
-rw-r--r--gcc/testsuite/rust/compile/shadow1.rs2
4 files changed, 25 insertions, 6 deletions
diff --git a/gcc/rust/hir/tree/rust-hir-expr.h b/gcc/rust/hir/tree/rust-hir-expr.h
index 9851cb1..7f4255d 100644
--- a/gcc/rust/hir/tree/rust-hir-expr.h
+++ b/gcc/rust/hir/tree/rust-hir-expr.h
@@ -417,6 +417,8 @@ public:
std::unique_ptr<Expr> &get_lhs () { return main_or_left_expr; }
std::unique_ptr<Expr> &get_rhs () { return right_expr; }
+ std::string get_operator_str () const;
+
protected:
/* Use covariance to implement clone function as returning this object rather
* than base */
@@ -766,6 +768,8 @@ public:
void visit_lhs (HIRFullVisitor &vis) { main_or_left_expr->accept_vis (vis); }
void visit_rhs (HIRFullVisitor &vis) { right_expr->accept_vis (vis); }
+ std::string get_operator_str () const;
+
protected:
/* Use covariance to implement clone function as returning this object rather
* than base */
diff --git a/gcc/rust/hir/tree/rust-hir.cc b/gcc/rust/hir/tree/rust-hir.cc
index b3de930..80878fe 100644
--- a/gcc/rust/hir/tree/rust-hir.cc
+++ b/gcc/rust/hir/tree/rust-hir.cc
@@ -1299,7 +1299,7 @@ AssignmentExpr::as_string () const
}
std::string
-CompoundAssignmentExpr::as_string () const
+CompoundAssignmentExpr::get_operator_str () const
{
std::string operator_str;
operator_str.reserve (1);
@@ -1344,7 +1344,14 @@ CompoundAssignmentExpr::as_string () const
operator_str += "=";
+ return operator_str;
+}
+
+std::string
+CompoundAssignmentExpr::as_string () const
+{
std::string str ("CompoundAssignmentExpr: ");
+ std::string operator_str = get_operator_str ();
if (main_or_left_expr == nullptr || right_expr == nullptr)
{
str += "error. this is probably a parsing failure.";
@@ -1574,7 +1581,7 @@ ErrorPropagationExpr::as_string () const
}
std::string
-ArithmeticOrLogicalExpr::as_string () const
+ArithmeticOrLogicalExpr::get_operator_str () const
{
std::string operator_str;
operator_str.reserve (1);
@@ -1617,8 +1624,14 @@ ArithmeticOrLogicalExpr::as_string () const
break;
}
+ return operator_str;
+}
+
+std::string
+ArithmeticOrLogicalExpr::as_string () const
+{
std::string str = main_or_left_expr->as_string () + " ";
- str += operator_str + " ";
+ str += get_operator_str () + " ";
str += right_expr->as_string ();
return "( " + str + " (" + get_mappings ().as_string () + "))";
diff --git a/gcc/rust/typecheck/rust-hir-type-check-expr.cc b/gcc/rust/typecheck/rust-hir-type-check-expr.cc
index 8485f9c..d4517f3 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-expr.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-expr.cc
@@ -272,7 +272,8 @@ TypeCheckExpr::visit (HIR::CompoundAssignmentExpr &expr)
if (!valid)
{
rust_error_at (expr.get_locus (),
- "cannot apply this operator to types %s and %s",
+ "cannot apply operator %qs to types %s and %s",
+ expr.get_operator_str ().c_str (),
lhs->as_string ().c_str (), rhs->as_string ().c_str ());
return;
}
@@ -303,7 +304,8 @@ TypeCheckExpr::visit (HIR::ArithmeticOrLogicalExpr &expr)
if (!valid)
{
rust_error_at (expr.get_locus (),
- "cannot apply this operator to types %s and %s",
+ "cannot apply operator %qs to types %s and %s",
+ expr.get_operator_str ().c_str (),
lhs->as_string ().c_str (), rhs->as_string ().c_str ());
return;
}
diff --git a/gcc/testsuite/rust/compile/shadow1.rs b/gcc/testsuite/rust/compile/shadow1.rs
index cef972a..43d2764 100644
--- a/gcc/testsuite/rust/compile/shadow1.rs
+++ b/gcc/testsuite/rust/compile/shadow1.rs
@@ -2,5 +2,5 @@ fn main() {
let mut x = 5;
let mut x;
x = true;
- x = x + 2; // { dg-error "cannot apply this operator to types bool and <integer>" }
+ x = x + 2; // { dg-error "cannot apply operator .+. to types bool and <integer>" }
}