Skip to content

Commit 4559d8c

Browse files
committed
gccrs: simplify cloning of types during unify
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 <[email protected]>
1 parent f912f91 commit 4559d8c

File tree

1 file changed

+45
-41
lines changed

1 file changed

+45
-41
lines changed

gcc/rust/typecheck/rust-unify.cc

Lines changed: 45 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,15 @@ UnifyRules::Resolve (TyTy::TyWithLocation lhs, TyTy::TyWithLocation rhs,
4646
commits, infers);
4747

4848
TyTy::BaseType *result = r.go ();
49+
bool failed = result->get_kind () == TyTy::TypeKind::ERROR;
50+
4951
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+
}
5257

53-
bool failed = result->get_kind () == TyTy::TypeKind::ERROR;
5458
if (failed && r.emit_error)
5559
r.emit_type_mismatch ();
5660

@@ -353,7 +357,7 @@ UnifyRules::expect_inference_variable (TyTy::InferType *ltype,
353357
switch (ltype->get_infer_kind ())
354358
{
355359
case TyTy::InferType::InferTypeKind::GENERAL:
356-
return rtype->clone ();
360+
return rtype;
357361

358362
case TyTy::InferType::InferTypeKind::INTEGRAL:
359363
{
@@ -436,7 +440,7 @@ UnifyRules::expect_inference_variable (TyTy::InferType *ltype,
436440
bool is_valid = (ltype->get_infer_kind ()
437441
== TyTy::InferType::InferTypeKind::GENERAL);
438442
if (is_valid)
439-
return rtype->clone ();
443+
return rtype;
440444
}
441445
break;
442446

@@ -458,7 +462,7 @@ UnifyRules::expect_adt (TyTy::ADTType *ltype, TyTy::BaseType *rtype)
458462
bool is_valid
459463
= r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
460464
if (is_valid)
461-
return ltype->clone ();
465+
return ltype;
462466
}
463467
break;
464468

@@ -575,12 +579,12 @@ UnifyRules::expect_str (TyTy::StrType *ltype, TyTy::BaseType *rtype)
575579
bool is_valid
576580
= r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
577581
if (is_valid)
578-
return ltype->clone ();
582+
return ltype;
579583
}
580584
break;
581585

582586
case TyTy::STR:
583-
return rtype->clone ();
587+
return rtype;
584588

585589
case TyTy::ADT:
586590
case TyTy::REF:
@@ -622,7 +626,7 @@ UnifyRules::expect_reference (TyTy::ReferenceType *ltype, TyTy::BaseType *rtype)
622626
bool is_valid
623627
= r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
624628
if (is_valid)
625-
return ltype->clone ();
629+
return ltype;
626630
}
627631
break;
628632

@@ -694,7 +698,7 @@ UnifyRules::expect_pointer (TyTy::PointerType *ltype, TyTy::BaseType *rtype)
694698
bool is_valid
695699
= r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
696700
if (is_valid)
697-
return ltype->clone ();
701+
return ltype;
698702
}
699703
break;
700704

@@ -766,7 +770,7 @@ UnifyRules::expect_param (TyTy::ParamType *ltype, TyTy::BaseType *rtype)
766770
bool is_valid
767771
= r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
768772
if (is_valid)
769-
return ltype->clone ();
773+
return ltype;
770774
}
771775
break;
772776

@@ -831,7 +835,7 @@ UnifyRules::expect_array (TyTy::ArrayType *ltype, TyTy::BaseType *rtype)
831835
bool is_valid
832836
= r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
833837
if (is_valid)
834-
return ltype->clone ();
838+
return ltype;
835839
}
836840
break;
837841

@@ -904,7 +908,7 @@ UnifyRules::expect_slice (TyTy::SliceType *ltype, TyTy::BaseType *rtype)
904908
bool is_valid
905909
= r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
906910
if (is_valid)
907-
return ltype->clone ();
911+
return ltype;
908912
}
909913
break;
910914

@@ -965,7 +969,7 @@ UnifyRules::expect_fndef (TyTy::FnType *ltype, TyTy::BaseType *rtype)
965969
bool is_valid
966970
= r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
967971
if (is_valid)
968-
return ltype->clone ();
972+
return ltype;
969973
}
970974
break;
971975

@@ -1011,7 +1015,7 @@ UnifyRules::expect_fndef (TyTy::FnType *ltype, TyTy::BaseType *rtype)
10111015

10121016
// DEF Id match? see https://github.com/Rust-GCC/gccrs/issues/2053
10131017

1014-
return ltype->clone ();
1018+
return ltype;
10151019
}
10161020
break;
10171021

@@ -1055,7 +1059,7 @@ UnifyRules::expect_fnptr (TyTy::FnPtr *ltype, TyTy::BaseType *rtype)
10551059
bool is_valid
10561060
= r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
10571061
if (is_valid)
1058-
return ltype->clone ();
1062+
return ltype;
10591063
}
10601064
break;
10611065

@@ -1088,7 +1092,7 @@ UnifyRules::expect_fnptr (TyTy::FnPtr *ltype, TyTy::BaseType *rtype)
10881092
return new TyTy::ErrorType (0);
10891093
}
10901094

1091-
return ltype->clone ();
1095+
return ltype;
10921096
}
10931097
break;
10941098

@@ -1125,7 +1129,7 @@ UnifyRules::expect_fnptr (TyTy::FnPtr *ltype, TyTy::BaseType *rtype)
11251129
}
11261130
}
11271131

1128-
return ltype->clone ();
1132+
return ltype;
11291133
}
11301134
break;
11311135

@@ -1162,7 +1166,7 @@ UnifyRules::expect_fnptr (TyTy::FnPtr *ltype, TyTy::BaseType *rtype)
11621166
}
11631167
}
11641168

1165-
return ltype->clone ();
1169+
return ltype;
11661170
}
11671171
break;
11681172

@@ -1204,7 +1208,7 @@ UnifyRules::expect_tuple (TyTy::TupleType *ltype, TyTy::BaseType *rtype)
12041208
bool is_valid
12051209
= r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
12061210
if (is_valid)
1207-
return ltype->clone ();
1211+
return ltype;
12081212
}
12091213
break;
12101214

@@ -1279,13 +1283,13 @@ UnifyRules::expect_bool (TyTy::BoolType *ltype, TyTy::BaseType *rtype)
12791283
{
12801284
if (commit_flag)
12811285
r->apply_primitive_type_hint (*ltype);
1282-
return ltype->clone ();
1286+
return ltype;
12831287
}
12841288
}
12851289
break;
12861290

12871291
case TyTy::BOOL:
1288-
return rtype->clone ();
1292+
return rtype;
12891293

12901294
case TyTy::CHAR:
12911295
case TyTy::INT:
@@ -1330,13 +1334,13 @@ UnifyRules::expect_char (TyTy::CharType *ltype, TyTy::BaseType *rtype)
13301334
{
13311335
if (commit_flag)
13321336
r->apply_primitive_type_hint (*ltype);
1333-
return ltype->clone ();
1337+
return ltype;
13341338
}
13351339
}
13361340
break;
13371341

13381342
case TyTy::CHAR:
1339-
return rtype->clone ();
1343+
return rtype;
13401344

13411345
case TyTy::INT:
13421346
case TyTy::FLOAT:
@@ -1382,7 +1386,7 @@ UnifyRules::expect_int (TyTy::IntType *ltype, TyTy::BaseType *rtype)
13821386
{
13831387
if (commit_flag)
13841388
r->apply_primitive_type_hint (*ltype);
1385-
return ltype->clone ();
1389+
return ltype;
13861390
}
13871391
}
13881392
break;
@@ -1441,7 +1445,7 @@ UnifyRules::expect_uint (TyTy::UintType *ltype, TyTy::BaseType *rtype)
14411445
{
14421446
if (commit_flag)
14431447
r->apply_primitive_type_hint (*ltype);
1444-
return ltype->clone ();
1448+
return ltype;
14451449
}
14461450
}
14471451
break;
@@ -1500,7 +1504,7 @@ UnifyRules::expect_float (TyTy::FloatType *ltype, TyTy::BaseType *rtype)
15001504
{
15011505
if (commit_flag)
15021506
r->apply_primitive_type_hint (*ltype);
1503-
return ltype->clone ();
1507+
return ltype;
15041508
}
15051509
}
15061510
break;
@@ -1558,13 +1562,13 @@ UnifyRules::expect_isize (TyTy::ISizeType *ltype, TyTy::BaseType *rtype)
15581562
{
15591563
if (commit_flag)
15601564
r->apply_primitive_type_hint (*ltype);
1561-
return ltype->clone ();
1565+
return ltype;
15621566
}
15631567
}
15641568
break;
15651569

15661570
case TyTy::ISIZE:
1567-
return rtype->clone ();
1571+
return rtype;
15681572

15691573
case TyTy::ADT:
15701574
case TyTy::STR:
@@ -1609,13 +1613,13 @@ UnifyRules::expect_usize (TyTy::USizeType *ltype, TyTy::BaseType *rtype)
16091613
{
16101614
if (commit_flag)
16111615
r->apply_primitive_type_hint (*ltype);
1612-
return ltype->clone ();
1616+
return ltype;
16131617
}
16141618
}
16151619
break;
16161620

16171621
case TyTy::USIZE:
1618-
return rtype->clone ();
1622+
return rtype;
16191623

16201624
case TyTy::ADT:
16211625
case TyTy::STR:
@@ -1657,12 +1661,12 @@ UnifyRules::expect_never (TyTy::NeverType *ltype, TyTy::BaseType *rtype)
16571661
bool is_valid
16581662
= r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
16591663
if (is_valid)
1660-
return ltype->clone ();
1664+
return ltype;
16611665
}
16621666
break;
16631667

16641668
default:
1665-
return rtype->clone ();
1669+
return rtype;
16661670
}
16671671
return new TyTy::ErrorType (0);
16681672
}
@@ -1679,12 +1683,12 @@ UnifyRules::expect_placeholder (TyTy::PlaceholderType *ltype,
16791683
bool is_valid
16801684
= r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
16811685
if (is_valid)
1682-
return ltype->clone ();
1686+
return ltype;
16831687
}
16841688
break;
16851689

16861690
case TyTy::PLACEHOLDER:
1687-
return ltype->clone ();
1691+
return ltype;
16881692

16891693
case TyTy::PROJECTION:
16901694
case TyTy::DYNAMIC:
@@ -1709,7 +1713,7 @@ UnifyRules::expect_placeholder (TyTy::PlaceholderType *ltype,
17091713
case TyTy::NEVER:
17101714
case TyTy::OPAQUE:
17111715
if (infer_flag)
1712-
return rtype->clone ();
1716+
return rtype;
17131717
gcc_fallthrough ();
17141718

17151719
case TyTy::CONST:
@@ -1731,7 +1735,7 @@ UnifyRules::expect_projection (TyTy::ProjectionType *ltype,
17311735
bool is_valid
17321736
= r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
17331737
if (is_valid)
1734-
return ltype->clone ();
1738+
return ltype;
17351739
}
17361740
break;
17371741

@@ -1780,7 +1784,7 @@ UnifyRules::expect_dyn (TyTy::DynamicObjectType *ltype, TyTy::BaseType *rtype)
17801784
bool is_valid
17811785
= r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
17821786
if (is_valid)
1783-
return ltype->clone ();
1787+
return ltype;
17841788
}
17851789
break;
17861790

@@ -1798,7 +1802,7 @@ UnifyRules::expect_dyn (TyTy::DynamicObjectType *ltype, TyTy::BaseType *rtype)
17981802
return new TyTy::ErrorType (0);
17991803
}
18001804

1801-
return ltype->clone ();
1805+
return ltype;
18021806
}
18031807
break;
18041808

@@ -1842,7 +1846,7 @@ UnifyRules::expect_closure (TyTy::ClosureType *ltype, TyTy::BaseType *rtype)
18421846
bool is_valid
18431847
= r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
18441848
if (is_valid)
1845-
return ltype->clone ();
1849+
return ltype;
18461850
}
18471851
break;
18481852

@@ -1870,7 +1874,7 @@ UnifyRules::expect_closure (TyTy::ClosureType *ltype, TyTy::BaseType *rtype)
18701874
return new TyTy::ErrorType (0);
18711875
}
18721876

1873-
return ltype->clone ();
1877+
return ltype;
18741878
}
18751879
break;
18761880

0 commit comments

Comments
 (0)