]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: Fix SEGV when type path resolver fails outright
authorPhilip Herron <herron.philip@googlemail.com>
Fri, 28 Mar 2025 18:59:33 +0000 (18:59 +0000)
committerArthur Cohen <arthur.cohen@embecosm.com>
Mon, 31 Mar 2025 19:07:27 +0000 (21:07 +0200)
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>
gcc/rust/typecheck/rust-hir-type-check-type.cc
gcc/testsuite/rust/compile/issue-3613.rs [new file with mode: 0644]

index e56fa397e2aff60f605fef82d1a94031924492b0..54f50ec41f18942d857594bc3b7bb60767fb0b58 100644 (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;
        }
 
diff --git a/gcc/testsuite/rust/compile/issue-3613.rs b/gcc/testsuite/rust/compile/issue-3613.rs
new file mode 100644 (file)
index 0000000..f2e1092
--- /dev/null
@@ -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() {}