]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: simplify cloning of types during unify
authorPhilip Herron <herron.philip@googlemail.com>
Fri, 29 Aug 2025 16:42:10 +0000 (17:42 +0100)
committerArthur Cohen <arthur.cohen@embecosm.com>
Thu, 30 Oct 2025 19:58:57 +0000 (20:58 +0100)
We should only clone when we commit and it was successful. With no
cloning there is a regression in min specialization 2. Probably because
it needs to know the unify site hirid and ensure we have it set there.

gcc/rust/ChangeLog:

* typecheck/rust-unify.cc (UnifyRules::Resolve): check for success
(UnifyRules::expect_inference_variable): dont clone
(UnifyRules::expect_adt): likewise
(UnifyRules::expect_str): likewise
(UnifyRules::expect_reference): likewise
(UnifyRules::expect_pointer): likewise
(UnifyRules::expect_param): likewise
(UnifyRules::expect_array): likewise
(UnifyRules::expect_slice): likewise
(UnifyRules::expect_fndef): likewise
(UnifyRules::expect_fnptr): likewise
(UnifyRules::expect_tuple): likewise
(UnifyRules::expect_bool): likewise
(UnifyRules::expect_char): likewise
(UnifyRules::expect_int): likewise
(UnifyRules::expect_uint): likewise
(UnifyRules::expect_float): likewise
(UnifyRules::expect_isize): likewise
(UnifyRules::expect_usize): likewise
(UnifyRules::expect_never): likewise
(UnifyRules::expect_placeholder): likewise
(UnifyRules::expect_projection): likewise
(UnifyRules::expect_dyn): likewise
(UnifyRules::expect_closure): likewise

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
gcc/rust/typecheck/rust-unify.cc

index 3a99b2a4f09528f03365d77444639f69602e0d41..a7492ac579c10beb5d6c7cb4a824723ec279605a 100644 (file)
@@ -46,11 +46,15 @@ UnifyRules::Resolve (TyTy::TyWithLocation lhs, TyTy::TyWithLocation rhs,
                commits, infers);
 
   TyTy::BaseType *result = r.go ();
+  bool failed = result->get_kind () == TyTy::TypeKind::ERROR;
+
   commits.emplace_back (lhs.get_ty (), rhs.get_ty (), result);
-  if (r.commit_flag)
-    UnifyRules::commit (lhs.get_ty (), rhs.get_ty (), result);
+  if (r.commit_flag && !failed)
+    {
+      result = result->clone ();
+      UnifyRules::commit (lhs.get_ty (), rhs.get_ty (), result);
+    }
 
-  bool failed = result->get_kind () == TyTy::TypeKind::ERROR;
   if (failed && r.emit_error)
     r.emit_type_mismatch ();
 
@@ -353,7 +357,7 @@ UnifyRules::expect_inference_variable (TyTy::InferType *ltype,
        switch (ltype->get_infer_kind ())
          {
          case TyTy::InferType::InferTypeKind::GENERAL:
-           return rtype->clone ();
+           return rtype;
 
          case TyTy::InferType::InferTypeKind::INTEGRAL:
            {
@@ -436,7 +440,7 @@ UnifyRules::expect_inference_variable (TyTy::InferType *ltype,
        bool is_valid = (ltype->get_infer_kind ()
                         == TyTy::InferType::InferTypeKind::GENERAL);
        if (is_valid)
-         return rtype->clone ();
+         return rtype;
       }
       break;
 
@@ -458,7 +462,7 @@ UnifyRules::expect_adt (TyTy::ADTType *ltype, TyTy::BaseType *rtype)
        bool is_valid
          = r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
        if (is_valid)
-         return ltype->clone ();
+         return ltype;
       }
       break;
 
@@ -575,12 +579,12 @@ UnifyRules::expect_str (TyTy::StrType *ltype, TyTy::BaseType *rtype)
        bool is_valid
          = r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
        if (is_valid)
-         return ltype->clone ();
+         return ltype;
       }
       break;
 
     case TyTy::STR:
-      return rtype->clone ();
+      return rtype;
 
     case TyTy::ADT:
     case TyTy::REF:
@@ -622,7 +626,7 @@ UnifyRules::expect_reference (TyTy::ReferenceType *ltype, TyTy::BaseType *rtype)
        bool is_valid
          = r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
        if (is_valid)
-         return ltype->clone ();
+         return ltype;
       }
       break;
 
@@ -694,7 +698,7 @@ UnifyRules::expect_pointer (TyTy::PointerType *ltype, TyTy::BaseType *rtype)
        bool is_valid
          = r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
        if (is_valid)
-         return ltype->clone ();
+         return ltype;
       }
       break;
 
@@ -766,7 +770,7 @@ UnifyRules::expect_param (TyTy::ParamType *ltype, TyTy::BaseType *rtype)
        bool is_valid
          = r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
        if (is_valid)
-         return ltype->clone ();
+         return ltype;
       }
       break;
 
@@ -831,7 +835,7 @@ UnifyRules::expect_array (TyTy::ArrayType *ltype, TyTy::BaseType *rtype)
        bool is_valid
          = r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
        if (is_valid)
-         return ltype->clone ();
+         return ltype;
       }
       break;
 
@@ -904,7 +908,7 @@ UnifyRules::expect_slice (TyTy::SliceType *ltype, TyTy::BaseType *rtype)
        bool is_valid
          = r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
        if (is_valid)
-         return ltype->clone ();
+         return ltype;
       }
       break;
 
@@ -965,7 +969,7 @@ UnifyRules::expect_fndef (TyTy::FnType *ltype, TyTy::BaseType *rtype)
        bool is_valid
          = r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
        if (is_valid)
-         return ltype->clone ();
+         return ltype;
       }
       break;
 
@@ -1011,7 +1015,7 @@ UnifyRules::expect_fndef (TyTy::FnType *ltype, TyTy::BaseType *rtype)
 
        // DEF Id match? see https://github.com/Rust-GCC/gccrs/issues/2053
 
-       return ltype->clone ();
+       return ltype;
       }
       break;
 
@@ -1055,7 +1059,7 @@ UnifyRules::expect_fnptr (TyTy::FnPtr *ltype, TyTy::BaseType *rtype)
        bool is_valid
          = r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
        if (is_valid)
-         return ltype->clone ();
+         return ltype;
       }
       break;
 
@@ -1088,7 +1092,7 @@ UnifyRules::expect_fnptr (TyTy::FnPtr *ltype, TyTy::BaseType *rtype)
            return new TyTy::ErrorType (0);
          }
 
-       return ltype->clone ();
+       return ltype;
       }
       break;
 
@@ -1125,7 +1129,7 @@ UnifyRules::expect_fnptr (TyTy::FnPtr *ltype, TyTy::BaseType *rtype)
              }
          }
 
-       return ltype->clone ();
+       return ltype;
       }
       break;
 
@@ -1162,7 +1166,7 @@ UnifyRules::expect_fnptr (TyTy::FnPtr *ltype, TyTy::BaseType *rtype)
              }
          }
 
-       return ltype->clone ();
+       return ltype;
       }
       break;
 
@@ -1204,7 +1208,7 @@ UnifyRules::expect_tuple (TyTy::TupleType *ltype, TyTy::BaseType *rtype)
        bool is_valid
          = r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
        if (is_valid)
-         return ltype->clone ();
+         return ltype;
       }
       break;
 
@@ -1279,13 +1283,13 @@ UnifyRules::expect_bool (TyTy::BoolType *ltype, TyTy::BaseType *rtype)
          {
            if (commit_flag)
              r->apply_primitive_type_hint (*ltype);
-           return ltype->clone ();
+           return ltype;
          }
       }
       break;
 
     case TyTy::BOOL:
-      return rtype->clone ();
+      return rtype;
 
     case TyTy::CHAR:
     case TyTy::INT:
@@ -1330,13 +1334,13 @@ UnifyRules::expect_char (TyTy::CharType *ltype, TyTy::BaseType *rtype)
          {
            if (commit_flag)
              r->apply_primitive_type_hint (*ltype);
-           return ltype->clone ();
+           return ltype;
          }
       }
       break;
 
     case TyTy::CHAR:
-      return rtype->clone ();
+      return rtype;
 
     case TyTy::INT:
     case TyTy::FLOAT:
@@ -1382,7 +1386,7 @@ UnifyRules::expect_int (TyTy::IntType *ltype, TyTy::BaseType *rtype)
          {
            if (commit_flag)
              r->apply_primitive_type_hint (*ltype);
-           return ltype->clone ();
+           return ltype;
          }
       }
       break;
@@ -1441,7 +1445,7 @@ UnifyRules::expect_uint (TyTy::UintType *ltype, TyTy::BaseType *rtype)
          {
            if (commit_flag)
              r->apply_primitive_type_hint (*ltype);
-           return ltype->clone ();
+           return ltype;
          }
       }
       break;
@@ -1500,7 +1504,7 @@ UnifyRules::expect_float (TyTy::FloatType *ltype, TyTy::BaseType *rtype)
          {
            if (commit_flag)
              r->apply_primitive_type_hint (*ltype);
-           return ltype->clone ();
+           return ltype;
          }
       }
       break;
@@ -1558,13 +1562,13 @@ UnifyRules::expect_isize (TyTy::ISizeType *ltype, TyTy::BaseType *rtype)
          {
            if (commit_flag)
              r->apply_primitive_type_hint (*ltype);
-           return ltype->clone ();
+           return ltype;
          }
       }
       break;
 
     case TyTy::ISIZE:
-      return rtype->clone ();
+      return rtype;
 
     case TyTy::ADT:
     case TyTy::STR:
@@ -1609,13 +1613,13 @@ UnifyRules::expect_usize (TyTy::USizeType *ltype, TyTy::BaseType *rtype)
          {
            if (commit_flag)
              r->apply_primitive_type_hint (*ltype);
-           return ltype->clone ();
+           return ltype;
          }
       }
       break;
 
     case TyTy::USIZE:
-      return rtype->clone ();
+      return rtype;
 
     case TyTy::ADT:
     case TyTy::STR:
@@ -1657,12 +1661,12 @@ UnifyRules::expect_never (TyTy::NeverType *ltype, TyTy::BaseType *rtype)
        bool is_valid
          = r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
        if (is_valid)
-         return ltype->clone ();
+         return ltype;
       }
       break;
 
     default:
-      return rtype->clone ();
+      return rtype;
     }
   return new TyTy::ErrorType (0);
 }
@@ -1679,12 +1683,12 @@ UnifyRules::expect_placeholder (TyTy::PlaceholderType *ltype,
        bool is_valid
          = r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
        if (is_valid)
-         return ltype->clone ();
+         return ltype;
       }
       break;
 
     case TyTy::PLACEHOLDER:
-      return ltype->clone ();
+      return ltype;
 
     case TyTy::PROJECTION:
     case TyTy::DYNAMIC:
@@ -1709,7 +1713,7 @@ UnifyRules::expect_placeholder (TyTy::PlaceholderType *ltype,
     case TyTy::NEVER:
     case TyTy::OPAQUE:
       if (infer_flag)
-       return rtype->clone ();
+       return rtype;
       gcc_fallthrough ();
 
     case TyTy::CONST:
@@ -1731,7 +1735,7 @@ UnifyRules::expect_projection (TyTy::ProjectionType *ltype,
        bool is_valid
          = r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
        if (is_valid)
-         return ltype->clone ();
+         return ltype;
       }
       break;
 
@@ -1780,7 +1784,7 @@ UnifyRules::expect_dyn (TyTy::DynamicObjectType *ltype, TyTy::BaseType *rtype)
        bool is_valid
          = r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
        if (is_valid)
-         return ltype->clone ();
+         return ltype;
       }
       break;
 
@@ -1798,7 +1802,7 @@ UnifyRules::expect_dyn (TyTy::DynamicObjectType *ltype, TyTy::BaseType *rtype)
            return new TyTy::ErrorType (0);
          }
 
-       return ltype->clone ();
+       return ltype;
       }
       break;
 
@@ -1842,7 +1846,7 @@ UnifyRules::expect_closure (TyTy::ClosureType *ltype, TyTy::BaseType *rtype)
        bool is_valid
          = r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
        if (is_valid)
-         return ltype->clone ();
+         return ltype;
       }
       break;
 
@@ -1870,7 +1874,7 @@ UnifyRules::expect_closure (TyTy::ClosureType *ltype, TyTy::BaseType *rtype)
            return new TyTy::ErrorType (0);
          }
 
-       return ltype->clone ();
+       return ltype;
       }
       break;