]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: [gccrs#3141] Remove double negation by returning CompileExpr::Compile early
authorJoanVC <github-91yu@joanvc.cat>
Sun, 15 Sep 2024 13:59:34 +0000 (15:59 +0200)
committerArthur Cohen <arthur.cohen@embecosm.com>
Wed, 19 Mar 2025 14:32:10 +0000 (15:32 +0100)
Fixes gccrs#3141.

gcc/rust/ChangeLog:

* backend/rust-compile-expr.cc

Signed-off-by: Joan Vilardaga <github-91yu@joanvc.cat>
gcc/rust/backend/rust-compile-expr.cc

index 0c0d993acdedf09db86596573dc98c40865dfd69..6458c42d78d1b19417a0584d74caf8f6156af1b2 100644 (file)
@@ -237,6 +237,8 @@ CompileExpr::visit (HIR::NegationExpr &expr)
   auto op = expr.get_expr_type ();
 
   const auto literal_expr = expr.get_expr ().get ();
+
+  // If it's a negated integer/float literal, we can return early
   if (op == NegationOperator::NEGATE
       && literal_expr->get_expression_type () == HIR::Expr::ExprType::Lit)
     {
@@ -246,10 +248,12 @@ CompileExpr::visit (HIR::NegationExpr &expr)
          || lit_type == HIR::Literal::LitType::FLOAT)
        {
          new_literal_expr->set_negative ();
+         translated = CompileExpr::Compile (literal_expr, ctx);
+         return;
        }
     }
-  auto negated_expr = CompileExpr::Compile (literal_expr, ctx);
 
+  auto negated_expr = CompileExpr::Compile (literal_expr, ctx);
   auto location = expr.get_locus ();
 
   // this might be an operator overload situation lets check
@@ -1531,11 +1535,6 @@ CompileExpr::compile_integer_literal (const HIR::LiteralExpr &expr,
                     tyty->get_name ().c_str ());
       return error_mark_node;
     }
-  // Other tests break if we don't reverse the negation
-  if (expr.is_negative ())
-    {
-      mpz_neg (ival, ival);
-    }
 
   tree result = wide_int_to_tree (type, wi::from_mpz (type, ival, true));