From 8c357fd0072a29b24e10a8a1fe287f86f8c9b553 Mon Sep 17 00:00:00 2001 From: Muhammad Mahad Date: Fri, 19 Jul 2024 13:42:03 +0000 Subject: [PATCH] gccrs: [E0576] Associated `item` not found in given `type` gcc/rust/ChangeLog: * typecheck/rust-hir-type-check-type.cc (TypeCheckType::visit): Add rich error message and error code similiar to rustc with associaed type and trait name gcc/testsuite/ChangeLog: * rust/compile/unknown-associated-item.rs: New test. Signed-off-by: Muhammad Mahad --- gcc/rust/typecheck/rust-hir-type-check-type.cc | 12 +++++++++++- .../rust/compile/unknown-associated-item.rs | 10 ++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/rust/compile/unknown-associated-item.rs diff --git a/gcc/rust/typecheck/rust-hir-type-check-type.cc b/gcc/rust/typecheck/rust-hir-type-check-type.cc index 36f64a770e90..b745b529e904 100644 --- a/gcc/rust/typecheck/rust-hir-type-check-type.cc +++ b/gcc/rust/typecheck/rust-hir-type-check-type.cc @@ -220,7 +220,17 @@ TypeCheckType::visit (HIR::QualifiedPathInType &path) = specified_bound.lookup_associated_item (item_seg_identifier.as_string ()); if (item.is_error ()) { - rust_error_at (item_seg->get_locus (), "unknown associated item"); + std::string item_seg_ident_name, rich_msg; + item_seg_ident_name = qual_path_type.get_trait ()->as_string (); + rich_msg = "not found in `" + item_seg_ident_name + "`"; + + rich_location richloc (line_table, item_seg->get_locus ()); + richloc.add_fixit_replace (rich_msg.c_str ()); + + rust_error_at (richloc, ErrorCode::E0576, + "cannot find associated type %qs in trait %qs", + item_seg_identifier.as_string ().c_str (), + item_seg_ident_name.c_str ()); return; } diff --git a/gcc/testsuite/rust/compile/unknown-associated-item.rs b/gcc/testsuite/rust/compile/unknown-associated-item.rs new file mode 100644 index 000000000000..c2920694e1f7 --- /dev/null +++ b/gcc/testsuite/rust/compile/unknown-associated-item.rs @@ -0,0 +1,10 @@ +#![allow(unused)] +fn main() { + trait Hello { + type Who; + + fn hello() -> ::You; + // { dg-error "cannot find associated type .You. in trait .Hello. .E0576." "" { target *-*-* } .-1 } + // { dg-error "failed to resolve return type" "" { target *-*-* } .-2 } + } +}