@@ -46,11 +46,15 @@ UnifyRules::Resolve (TyTy::TyWithLocation lhs, TyTy::TyWithLocation rhs,
46
46
commits, infers);
47
47
48
48
TyTy::BaseType *result = r.go ();
49
+ bool failed = result->get_kind () == TyTy::TypeKind::ERROR;
50
+
49
51
commits.emplace_back (lhs.get_ty (), rhs.get_ty (), result);
50
- if (r.commit_flag )
51
- UnifyRules::commit (lhs.get_ty (), rhs.get_ty (), result);
52
+ if (r.commit_flag && !failed)
53
+ {
54
+ result = result->clone ();
55
+ UnifyRules::commit (lhs.get_ty (), rhs.get_ty (), result);
56
+ }
52
57
53
- bool failed = result->get_kind () == TyTy::TypeKind::ERROR;
54
58
if (failed && r.emit_error )
55
59
r.emit_type_mismatch ();
56
60
@@ -353,7 +357,7 @@ UnifyRules::expect_inference_variable (TyTy::InferType *ltype,
353
357
switch (ltype->get_infer_kind ())
354
358
{
355
359
case TyTy::InferType::InferTypeKind::GENERAL:
356
- return rtype-> clone () ;
360
+ return rtype;
357
361
358
362
case TyTy::InferType::InferTypeKind::INTEGRAL:
359
363
{
@@ -436,7 +440,7 @@ UnifyRules::expect_inference_variable (TyTy::InferType *ltype,
436
440
bool is_valid = (ltype->get_infer_kind ()
437
441
== TyTy::InferType::InferTypeKind::GENERAL);
438
442
if (is_valid)
439
- return rtype-> clone () ;
443
+ return rtype;
440
444
}
441
445
break ;
442
446
@@ -458,7 +462,7 @@ UnifyRules::expect_adt (TyTy::ADTType *ltype, TyTy::BaseType *rtype)
458
462
bool is_valid
459
463
= r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
460
464
if (is_valid)
461
- return ltype-> clone () ;
465
+ return ltype;
462
466
}
463
467
break ;
464
468
@@ -575,12 +579,12 @@ UnifyRules::expect_str (TyTy::StrType *ltype, TyTy::BaseType *rtype)
575
579
bool is_valid
576
580
= r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
577
581
if (is_valid)
578
- return ltype-> clone () ;
582
+ return ltype;
579
583
}
580
584
break ;
581
585
582
586
case TyTy::STR:
583
- return rtype-> clone () ;
587
+ return rtype;
584
588
585
589
case TyTy::ADT:
586
590
case TyTy::REF:
@@ -622,7 +626,7 @@ UnifyRules::expect_reference (TyTy::ReferenceType *ltype, TyTy::BaseType *rtype)
622
626
bool is_valid
623
627
= r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
624
628
if (is_valid)
625
- return ltype-> clone () ;
629
+ return ltype;
626
630
}
627
631
break ;
628
632
@@ -694,7 +698,7 @@ UnifyRules::expect_pointer (TyTy::PointerType *ltype, TyTy::BaseType *rtype)
694
698
bool is_valid
695
699
= r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
696
700
if (is_valid)
697
- return ltype-> clone () ;
701
+ return ltype;
698
702
}
699
703
break ;
700
704
@@ -766,7 +770,7 @@ UnifyRules::expect_param (TyTy::ParamType *ltype, TyTy::BaseType *rtype)
766
770
bool is_valid
767
771
= r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
768
772
if (is_valid)
769
- return ltype-> clone () ;
773
+ return ltype;
770
774
}
771
775
break ;
772
776
@@ -831,7 +835,7 @@ UnifyRules::expect_array (TyTy::ArrayType *ltype, TyTy::BaseType *rtype)
831
835
bool is_valid
832
836
= r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
833
837
if (is_valid)
834
- return ltype-> clone () ;
838
+ return ltype;
835
839
}
836
840
break ;
837
841
@@ -904,7 +908,7 @@ UnifyRules::expect_slice (TyTy::SliceType *ltype, TyTy::BaseType *rtype)
904
908
bool is_valid
905
909
= r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
906
910
if (is_valid)
907
- return ltype-> clone () ;
911
+ return ltype;
908
912
}
909
913
break ;
910
914
@@ -965,7 +969,7 @@ UnifyRules::expect_fndef (TyTy::FnType *ltype, TyTy::BaseType *rtype)
965
969
bool is_valid
966
970
= r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
967
971
if (is_valid)
968
- return ltype-> clone () ;
972
+ return ltype;
969
973
}
970
974
break ;
971
975
@@ -1011,7 +1015,7 @@ UnifyRules::expect_fndef (TyTy::FnType *ltype, TyTy::BaseType *rtype)
1011
1015
1012
1016
// DEF Id match? see https://github.com/Rust-GCC/gccrs/issues/2053
1013
1017
1014
- return ltype-> clone () ;
1018
+ return ltype;
1015
1019
}
1016
1020
break ;
1017
1021
@@ -1055,7 +1059,7 @@ UnifyRules::expect_fnptr (TyTy::FnPtr *ltype, TyTy::BaseType *rtype)
1055
1059
bool is_valid
1056
1060
= r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
1057
1061
if (is_valid)
1058
- return ltype-> clone () ;
1062
+ return ltype;
1059
1063
}
1060
1064
break ;
1061
1065
@@ -1088,7 +1092,7 @@ UnifyRules::expect_fnptr (TyTy::FnPtr *ltype, TyTy::BaseType *rtype)
1088
1092
return new TyTy::ErrorType (0 );
1089
1093
}
1090
1094
1091
- return ltype-> clone () ;
1095
+ return ltype;
1092
1096
}
1093
1097
break ;
1094
1098
@@ -1125,7 +1129,7 @@ UnifyRules::expect_fnptr (TyTy::FnPtr *ltype, TyTy::BaseType *rtype)
1125
1129
}
1126
1130
}
1127
1131
1128
- return ltype-> clone () ;
1132
+ return ltype;
1129
1133
}
1130
1134
break ;
1131
1135
@@ -1162,7 +1166,7 @@ UnifyRules::expect_fnptr (TyTy::FnPtr *ltype, TyTy::BaseType *rtype)
1162
1166
}
1163
1167
}
1164
1168
1165
- return ltype-> clone () ;
1169
+ return ltype;
1166
1170
}
1167
1171
break ;
1168
1172
@@ -1204,7 +1208,7 @@ UnifyRules::expect_tuple (TyTy::TupleType *ltype, TyTy::BaseType *rtype)
1204
1208
bool is_valid
1205
1209
= r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
1206
1210
if (is_valid)
1207
- return ltype-> clone () ;
1211
+ return ltype;
1208
1212
}
1209
1213
break ;
1210
1214
@@ -1279,13 +1283,13 @@ UnifyRules::expect_bool (TyTy::BoolType *ltype, TyTy::BaseType *rtype)
1279
1283
{
1280
1284
if (commit_flag)
1281
1285
r->apply_primitive_type_hint (*ltype);
1282
- return ltype-> clone () ;
1286
+ return ltype;
1283
1287
}
1284
1288
}
1285
1289
break ;
1286
1290
1287
1291
case TyTy::BOOL:
1288
- return rtype-> clone () ;
1292
+ return rtype;
1289
1293
1290
1294
case TyTy::CHAR:
1291
1295
case TyTy::INT:
@@ -1330,13 +1334,13 @@ UnifyRules::expect_char (TyTy::CharType *ltype, TyTy::BaseType *rtype)
1330
1334
{
1331
1335
if (commit_flag)
1332
1336
r->apply_primitive_type_hint (*ltype);
1333
- return ltype-> clone () ;
1337
+ return ltype;
1334
1338
}
1335
1339
}
1336
1340
break ;
1337
1341
1338
1342
case TyTy::CHAR:
1339
- return rtype-> clone () ;
1343
+ return rtype;
1340
1344
1341
1345
case TyTy::INT:
1342
1346
case TyTy::FLOAT:
@@ -1382,7 +1386,7 @@ UnifyRules::expect_int (TyTy::IntType *ltype, TyTy::BaseType *rtype)
1382
1386
{
1383
1387
if (commit_flag)
1384
1388
r->apply_primitive_type_hint (*ltype);
1385
- return ltype-> clone () ;
1389
+ return ltype;
1386
1390
}
1387
1391
}
1388
1392
break ;
@@ -1441,7 +1445,7 @@ UnifyRules::expect_uint (TyTy::UintType *ltype, TyTy::BaseType *rtype)
1441
1445
{
1442
1446
if (commit_flag)
1443
1447
r->apply_primitive_type_hint (*ltype);
1444
- return ltype-> clone () ;
1448
+ return ltype;
1445
1449
}
1446
1450
}
1447
1451
break ;
@@ -1500,7 +1504,7 @@ UnifyRules::expect_float (TyTy::FloatType *ltype, TyTy::BaseType *rtype)
1500
1504
{
1501
1505
if (commit_flag)
1502
1506
r->apply_primitive_type_hint (*ltype);
1503
- return ltype-> clone () ;
1507
+ return ltype;
1504
1508
}
1505
1509
}
1506
1510
break ;
@@ -1558,13 +1562,13 @@ UnifyRules::expect_isize (TyTy::ISizeType *ltype, TyTy::BaseType *rtype)
1558
1562
{
1559
1563
if (commit_flag)
1560
1564
r->apply_primitive_type_hint (*ltype);
1561
- return ltype-> clone () ;
1565
+ return ltype;
1562
1566
}
1563
1567
}
1564
1568
break ;
1565
1569
1566
1570
case TyTy::ISIZE:
1567
- return rtype-> clone () ;
1571
+ return rtype;
1568
1572
1569
1573
case TyTy::ADT:
1570
1574
case TyTy::STR:
@@ -1609,13 +1613,13 @@ UnifyRules::expect_usize (TyTy::USizeType *ltype, TyTy::BaseType *rtype)
1609
1613
{
1610
1614
if (commit_flag)
1611
1615
r->apply_primitive_type_hint (*ltype);
1612
- return ltype-> clone () ;
1616
+ return ltype;
1613
1617
}
1614
1618
}
1615
1619
break ;
1616
1620
1617
1621
case TyTy::USIZE:
1618
- return rtype-> clone () ;
1622
+ return rtype;
1619
1623
1620
1624
case TyTy::ADT:
1621
1625
case TyTy::STR:
@@ -1657,12 +1661,12 @@ UnifyRules::expect_never (TyTy::NeverType *ltype, TyTy::BaseType *rtype)
1657
1661
bool is_valid
1658
1662
= r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
1659
1663
if (is_valid)
1660
- return ltype-> clone () ;
1664
+ return ltype;
1661
1665
}
1662
1666
break ;
1663
1667
1664
1668
default :
1665
- return rtype-> clone () ;
1669
+ return rtype;
1666
1670
}
1667
1671
return new TyTy::ErrorType (0 );
1668
1672
}
@@ -1679,12 +1683,12 @@ UnifyRules::expect_placeholder (TyTy::PlaceholderType *ltype,
1679
1683
bool is_valid
1680
1684
= r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
1681
1685
if (is_valid)
1682
- return ltype-> clone () ;
1686
+ return ltype;
1683
1687
}
1684
1688
break ;
1685
1689
1686
1690
case TyTy::PLACEHOLDER:
1687
- return ltype-> clone () ;
1691
+ return ltype;
1688
1692
1689
1693
case TyTy::PROJECTION:
1690
1694
case TyTy::DYNAMIC:
@@ -1709,7 +1713,7 @@ UnifyRules::expect_placeholder (TyTy::PlaceholderType *ltype,
1709
1713
case TyTy::NEVER:
1710
1714
case TyTy::OPAQUE:
1711
1715
if (infer_flag)
1712
- return rtype-> clone () ;
1716
+ return rtype;
1713
1717
gcc_fallthrough ();
1714
1718
1715
1719
case TyTy::CONST:
@@ -1731,7 +1735,7 @@ UnifyRules::expect_projection (TyTy::ProjectionType *ltype,
1731
1735
bool is_valid
1732
1736
= r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
1733
1737
if (is_valid)
1734
- return ltype-> clone () ;
1738
+ return ltype;
1735
1739
}
1736
1740
break ;
1737
1741
@@ -1780,7 +1784,7 @@ UnifyRules::expect_dyn (TyTy::DynamicObjectType *ltype, TyTy::BaseType *rtype)
1780
1784
bool is_valid
1781
1785
= r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
1782
1786
if (is_valid)
1783
- return ltype-> clone () ;
1787
+ return ltype;
1784
1788
}
1785
1789
break ;
1786
1790
@@ -1798,7 +1802,7 @@ UnifyRules::expect_dyn (TyTy::DynamicObjectType *ltype, TyTy::BaseType *rtype)
1798
1802
return new TyTy::ErrorType (0 );
1799
1803
}
1800
1804
1801
- return ltype-> clone () ;
1805
+ return ltype;
1802
1806
}
1803
1807
break ;
1804
1808
@@ -1842,7 +1846,7 @@ UnifyRules::expect_closure (TyTy::ClosureType *ltype, TyTy::BaseType *rtype)
1842
1846
bool is_valid
1843
1847
= r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
1844
1848
if (is_valid)
1845
- return ltype-> clone () ;
1849
+ return ltype;
1846
1850
}
1847
1851
break ;
1848
1852
@@ -1870,7 +1874,7 @@ UnifyRules::expect_closure (TyTy::ClosureType *ltype, TyTy::BaseType *rtype)
1870
1874
return new TyTy::ErrorType (0 );
1871
1875
}
1872
1876
1873
- return ltype-> clone () ;
1877
+ return ltype;
1874
1878
}
1875
1879
break ;
1876
1880
0 commit comments