https://gcc.gnu.org/g:8c357fd0072a29b24e10a8a1fe287f86f8c9b553

commit 8c357fd0072a29b24e10a8a1fe287f86f8c9b553
Author: Muhammad Mahad <mahad...@gmail.com>
Date:   Fri Jul 19 13:42:03 2024 +0000

    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 <mahad...@gmail.com>

Diff:
---
 gcc/rust/typecheck/rust-hir-type-check-type.cc        | 12 +++++++++++-
 gcc/testsuite/rust/compile/unknown-associated-item.rs | 10 ++++++++++
 2 files changed, 21 insertions(+), 1 deletion(-)

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() -> <Self as Hello>::You;
+        // { dg-error "cannot find associated type .You. in trait .Hello. 
.E0576." "" { target *-*-* } .-1 }
+        // { dg-error "failed to resolve return type" "" { target *-*-* } .-2 }
+    }
+}

Reply via email to