]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: Only infer when no generic arguments have been specified
authorPhilip Herron <herron.philip@googlemail.com>
Mon, 13 Mar 2023 17:02:56 +0000 (17:02 +0000)
committerArthur Cohen <arthur.cohen@embecosm.com>
Tue, 16 Jan 2024 17:21:12 +0000 (18:21 +0100)
On Paths such as: mem::size_of<T>() we always specified to infer the
generics which is not always the case and can cause stay inference
variables.

gcc/rust/ChangeLog:

* typecheck/rust-hir-type-check-path.cc (TypeCheckExpr::visit): remove infer call
(TypeCheckExpr::resolve_root_path): only infer when we need to

gcc/testsuite/ChangeLog:

* rust/compile/sizeof-stray-infer-var-bug.rs: New test.

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
gcc/rust/typecheck/rust-hir-type-check-path.cc
gcc/testsuite/rust/compile/sizeof-stray-infer-var-bug.rs [new file with mode: 0644]

index c56c1dc8d3de2502de3504f09148d45ee2a399d8..c496cbf84bdbdaef05bfee6a56278fe23bf64526 100644 (file)
@@ -151,11 +151,6 @@ TypeCheckExpr::visit (HIR::PathInExpression &expr)
   if (tyseg->get_kind () == TyTy::TypeKind::ERROR)
     return;
 
-  if (tyseg->needs_generic_substitutions ())
-    {
-      tyseg = SubstMapper::InferSubst (tyseg, expr.get_locus ());
-    }
-
   bool fully_resolved = offset == expr.get_segments ().size ();
   if (fully_resolved)
     {
@@ -285,6 +280,10 @@ 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 ())
+       {
+         lookup = SubstMapper::InferSubst (lookup, expr.get_locus ());
+       }
 
       *root_resolved_node_id = ref_node_id;
       *offset = *offset + 1;
diff --git a/gcc/testsuite/rust/compile/sizeof-stray-infer-var-bug.rs b/gcc/testsuite/rust/compile/sizeof-stray-infer-var-bug.rs
new file mode 100644 (file)
index 0000000..310da66
--- /dev/null
@@ -0,0 +1,14 @@
+mod mem {
+    extern "rust-intrinsic" {
+        pub fn size_of<T>() -> usize;
+    }
+}
+
+mod ptr {
+
+    pub unsafe fn swap_nonoverlapping<T>(x: *mut T, y: *mut T, count: usize) {
+        let x = x as *mut T;
+        let y = y as *mut T;
+        let len = mem::size_of::<T>() * count;
+    }
+}