Skip to content

Commit 8be847e

Browse files
committed
refactor: handle the return type of regions_from_generic_args
Handle return value of `regions_from_generic_args` properly everywhere gcc/rust/ChangeLog: * typecheck/rust-hir-type-check-path.cc (TypeCheckExpr::visit): return error for unresolved lifetimes (TypeCheckExpr::resolve_root_path): same as above (TypeCheckExpr::resolve_segments): return without explicit error * typecheck/rust-hir-type-check-type.cc (TypeCheckType::visit): return error for unresolved lifetimes (TypeCheckType::resolve_root_path): same as above * typecheck/rust-tyty-bounds.cc (TypeBoundPredicate::apply_generic_arguments): set error_flag to true for unresolved lifetimes Signed-off-by: vibhatsu <maulikbarot2915@gmail.com>
1 parent 6181199 commit 8be847e

3 files changed

Lines changed: 48 additions & 22 deletions

File tree

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

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -145,12 +145,17 @@ TypeCheckExpr::visit (HIR::QualifiedPathInExpression &expr)
145145
infered = new TyTy::ErrorType (expr.get_mappings ().get_hirid ());
146146
return;
147147
}
148-
std::vector<TyTy::Region> regions;
148+
auto regions
149+
= context->regions_from_generic_args (item_seg.get_generic_args ());
150+
if (!regions.has_value ())
151+
{
152+
infered = new TyTy::ErrorType (expr.get_mappings ().get_hirid ());
153+
return;
154+
}
149155

150156
infered = SubstMapper::Resolve (infered, expr.get_locus (),
151157
&item_seg.get_generic_args (),
152-
context->regions_from_generic_args (
153-
item_seg.get_generic_args ()));
158+
regions.value ());
154159
}
155160

156161
// continue on as a path-in-expression
@@ -366,10 +371,14 @@ TypeCheckExpr::resolve_root_path (HIR::PathInExpression &expr, size_t *offset,
366371
// turbo-fish segment path::<ty>
367372
if (seg.has_generic_args ())
368373
{
369-
lookup = SubstMapper::Resolve (lookup, expr.get_locus (),
370-
&seg.get_generic_args (),
371-
context->regions_from_generic_args (
372-
seg.get_generic_args ()));
374+
auto regions
375+
= context->regions_from_generic_args (seg.get_generic_args ());
376+
if (!regions.has_value ())
377+
return new TyTy::ErrorType (expr.get_mappings ().get_hirid ());
378+
379+
lookup
380+
= SubstMapper::Resolve (lookup, expr.get_locus (),
381+
&seg.get_generic_args (), regions.value ());
373382
if (lookup->get_kind () == TyTy::TypeKind::ERROR)
374383
return new TyTy::ErrorType (expr.get_mappings ().get_hirid ());
375384
}
@@ -526,10 +535,14 @@ TypeCheckExpr::resolve_segments (NodeId root_resolved_node_id,
526535
{
527536
rust_debug_loc (seg.get_locus (), "applying segment generics: %s",
528537
tyseg->as_string ().c_str ());
538+
auto regions
539+
= context->regions_from_generic_args (seg.get_generic_args ());
540+
if (!regions.has_value ())
541+
return;
542+
529543
tyseg
530544
= SubstMapper::Resolve (tyseg, expr_locus, &seg.get_generic_args (),
531-
context->regions_from_generic_args (
532-
seg.get_generic_args ()));
545+
regions.value ());
533546
if (tyseg->get_kind () == TyTy::TypeKind::ERROR)
534547
return;
535548
}

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

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -301,11 +301,17 @@ TypeCheckType::visit (HIR::QualifiedPathInType &path)
301301
= new TyTy::ErrorType (path.get_mappings ().get_hirid ());
302302
return;
303303
}
304-
translated
305-
= SubstMapper::Resolve (translated, path.get_locus (),
306-
&generic_seg.get_generic_args (),
307-
context->regions_from_generic_args (
308-
generic_seg.get_generic_args ()));
304+
auto regions = context->regions_from_generic_args (
305+
generic_seg.get_generic_args ());
306+
if (!regions.has_value ())
307+
{
308+
translated
309+
= new TyTy::ErrorType (path.get_mappings ().get_hirid ());
310+
return;
311+
}
312+
translated = SubstMapper::Resolve (translated, path.get_locus (),
313+
&generic_seg.get_generic_args (),
314+
regions.value ());
309315
}
310316
}
311317

@@ -458,19 +464,22 @@ TypeCheckType::resolve_root_path (HIR::TypePath &path, size_t *offset,
458464

459465
auto regions = context->regions_from_generic_args (
460466
generic_segment.get_generic_args ());
467+
if (!regions.has_value ())
468+
return new TyTy::ErrorType (seg->get_mappings ().get_hirid ());
469+
461470
lookup = SubstMapper::Resolve (lookup, path.get_locus (),
462471
&generic_segment.get_generic_args (),
463-
regions);
472+
regions.value ());
464473
if (lookup->get_kind () == TyTy::TypeKind::ERROR)
465474
return new TyTy::ErrorType (seg->get_mappings ().get_hirid ());
466475
}
467476
else if (lookup->needs_generic_substitutions ())
468477
{
469478
HIR::GenericArgs empty
470479
= HIR::GenericArgs::create_empty (path.get_locus ());
471-
lookup
472-
= SubstMapper::Resolve (lookup, path.get_locus (), &empty,
473-
context->regions_from_generic_args (empty));
480+
lookup = SubstMapper::Resolve (
481+
lookup, path.get_locus (), &empty,
482+
context->regions_from_generic_args (empty).value ());
474483
}
475484

476485
*offset = *offset + 1;

gcc/rust/typecheck/rust-tyty-bounds.cc

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -538,10 +538,14 @@ TypeBoundPredicate::apply_generic_arguments (HIR::GenericArgs *generic_args,
538538
}
539539

540540
// now actually perform a substitution
541-
auto args = get_mappings_from_generic_args (
542-
*generic_args,
543-
Resolver::TypeCheckContext::get ()->regions_from_generic_args (
544-
*generic_args));
541+
auto regions = Resolver::TypeCheckContext::get ()->regions_from_generic_args (
542+
*generic_args);
543+
if (!regions.has_value ())
544+
{
545+
error_flag = true;
546+
return;
547+
}
548+
auto args = get_mappings_from_generic_args (*generic_args, regions.value ());
545549

546550
apply_argument_mappings (args, is_super_trait);
547551
}

0 commit comments

Comments
 (0)