https://gcc.gnu.org/g:765121736dfe3f5b319bbe9837880deda326394e

commit 765121736dfe3f5b319bbe9837880deda326394e
Author: Philip Herron <herron.phi...@googlemail.com>
Date:   Fri Mar 28 18:59:33 2025 +0000

    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.phi...@googlemail.com>

Diff:
---
 gcc/rust/typecheck/rust-hir-type-check-type.cc |  7 +++++++
 gcc/testsuite/rust/compile/issue-3613.rs       | 18 ++++++++++++++++++
 2 files changed, 25 insertions(+)

diff --git a/gcc/rust/typecheck/rust-hir-type-check-type.cc 
b/gcc/rust/typecheck/rust-hir-type-check-type.cc
index 5668838c79f3..630abb0d90e0 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-type.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-type.cc
@@ -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;
        }
 
diff --git a/gcc/testsuite/rust/compile/issue-3613.rs 
b/gcc/testsuite/rust/compile/issue-3613.rs
new file mode 100644
index 000000000000..f2e10921f671
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-3613.rs
@@ -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() {}

Reply via email to