]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: self paths are patterns but we dont have mappings for it
authorPhilip Herron <herron.philip@googlemail.com>
Thu, 13 Feb 2025 17:45:09 +0000 (17:45 +0000)
committerPhilip Herron <philip.herron@embecosm.com>
Thu, 13 Feb 2025 18:26:59 +0000 (18:26 +0000)
With simple patterns we dont introduce any more inference varaibles as
they are already declared in a specific way. This would only lead to
more unconstrained inference varaibles than is required.

Fixes Rust-GCC#3022

gcc/rust/ChangeLog:

* hir/rust-ast-lower-base.cc (ASTLoweringBase::lower_self): add location mappings
* typecheck/rust-hir-type-check-path.cc (TypeCheckExpr::resolve_root_path): check for self

gcc/testsuite/ChangeLog:

* rust/compile/issue-3022.rs: New test.

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
gcc/rust/hir/rust-ast-lower-base.cc
gcc/rust/typecheck/rust-hir-type-check-path.cc
gcc/testsuite/rust/compile/issue-3022.rs [new file with mode: 0644]

index 229f6e09c8893e44d9e8475b7c3960278b88ac02..02fac9af7e91d99da7339dd3d960d30456a197a1 100644 (file)
@@ -666,6 +666,7 @@ ASTLoweringBase::lower_self (AST::Param &param)
   Analysis::NodeMapping mapping (crate_num, self.get_node_id (),
                                 mappings.get_next_hir_id (crate_num),
                                 mappings.get_next_localdef_id (crate_num));
+  mappings.insert_location (mapping.get_hirid (), param.get_locus ());
 
   if (self.has_type ())
     {
index 73d9738478971b8e9c75a18013f2068d6b8baa68..1904eba0c19469e9651a8cd99c593cbcf07cd065 100644 (file)
@@ -312,6 +312,8 @@ TypeCheckExpr::resolve_root_path (HIR::PathInExpression &expr, size_t *offset,
       auto seg_is_module = mappings.lookup_module (ref).has_value ();
       auto seg_is_crate = mappings.is_local_hirid_crate (ref);
       auto seg_is_pattern = mappings.lookup_hir_pattern (ref).has_value ();
+      auto seg_is_self = is_root && !have_more_segments
+                        && seg.get_segment ().as_string () == "self";
       if (seg_is_module || seg_is_crate)
        {
          // A::B::C::this_is_a_module::D::E::F
@@ -388,7 +390,8 @@ TypeCheckExpr::resolve_root_path (HIR::PathInExpression &expr, size_t *offset,
          if (lookup->get_kind () == TyTy::TypeKind::ERROR)
            return new TyTy::ErrorType (expr.get_mappings ().get_hirid ());
        }
-      else if (lookup->needs_generic_substitutions () && !seg_is_pattern)
+      else if (lookup->needs_generic_substitutions () && !seg_is_pattern
+              && !seg_is_self)
        {
          lookup = SubstMapper::InferSubst (lookup, expr.get_locus ());
        }
diff --git a/gcc/testsuite/rust/compile/issue-3022.rs b/gcc/testsuite/rust/compile/issue-3022.rs
new file mode 100644 (file)
index 0000000..b8b8e6f
--- /dev/null
@@ -0,0 +1,18 @@
+#[lang = "sized"]
+trait Sized {}
+
+trait Foo<T> {
+    fn foo(self) -> T;
+}
+
+struct Bar<T, U> {
+    // { dg-warning "struct is never constructed" "" { target *-*-* } .-1 }
+    value: U,
+    valte: T,
+}
+
+impl<T: Foo<U>, U> Foo<U> for Bar<T, U> {
+    fn foo(self) -> U {
+        self.value
+    }
+}