From: Yap Zhi Heng <[email protected]>
GIMPLE output for compile/issue-4242.rs:
...
x = 1;
RUSTTMP.2 = x;
_1 = RUSTTMP.2 >= -55;
_2 = RUSTTMP.2 < 0;
_3 = _1 & _2;
if (_3 != 0) goto <D.112>; else goto <D.113>;
<D.112>:
{
RUSTTMP.1 = 2;
goto <D.105>;
}
<D.113>:
_4 = RUSTTMP.2 >= -99;
_5 = RUSTTMP.2 < -55;
_6 = _4 & _5;
if (_6 != 0) goto <D.114>; else goto <D.115>;
<D.114>:
{
RUSTTMP.1 = 3;
goto <D.105>;
}
...
gcc/rust/ChangeLog:
* backend/rust-compile-pattern.cc (compile_range_pattern_bound): Set
litexpr
to negative if has_minus is present in the RangePatternBoundLiteral
param.
Signed-off-by: Yap Zhi Heng <[email protected]>
---
gcc/rust/backend/rust-compile-pattern.cc | 2 ++
gcc/testsuite/rust/compile/issue-4242.rs | 10 ++++++++++
gcc/testsuite/rust/execute/torture/issue-4242.rs | 11 +++++++++++
3 files changed, 23 insertions(+)
create mode 100644 gcc/testsuite/rust/compile/issue-4242.rs
create mode 100644 gcc/testsuite/rust/execute/torture/issue-4242.rs
diff --git a/gcc/rust/backend/rust-compile-pattern.cc
b/gcc/rust/backend/rust-compile-pattern.cc
index 3a983e9bc88..c29359aebe9 100644
--- a/gcc/rust/backend/rust-compile-pattern.cc
+++ b/gcc/rust/backend/rust-compile-pattern.cc
@@ -121,6 +121,8 @@ compile_range_pattern_bound (HIR::RangePatternBound &bound,
HIR::LiteralExpr litexpr (mappings, ref.get_literal (), locus,
std::vector<AST::Attribute> ());
+ if (ref.get_has_minus())
+ litexpr.set_negative();
result = CompileExpr::Compile (litexpr, ctx);
}
diff --git a/gcc/testsuite/rust/compile/issue-4242.rs
b/gcc/testsuite/rust/compile/issue-4242.rs
new file mode 100644
index 00000000000..ecbe258cec6
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-4242.rs
@@ -0,0 +1,10 @@
+#![feature(exclusive_range_pattern)]
+
+fn main() {
+ let x = 1;
+
+ match x {
+ -55..0 => 2,
+ -99..-55 => 3,
+ };
+}
\ No newline at end of file
diff --git a/gcc/testsuite/rust/execute/torture/issue-4242.rs
b/gcc/testsuite/rust/execute/torture/issue-4242.rs
new file mode 100644
index 00000000000..867adc98e30
--- /dev/null
+++ b/gcc/testsuite/rust/execute/torture/issue-4242.rs
@@ -0,0 +1,11 @@
+#![feature(exclusive_range_pattern)]
+
+fn main() -> i32 {
+ let x = -77;
+
+ match x {
+ -55..99 => 1,
+ -99..-55 => 0, // the correct case
+ _ => 1,
+ }
+}
\ No newline at end of file
--
2.50.1