diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2022-09-08 00:08:07 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-09-08 00:08:07 +0000 |
commit | f03760b98ba4160f08ade309daf22fedaf1cc2dd (patch) | |
tree | 9ddcf544de1b049b32b7511d6f18c01a12ceaa8d | |
parent | 8c6b017310ec3b4f77500d5fa8311e995d655c1a (diff) | |
parent | 6839ad40eebf982f149452cc294ab387350abcef (diff) | |
download | gcc-f03760b98ba4160f08ade309daf22fedaf1cc2dd.zip gcc-f03760b98ba4160f08ade309daf22fedaf1cc2dd.tar.gz gcc-f03760b98ba4160f08ade309daf22fedaf1cc2dd.tar.bz2 |
Merge #1526
1526: backend: correctly formulate the exit condition r=philberty a=liushuyu
- backend: correctly formulate the exit condition. Previously the exit condition was treated the same as the loop condition (which is the inverse condition of the exit condition). Now, this is corrected.
Should fix #1523
Co-authored-by: liushuyu <liushuyu011@gmail.com>
-rw-r--r-- | gcc/rust/backend/rust-compile-expr.cc | 5 | ||||
-rw-r--r-- | gcc/testsuite/rust/execute/torture/loop-condition-eval.rs | 21 |
2 files changed, 25 insertions, 1 deletions
diff --git a/gcc/rust/backend/rust-compile-expr.cc b/gcc/rust/backend/rust-compile-expr.cc index e13c08c..660ad09 100644 --- a/gcc/rust/backend/rust-compile-expr.cc +++ b/gcc/rust/backend/rust-compile-expr.cc @@ -727,8 +727,11 @@ CompileExpr::visit (HIR::WhileLoopExpr &expr) tree condition = CompileExpr::Compile (expr.get_predicate_expr ().get (), ctx); + tree exit_condition + = fold_build1_loc (expr.get_locus ().gcc_location (), TRUTH_NOT_EXPR, + boolean_type_node, condition); tree exit_expr - = ctx->get_backend ()->exit_expression (condition, expr.get_locus ()); + = ctx->get_backend ()->exit_expression (exit_condition, expr.get_locus ()); ctx->add_statement (exit_expr); tree code_block_stmt diff --git a/gcc/testsuite/rust/execute/torture/loop-condition-eval.rs b/gcc/testsuite/rust/execute/torture/loop-condition-eval.rs new file mode 100644 index 0000000..0089659 --- /dev/null +++ b/gcc/testsuite/rust/execute/torture/loop-condition-eval.rs @@ -0,0 +1,21 @@ +// { dg-output "1\n" } +pub fn test() -> u64 { + let mut n = 113383; // #20 in https://oeis.org/A006884 + while n != 1 { + n = if n % 2 == 0 { n / 2 } else { 3 * n + 1 }; + } + n +} + +pub fn test_1() -> u64 { + test() +} + +extern "C" { + fn printf(fmt: *const i8, ...); +} + +fn main() -> i32 { + unsafe { printf("%lu\n" as *const str as *const i8, test_1()) } + 0 +} |