From: lishin <[email protected]>
gcc/rust/ChangeLog:
* typecheck/rust-tyty-util.cc (TyVar::TyVar): Add null check to avoid
ICE.
(TyVar::get_tyty): Return nullptr when lookup fails.
(TyVar::clone): Handle null base type safely.
(TyVar::monomorphized_clone): Add fallback for error types.
gcc/testsuite/ChangeLog:
* rust/compile/issue-3556.rs: New test.
Signed-off-by: lishin <[email protected]>
---
gcc/rust/typecheck/rust-tyty-util.cc | 15 ++++++++++++---
gcc/testsuite/rust/compile/issue-3556.rs | 4 ++++
2 files changed, 16 insertions(+), 3 deletions(-)
create mode 100644 gcc/testsuite/rust/compile/issue-3556.rs
diff --git a/gcc/rust/typecheck/rust-tyty-util.cc
b/gcc/rust/typecheck/rust-tyty-util.cc
index c6c740b2cba..72761d9842b 100644
--- a/gcc/rust/typecheck/rust-tyty-util.cc
+++ b/gcc/rust/typecheck/rust-tyty-util.cc
@@ -30,7 +30,8 @@ TyVar::TyVar (HirId ref) : ref (ref)
auto context = Resolver::TypeCheckContext::get ();
BaseType *lookup = nullptr;
bool ok = context->lookup_type (ref, &lookup);
- rust_assert (ok);
+ if (!ok || lookup == nullptr || lookup->get_kind () == TypeKind::ERROR)
+ return;
}
BaseType *
@@ -39,7 +40,8 @@ TyVar::get_tyty () const
auto context = Resolver::TypeCheckContext::get ();
BaseType *lookup = nullptr;
bool ok = context->lookup_type (ref, &lookup);
- rust_assert (ok);
+ if (!ok || lookup == nullptr)
+ return nullptr;
return lookup;
}
@@ -95,7 +97,10 @@ TyVar::subst_covariant_var (TyTy::BaseType *orig,
TyTy::BaseType *subst)
TyVar
TyVar::clone () const
{
- TyTy::BaseType *c = get_tyty ()->clone ();
+ TyTy::BaseType *base = get_tyty ();
+ if (base == nullptr || base->get_kind () == TypeKind::ERROR)
+ return TyVar::get_implicit_infer_var (UNKNOWN_LOCATION);
+ TyTy::BaseType *c = base->clone ();
return TyVar (c->get_ref ());
}
@@ -105,6 +110,10 @@ TyVar::monomorphized_clone () const
auto &mappings = Analysis::Mappings::get ();
auto context = Resolver::TypeCheckContext::get ();
+ TyTy::BaseType *base = get_tyty ();
+ if (base == nullptr || base->get_kind () == TypeKind::ERROR)
+ return TyVar::get_implicit_infer_var (UNKNOWN_LOCATION);
+
// this needs a new hirid
TyTy::BaseType *c = get_tyty ()->monomorphized_clone ();
c->set_ref (mappings.get_next_hir_id ());
diff --git a/gcc/testsuite/rust/compile/issue-3556.rs
b/gcc/testsuite/rust/compile/issue-3556.rs
new file mode 100644
index 00000000000..be7d85a93b5
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-3556.rs
@@ -0,0 +1,4 @@
+fn main() {
+ let ref mut a @ (ref mut b,);
+ // { dg-error "expected T\\?, found tuple" "" { target *-*-* } .-1 }
+}
\ No newline at end of file
--
2.50.1