Hi,
On Mon, Aug 16, 2021 at 11:03:19PM +0200, Mark Wielaard wrote:
> Now having replicated it locally the rust.log shows:
>
> /srv/gccrs/gccrs/gcc/testsuite/rust/compile/torture/ifunaryexpr.rs: In
> function 'main':
> /srv/gccrs/gccrs/gcc/testsuite/rust/compile/torture/ifunaryexpr.rs:8:5:
> error: mismatching comparison operand types
> const i32
> bool
> if (n != 0) goto <D.205>; else goto <D.206>;
> /srv/gccrs/gccrs/gcc/testsuite/rust/compile/torture/ifunaryexpr.rs:8:5:
> internal compiler error: 'verify
> _gimple' failed
> 0xf38fbd verify_gimple_in_seq(gimple*)
> ../../gccrs/gcc/tree-cfg.c:5157
> 0xc72346 gimplify_body(tree_node*, bool)
> ../../gccrs/gcc/gimplify.c:15401
> 0xc724cd gimplify_function_tree(tree_node*)
> ../../gccrs/gcc/gimplify.c:15472
> 0xab0dc7 cgraph_node::analyze()
> ../../gccrs/gcc/cgraphunit.c:670
> 0xab38b7 analyze_functions
> ../../gccrs/gcc/cgraphunit.c:1236
> 0xab454d symbol_table::finalize_compilation_unit()
> ../../gccrs/gcc/cgraphunit.c:2514
>
> So, my patch created bad gimple. I'll try to track it down.
I figured it out. There was another bug in the ComparisonExpr type
checker the result is a bool type but the argument types only need to
have compatible types, they don't have to be bools.
Fixed patch attached. Also on
https://code.wildebeest.org/git/user/mjw/gccrs/commit/?h=bools_eq
Cheers,
Mark
>From 5b229ddbf41c9e74fcce930c26101c1d34a5c9d1 Mon Sep 17 00:00:00 2001
From: Mark Wielaard <m...@klomp.org>
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
--
Gcc-rust mailing list
Gcc-rust@gcc.gnu.org
https://gcc.gnu.org/mailman/listinfo/gcc-rust