From: Philip Herron <herron.phi...@googlemail.com>

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>
---
 gcc/rust/typecheck/rust-hir-type-check-type.cc |  7 +++++++
 gcc/testsuite/rust/compile/issue-3613.rs       | 18 ++++++++++++++++++
 2 files changed, 25 insertions(+)
 create mode 100644 gcc/testsuite/rust/compile/issue-3613.rs

diff --git a/gcc/rust/typecheck/rust-hir-type-check-type.cc 
b/gcc/rust/typecheck/rust-hir-type-check-type.cc
index e56fa397e2a..54f50ec41f1 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 00000000000..f2e10921f67
--- /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() {}
-- 
2.49.0

Reply via email to