diff options
author | Antonio Gomes <antoniospg100@gmail.com> | 2024-07-14 01:45:24 -0300 |
---|---|---|
committer | P-E-P <32375388+P-E-P@users.noreply.github.com> | 2024-07-17 11:41:19 +0000 |
commit | 5f001bab74ab079b03694191aaf342edf1c18b86 (patch) | |
tree | aa54fe5c5540fcb267f997f51ef591612ebe19c9 /gcc | |
parent | c1ba8985c6599a8cde5c9462e38515f29e54f69e (diff) | |
download | gcc-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.h | 4 | ||||
-rw-r--r-- | gcc/rust/hir/tree/rust-hir.cc | 19 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-hir-type-check-expr.cc | 6 | ||||
-rw-r--r-- | gcc/testsuite/rust/compile/shadow1.rs | 2 |
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>" } } |