aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Wielaard <mark@klomp.org>2021-08-14 23:38:11 +0200
committerMark Wielaard <mark@klomp.org>2021-08-16 23:30:49 +0200
commit5b229ddbf41c9e74fcce930c26101c1d34a5c9d1 (patch)
tree43d75121ca9c9b69b3baf9ca04271d39b73e3b0b
parent52c1cdc9c63baeb090680daf6762c02362f2c6cd (diff)
downloadgcc-5b229ddbf41c9e74fcce930c26101c1d34a5c9d1.zip
gcc-5b229ddbf41c9e74fcce930c26101c1d34a5c9d1.tar.gz
gcc-5b229ddbf41c9e74fcce930c26101c1d34a5c9d1.tar.bz2
Use builtin bool instead of creating new bool types for ComparisonExpr
The TypeCheckExpr creates a new TyTy::BoolType for a ComparisonExpr. This new BoolType is unknown to TyTyResolveCompile which causes a crash when trying to compile the inferred new BoolType. Resolve this by looking up the builtin bool type. The new "bools_eq.rs" testcase uses several bools which show this issue. Also the lhs and rhs types need to be compatible, but don't need to be bool type themselves. So don't append the reference to the inferred type. The existing "ifunaryexpr.rs" testcase will fail without this fix.
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-expr.h6
-rw-r--r--gcc/testsuite/rust/compile/torture/bools_eq.rs18
2 files changed, 20 insertions, 4 deletions
diff --git a/gcc/rust/typecheck/rust-hir-type-check-expr.h b/gcc/rust/typecheck/rust-hir-type-check-expr.h
index d88cb0b..a833822 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-expr.h
+++ b/gcc/rust/typecheck/rust-hir-type-check-expr.h
@@ -630,10 +630,8 @@ public:
if (result == nullptr || result->get_kind () == TyTy::TypeKind::ERROR)
return;
- // we expect this to be
- infered = new TyTy::BoolType (expr.get_mappings ().get_hirid ());
- infered->append_reference (lhs->get_ref ());
- infered->append_reference (rhs->get_ref ());
+ bool ok = context->lookup_builtin ("bool", &infered);
+ rust_assert (ok);
}
void visit (HIR::LazyBooleanExpr &expr) override
diff --git a/gcc/testsuite/rust/compile/torture/bools_eq.rs b/gcc/testsuite/rust/compile/torture/bools_eq.rs
new file mode 100644
index 0000000..965127b
--- /dev/null
+++ b/gcc/testsuite/rust/compile/torture/bools_eq.rs
@@ -0,0 +1,18 @@
+extern "C"
+{
+ fn abort ();
+}
+
+fn beq (a: bool, b: bool) -> bool
+{
+ let bools_eq = a == b;
+ bools_eq
+}
+
+pub fn main ()
+{
+ let a = true;
+ let b = false;
+ let r = beq (a, b);
+ if r { unsafe { abort (); } }
+}