From 5b229ddbf41c9e74fcce930c26101c1d34a5c9d1 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Sat, 14 Aug 2021 23:38:11 +0200 Subject: [PATCH] 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. --- gcc/rust/typecheck/rust-hir-type-check-expr.h | 6 ++---- gcc/testsuite/rust/compile/torture/bools_eq.rs | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/rust/compile/torture/bools_eq.rs diff --git a/gcc/rust/typecheck/rust-hir-type-check-expr.h b/gcc/rust/typecheck/rust-hir-type-check-expr.h index d88cb0b7f1d..a833822e9b3 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 00000000000..965127b5d54 --- /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 (); } } +} -- 2.32.0