gccrs: Fix SEGV when type path resolver fails outright

When we resolve paths we resolve to Types first we walk each segment to
the last module which has no type but then in the event that the child
of a module is not found we have a null root_tyty which needs to be caught
and turned into an ErrorType node.

Fixes Rust-GCC#3613

gcc/rust/ChangeLog:

	* typecheck/rust-hir-type-check-type.cc (TypeCheckType::resolve_root_path):
	catch nullptr root_tyty

gcc/testsuite/ChangeLog:

	* rust/compile/issue-3613.rs: New test.

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
This commit is contained in:
Philip Herron 2025-03-28 18:59:33 +00:00 committed by Arthur Cohen
parent 2d8f37c9a5
commit c5d96fd527
2 changed files with 25 additions and 0 deletions

View file

@ -360,6 +360,13 @@ TypeCheckType::resolve_root_path (HIR::TypePath &path, size_t *offset,
seg->as_string ().c_str ());
return new TyTy::ErrorType (path.get_mappings ().get_hirid ());
}
else if (root_tyty == nullptr)
{
rust_error_at (seg->get_locus (),
"unknown reference for resolved name: %qs",
seg->as_string ().c_str ());
return new TyTy::ErrorType (path.get_mappings ().get_hirid ());
}
return root_tyty;
}

View file

@ -0,0 +1,18 @@
mod m1 {
pub enum Baz4 {
foo1,
foo2,
}
}
fn bar(x: m1::foo) {
// { dg-error "unknown reference for resolved name: .foo." "" { target *-*-* } .-1 }
match x {
m1::foo::foo1 => {}
// { dg-error "failed to type resolve root segment" "" { target *-*-* } .-1 }
m1::NodePosition::foo2 => {}
// { dg-error "failed to type resolve root segment" "" { target *-*-* } .-1 }
}
}
pub fn main() {}