diff options
author | Mark Wielaard <mark@klomp.org> | 2021-08-14 23:38:11 +0200 |
---|---|---|
committer | Mark Wielaard <mark@klomp.org> | 2021-08-16 23:30:49 +0200 |
commit | 5b229ddbf41c9e74fcce930c26101c1d34a5c9d1 (patch) | |
tree | 43d75121ca9c9b69b3baf9ca04271d39b73e3b0b | |
parent | 52c1cdc9c63baeb090680daf6762c02362f2c6cd (diff) | |
download | gcc-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.h | 6 | ||||
-rw-r--r-- | gcc/testsuite/rust/compile/torture/bools_eq.rs | 18 |
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 (); } } +} |