]> 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)
committerPhilip Herron <philip.herron@embecosm.com>
Fri, 28 Mar 2025 20:04:21 +0000 (20:04 +0000)
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 5668838c79f312e2cdfbcee87fc791e20145458b..630abb0d90e0bac5b8d87f761ca73fe79b665a2c 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() {}