Skip to content

Commit 5fa6efc

Browse files
committed
TyTy: Store region constraints
gcc/rust/ChangeLog: * typecheck/rust-hir-type-check-implitem.cc (TypeCheckTopLevelExternItem::visit): Add region constraints. (TypeCheckImplItem::visit): Add region constraints. * typecheck/rust-hir-type-check-implitem.h: Add region constraints. * typecheck/rust-hir-type-check-item.cc (TypeCheckItem::ResolveImplBlockSelf): Add region constraints. (TypeCheckItem::visit): Add region constraints. (TypeCheckItem::resolve_impl_item): Add region constraints. (TypeCheckItem::resolve_impl_block_substitutions): Add region constraints. * typecheck/rust-hir-type-check-item.h: Add region constraints. * typecheck/rust-hir-type-check-type.cc (ResolveWhereClauseItem::Resolve): Add region constraints. (ResolveWhereClauseItem::visit): Add region constraints. * typecheck/rust-hir-type-check-type.h (class ResolveWhereClauseItem): Add region constraints. * typecheck/rust-hir-type-check.cc (TraitItemReference::get_type_from_fn): Add region constraints. * typecheck/rust-tyty-bounds.cc (TypeBoundPredicate::TypeBoundPredicate): Add region constraints. * typecheck/rust-tyty-subst.cc (SubstitutionRef::get_region_constraints): Add region constraints. * typecheck/rust-tyty-subst.h (class BaseType): Add region constraints. (struct RegionConstraints): Add region constraints. * typecheck/rust-tyty.cc (BaseType::monomorphized_clone): Add region constraints. (ADTType::clone): Add region constraints. (FnType::clone): Add region constraints. (ProjectionType::clone): Add region constraints. * typecheck/rust-tyty.h: Add region constraints. Signed-off-by: Jakub Dupak <dev@jakubdupak.com>
1 parent eb43571 commit 5fa6efc

12 files changed

+151
-53
lines changed

gcc/rust/typecheck/rust-hir-type-check-implitem.cc

+20-4
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,16 @@ TypeCheckTopLevelExternItem::visit (HIR::ExternalFunctionItem &function)
9696
}
9797
}
9898

99+
TyTy::RegionConstraints region_constraints;
100+
if (function.has_where_clause ())
101+
{
102+
for (auto &where_clause_item : function.get_where_clause ().get_items ())
103+
{
104+
ResolveWhereClauseItem::Resolve (*where_clause_item.get (),
105+
region_constraints);
106+
}
107+
}
108+
99109
TyTy::BaseType *ret_type = nullptr;
100110
if (!function.has_return_type ())
101111
ret_type
@@ -166,7 +176,8 @@ TypeCheckTopLevelExternItem::visit (HIR::ExternalFunctionItem &function)
166176
function.get_item_name ().as_string (), ident, flags, parent.get_abi (),
167177
std::move (params), ret_type, std::move (substitutions),
168178
TyTy::SubstitutionArgumentMappings::empty (
169-
context->get_lifetime_resolver ().get_num_bound_regions ()));
179+
context->get_lifetime_resolver ().get_num_bound_regions ()),
180+
region_constraints);
170181

171182
context->insert_type (function.get_mappings (), fnType);
172183
resolved = fnType;
@@ -206,9 +217,11 @@ TypeCheckImplItem::visit (HIR::Function &function)
206217
if (function.has_generics ())
207218
resolve_generic_params (function.get_generic_params (), substitutions);
208219

220+
TyTy::RegionConstraints region_constraints;
209221
for (auto &where_clause_item : function.get_where_clause ().get_items ())
210222
{
211-
ResolveWhereClauseItem::Resolve (*where_clause_item.get ());
223+
ResolveWhereClauseItem::Resolve (*where_clause_item.get (),
224+
region_constraints);
212225
}
213226

214227
TyTy::BaseType *ret_type = nullptr;
@@ -334,7 +347,8 @@ TypeCheckImplItem::visit (HIR::Function &function)
334347
: TyTy::FnType::FNTYPE_DEFAULT_FLAGS,
335348
ABI::RUST, std::move (params), ret_type, std::move (substitutions),
336349
TyTy::SubstitutionArgumentMappings::empty (
337-
context->get_lifetime_resolver ().get_num_bound_regions ()));
350+
context->get_lifetime_resolver ().get_num_bound_regions ()),
351+
region_constraints);
338352

339353
context->insert_type (function.get_mappings (), fnType);
340354
result = fnType;
@@ -389,9 +403,11 @@ TypeCheckImplItem::visit (HIR::TypeAlias &alias)
389403

390404
context->insert_type (alias.get_mappings (), actual_type);
391405
result = actual_type;
406+
TyTy::RegionConstraints region_constraints;
392407
for (auto &where_clause_item : alias.get_where_clause ().get_items ())
393408
{
394-
ResolveWhereClauseItem::Resolve (*where_clause_item.get ());
409+
ResolveWhereClauseItem::Resolve (*where_clause_item.get (),
410+
region_constraints);
395411
}
396412
}
397413

gcc/rust/typecheck/rust-hir-type-check-implitem.h

+1
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ class TypeCheckImplItemWithTrait : public TypeCheckBase,
9797
HIR::ImplBlock *parent;
9898
TyTy::BaseType *self;
9999
std::vector<TyTy::SubstitutionParamMapping> substitutions;
100+
TyTy::RegionConstraints region_costraints;
100101
};
101102

102103
} // namespace Resolver

gcc/rust/typecheck/rust-hir-type-check-item.cc

+39-19
Original file line numberDiff line numberDiff line change
@@ -63,12 +63,15 @@ TypeCheckItem::ResolveImplBlockSelf (HIR::ImplBlock &impl_block)
6363
TypeCheckItem resolver;
6464

6565
bool failed_flag = false;
66-
std::vector<TyTy::SubstitutionParamMapping> substitutions
66+
auto result
6767
= resolver.resolve_impl_block_substitutions (impl_block, failed_flag);
6868
if (failed_flag)
6969
{
7070
return new TyTy::ErrorType (impl_block.get_mappings ().get_hirid ());
7171
}
72+
std::vector<TyTy::SubstitutionParamMapping> substitutions
73+
= std::move (result.first);
74+
TyTy::RegionConstraints region_constraints = std::move (result.second);
7275

7376
return resolver.resolve_impl_block_self (impl_block);
7477
}
@@ -81,12 +84,14 @@ TypeCheckItem::ResolveImplBlockSelfWithInference (
8184
TypeCheckItem resolver;
8285

8386
bool failed_flag = false;
84-
std::vector<TyTy::SubstitutionParamMapping> substitutions
85-
= resolver.resolve_impl_block_substitutions (impl, failed_flag);
87+
auto result = resolver.resolve_impl_block_substitutions (impl, failed_flag);
8688
if (failed_flag)
8789
{
8890
return new TyTy::ErrorType (impl.get_mappings ().get_hirid ());
8991
}
92+
std::vector<TyTy::SubstitutionParamMapping> substitutions
93+
= std::move (result.first);
94+
TyTy::RegionConstraints region_constraints = std::move (result.second);
9095

9196
// now that we have the param mappings we need to query the self type
9297
TyTy::BaseType *self = resolver.resolve_impl_block_self (impl);
@@ -140,9 +145,10 @@ TypeCheckItem::visit (HIR::TypeAlias &alias)
140145

141146
context->insert_type (alias.get_mappings (), actual_type);
142147

148+
TyTy::RegionConstraints region_constraints;
143149
for (auto &where_clause_item : alias.get_where_clause ().get_items ())
144150
{
145-
ResolveWhereClauseItem::Resolve (*where_clause_item);
151+
ResolveWhereClauseItem::Resolve (*where_clause_item, region_constraints);
146152
}
147153
infered = actual_type;
148154
}
@@ -156,9 +162,10 @@ TypeCheckItem::visit (HIR::TupleStruct &struct_decl)
156162
if (struct_decl.has_generics ())
157163
resolve_generic_params (struct_decl.get_generic_params (), substitutions);
158164

165+
TyTy::RegionConstraints region_constraints;
159166
for (auto &where_clause_item : struct_decl.get_where_clause ().get_items ())
160167
{
161-
ResolveWhereClauseItem::Resolve (*where_clause_item);
168+
ResolveWhereClauseItem::Resolve (*where_clause_item, region_constraints);
162169
}
163170

164171
std::vector<TyTy::StructFieldType *> fields;
@@ -203,7 +210,8 @@ TypeCheckItem::visit (HIR::TupleStruct &struct_decl)
203210
TyTy::ADTType::ADTKind::TUPLE_STRUCT, std::move (variants),
204211
std::move (substitutions), repr,
205212
TyTy::SubstitutionArgumentMappings::empty (
206-
context->get_lifetime_resolver ().get_num_bound_regions ()));
213+
context->get_lifetime_resolver ().get_num_bound_regions ()),
214+
region_constraints);
207215

208216
context->insert_type (struct_decl.get_mappings (), type);
209217
infered = type;
@@ -218,9 +226,10 @@ TypeCheckItem::visit (HIR::StructStruct &struct_decl)
218226
if (struct_decl.has_generics ())
219227
resolve_generic_params (struct_decl.get_generic_params (), substitutions);
220228

229+
TyTy::RegionConstraints region_constraints;
221230
for (auto &where_clause_item : struct_decl.get_where_clause ().get_items ())
222231
{
223-
ResolveWhereClauseItem::Resolve (*where_clause_item);
232+
ResolveWhereClauseItem::Resolve (*where_clause_item, region_constraints);
224233
}
225234

226235
std::vector<TyTy::StructFieldType *> fields;
@@ -263,7 +272,8 @@ TypeCheckItem::visit (HIR::StructStruct &struct_decl)
263272
TyTy::ADTType::ADTKind::STRUCT_STRUCT, std::move (variants),
264273
std::move (substitutions), repr,
265274
TyTy::SubstitutionArgumentMappings::empty (
266-
context->get_lifetime_resolver ().get_num_bound_regions ()));
275+
context->get_lifetime_resolver ().get_num_bound_regions ()),
276+
region_constraints);
267277

268278
context->insert_type (struct_decl.get_mappings (), type);
269279
infered = type;
@@ -316,9 +326,10 @@ TypeCheckItem::visit (HIR::Union &union_decl)
316326
if (union_decl.has_generics ())
317327
resolve_generic_params (union_decl.get_generic_params (), substitutions);
318328

329+
TyTy::RegionConstraints region_constraints;
319330
for (auto &where_clause_item : union_decl.get_where_clause ().get_items ())
320331
{
321-
ResolveWhereClauseItem::Resolve (*where_clause_item);
332+
ResolveWhereClauseItem::Resolve (*where_clause_item, region_constraints);
322333
}
323334

324335
std::vector<TyTy::StructFieldType *> fields;
@@ -401,13 +412,15 @@ TypeCheckItem::visit (HIR::ImplBlock &impl_block)
401412
auto binder_pin = context->push_clean_lifetime_resolver (true);
402413

403414
bool failed_flag = false;
404-
std::vector<TyTy::SubstitutionParamMapping> substitutions
405-
= resolve_impl_block_substitutions (impl_block, failed_flag);
415+
auto result = resolve_impl_block_substitutions (impl_block, failed_flag);
406416
if (failed_flag)
407417
{
408418
infered = new TyTy::ErrorType (impl_block.get_mappings ().get_hirid ());
409419
return;
410420
}
421+
std::vector<TyTy::SubstitutionParamMapping> substitutions
422+
= std::move (result.first);
423+
TyTy::RegionConstraints region_constraints = std::move (result.second);
411424

412425
TyTy::BaseType *self = resolve_impl_block_self (impl_block);
413426

@@ -427,13 +440,16 @@ TypeCheckItem::resolve_impl_item (HIR::ImplBlock &impl_block,
427440
HIR::ImplItem &item)
428441
{
429442
bool failed_flag = false;
430-
std::vector<TyTy::SubstitutionParamMapping> substitutions
431-
= resolve_impl_block_substitutions (impl_block, failed_flag);
443+
auto result = resolve_impl_block_substitutions (impl_block, failed_flag);
432444
if (failed_flag)
433445
{
434446
return new TyTy::ErrorType (impl_block.get_mappings ().get_hirid ());
435447
}
436448

449+
std::vector<TyTy::SubstitutionParamMapping> substitutions
450+
= std::move (result.first);
451+
TyTy::RegionConstraints region_constraints = std::move (result.second);
452+
437453
TyTy::BaseType *self = resolve_impl_block_self (impl_block);
438454

439455
return TypeCheckImplItem::Resolve (&impl_block, &item, self, substitutions);
@@ -445,11 +461,13 @@ TypeCheckItem::visit (HIR::Function &function)
445461
auto lifetime_pin = context->push_clean_lifetime_resolver ();
446462
std::vector<TyTy::SubstitutionParamMapping> substitutions;
447463
if (function.has_generics ())
448-
resolve_generic_params (function.get_generic_params (), substitutions);
464+
resolve_generic_params (function.get_generic_params (),
465+
substitutions); // TODO resolve constraints
449466

467+
TyTy::RegionConstraints region_constraints;
450468
for (auto &where_clause_item : function.get_where_clause ().get_items ())
451469
{
452-
ResolveWhereClauseItem::Resolve (*where_clause_item);
470+
ResolveWhereClauseItem::Resolve (*where_clause_item, region_constraints);
453471
}
454472

455473
TyTy::BaseType *ret_type = nullptr;
@@ -498,7 +516,8 @@ TypeCheckItem::visit (HIR::Function &function)
498516
TyTy::FnType::FNTYPE_DEFAULT_FLAGS, ABI::RUST, std::move (params), ret_type,
499517
std::move (substitutions),
500518
TyTy::SubstitutionArgumentMappings::empty (
501-
context->get_lifetime_resolver ().get_num_bound_regions ()));
519+
context->get_lifetime_resolver ().get_num_bound_regions ()),
520+
region_constraints);
502521

503522
context->insert_type (function.get_mappings (), fn_type);
504523

@@ -558,17 +577,18 @@ TypeCheckItem::visit (HIR::ExternBlock &extern_block)
558577
}
559578
}
560579

561-
std::vector<TyTy::SubstitutionParamMapping>
580+
std::pair<std::vector<TyTy::SubstitutionParamMapping>, TyTy::RegionConstraints>
562581
TypeCheckItem::resolve_impl_block_substitutions (HIR::ImplBlock &impl_block,
563582
bool &failure_flag)
564583
{
565584
std::vector<TyTy::SubstitutionParamMapping> substitutions;
566585
if (impl_block.has_generics ())
567586
resolve_generic_params (impl_block.get_generic_params (), substitutions);
568587

588+
TyTy::RegionConstraints region_constraints;
569589
for (auto &where_clause_item : impl_block.get_where_clause ().get_items ())
570590
{
571-
ResolveWhereClauseItem::Resolve (*where_clause_item);
591+
ResolveWhereClauseItem::Resolve (*where_clause_item, region_constraints);
572592
}
573593

574594
auto specified_bound = TyTy::TypeBoundPredicate::error ();
@@ -600,7 +620,7 @@ TypeCheckItem::resolve_impl_block_substitutions (HIR::ImplBlock &impl_block,
600620
failure_flag = check_for_unconstrained (substitutions, trait_constraints,
601621
impl_constraints, self);
602622

603-
return substitutions;
623+
return {substitutions, region_constraints};
604624
}
605625

606626
void

gcc/rust/typecheck/rust-hir-type-check-item.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,8 @@ class TypeCheckItem : private TypeCheckBase, private HIR::HIRVisItemVisitor
5757
void visit (HIR::UseDeclaration &) override {}
5858

5959
protected:
60-
std::vector<TyTy::SubstitutionParamMapping>
60+
std::pair<std::vector<TyTy::SubstitutionParamMapping>,
61+
TyTy::RegionConstraints>
6162
resolve_impl_block_substitutions (HIR::ImplBlock &impl_block,
6263
bool &failure_flag);
6364

gcc/rust/typecheck/rust-hir-type-check-type.cc

+8-3
Original file line numberDiff line numberDiff line change
@@ -889,9 +889,10 @@ TypeResolveGenericParam::visit (HIR::TypeParam &param)
889889
}
890890

891891
void
892-
ResolveWhereClauseItem::Resolve (HIR::WhereClauseItem &item)
892+
ResolveWhereClauseItem::Resolve (HIR::WhereClauseItem &item,
893+
TyTy::RegionConstraints &region_constraints)
893894
{
894-
ResolveWhereClauseItem resolver;
895+
ResolveWhereClauseItem resolver (region_constraints);
895896

896897
auto binder_pin = resolver.context->push_lifetime_binder ();
897898

@@ -922,6 +923,8 @@ ResolveWhereClauseItem::visit (HIR::LifetimeWhereClauseItem &item)
922923
{
923924
rust_error_at (UNKNOWN_LOCATION, "failed to resolve lifetime");
924925
}
926+
region_constraints.region_region.emplace_back (lhs.value (),
927+
rhs_i.value ());
925928
}
926929
}
927930

@@ -958,7 +961,7 @@ ResolveWhereClauseItem::visit (HIR::TypeBoundWhereClauseItem &item)
958961
}
959962
break;
960963
case HIR::TypeParamBound::BoundType::LIFETIME: {
961-
if (binding->is<TyTy::ParamType> ())
964+
if (auto param = binding->try_as<TyTy::ParamType> ())
962965
{
963966
auto *b = static_cast<HIR::Lifetime *> (bound.get ());
964967
auto region = context->lookup_and_resolve_lifetime (*b);
@@ -967,6 +970,8 @@ ResolveWhereClauseItem::visit (HIR::TypeBoundWhereClauseItem &item)
967970
rust_error_at (UNKNOWN_LOCATION,
968971
"failed to resolve lifetime");
969972
}
973+
region_constraints.type_region.emplace_back (param,
974+
region.value ());
970975
}
971976
}
972977
break;

gcc/rust/typecheck/rust-hir-type-check-type.h

+8-2
Original file line numberDiff line numberDiff line change
@@ -115,15 +115,21 @@ class TypeResolveGenericParam : public TypeCheckBase
115115

116116
class ResolveWhereClauseItem : public TypeCheckBase
117117
{
118+
// pair(a, b) => a: b
119+
TyTy::RegionConstraints &region_constraints;
120+
118121
public:
119-
static void Resolve (HIR::WhereClauseItem &item);
122+
static void Resolve (HIR::WhereClauseItem &item,
123+
TyTy::RegionConstraints &region_constraints);
120124

121125
protected:
122126
void visit (HIR::LifetimeWhereClauseItem &item);
123127
void visit (HIR::TypeBoundWhereClauseItem &item);
124128

125129
private:
126-
ResolveWhereClauseItem () : TypeCheckBase () {}
130+
ResolveWhereClauseItem (TyTy::RegionConstraints &region_constraints)
131+
: region_constraints (region_constraints)
132+
{}
127133
};
128134

129135
} // namespace Resolver

gcc/rust/typecheck/rust-hir-type-check.cc

+10-1
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,7 @@ TraitItemReference::get_type_from_fn (/*const*/ HIR::TraitItemFunc &fn) const
189189
std::vector<TyTy::SubstitutionParamMapping> substitutions
190190
= inherited_substitutions;
191191

192+
TyTy::RegionConstraints region_constraints;
192193
HIR::TraitFunctionDecl &function = fn.get_decl ();
193194
if (function.has_generics ())
194195
{
@@ -224,6 +225,13 @@ TraitItemReference::get_type_from_fn (/*const*/ HIR::TraitItemFunc &fn) const
224225
}
225226
}
226227

228+
if (function.has_where_clause ())
229+
{
230+
for (auto &where_clause_item : function.get_where_clause ().get_items ())
231+
ResolveWhereClauseItem::Resolve (*where_clause_item,
232+
region_constraints);
233+
}
234+
227235
TyTy::BaseType *ret_type = nullptr;
228236
if (!function.has_return_type ())
229237
ret_type = TyTy::TupleType::get_unit_type (fn.get_mappings ().get_hirid ());
@@ -336,7 +344,8 @@ TraitItemReference::get_type_from_fn (/*const*/ HIR::TraitItemFunc &fn) const
336344
: TyTy::FnType::FNTYPE_DEFAULT_FLAGS,
337345
ABI::RUST, std::move (params), ret_type, substitutions,
338346
TyTy::SubstitutionArgumentMappings::empty (
339-
context->get_lifetime_resolver ().get_num_bound_regions ()));
347+
context->get_lifetime_resolver ().get_num_bound_regions ()),
348+
region_constraints);
340349
context->insert_type (fn.get_mappings (), resolved);
341350
return resolved;
342351
}

0 commit comments

Comments
 (0)