diff options
author | Owen Avery <powerboat9.gamer@gmail.com> | 2023-08-23 22:49:30 -0400 |
---|---|---|
committer | Philip Herron <philip.herron@embecosm.com> | 2023-09-01 10:46:58 +0000 |
commit | acb4810bf06ac0e38cd9ede14f7eef4c3ebeb92a (patch) | |
tree | 51593f5f6217c1bec12ccb7c553659840025a9f4 | |
parent | b3933cc6ea4b51c2ac2b85f7ea461851dad8aee5 (diff) | |
download | gcc-acb4810bf06ac0e38cd9ede14f7eef4c3ebeb92a.zip gcc-acb4810bf06ac0e38cd9ede14f7eef4c3ebeb92a.tar.gz gcc-acb4810bf06ac0e38cd9ede14f7eef4c3ebeb92a.tar.bz2 |
Fix invalid call to vector::front in TypeBoundPredicate constructors
gcc/rust/ChangeLog:
* typecheck/rust-hir-type-check-expr.cc
(TypeCheckExpr::resolve_fn_trait_call): Add TODO comment.
* typecheck/rust-tyty-bounds.cc
(TypeBoundPredicate::TypeBoundPredicate):
Add assertions, new error constructor.
(TypeBoundPredicate::error): Use new error constructor.
* typecheck/rust-tyty.h
(struct TypeBoundPredicate::mark_is_error): New.
(TypeBoundPredicate::TypeBoundPredicate):
Add new error constructor.
Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
-rw-r--r-- | gcc/rust/typecheck/rust-hir-type-check-expr.cc | 1 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-tyty-bounds.cc | 15 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-tyty.h | 6 |
3 files changed, 18 insertions, 4 deletions
diff --git a/gcc/rust/typecheck/rust-hir-type-check-expr.cc b/gcc/rust/typecheck/rust-hir-type-check-expr.cc index 1ce54c4..8df1fdf 100644 --- a/gcc/rust/typecheck/rust-hir-type-check-expr.cc +++ b/gcc/rust/typecheck/rust-hir-type-check-expr.cc @@ -1826,6 +1826,7 @@ TypeCheckExpr::resolve_fn_trait_call (HIR::CallExpr &expr, TyTy::BaseType **result) { // we turn this into a method call expr + // TODO: add implicit self argument (?) auto associated_predicate = TyTy::TypeBoundPredicate::error (); HIR::PathIdentSegment method_name = resolve_possible_fn_trait_call_method_name (*receiver_tyty, diff --git a/gcc/rust/typecheck/rust-tyty-bounds.cc b/gcc/rust/typecheck/rust-tyty-bounds.cc index 791740d..cc92689d 100644 --- a/gcc/rust/typecheck/rust-tyty-bounds.cc +++ b/gcc/rust/typecheck/rust-tyty-bounds.cc @@ -310,6 +310,8 @@ TypeBoundPredicate::TypeBoundPredicate ( reference (trait_reference.get_mappings ().get_defid ()), locus (locus), error_flag (false), polarity (polarity) { + rust_assert (!trait_reference.get_trait_substs ().empty ()); + substitutions.clear (); for (const auto &p : trait_reference.get_trait_substs ()) substitutions.push_back (p.clone ()); @@ -326,6 +328,8 @@ TypeBoundPredicate::TypeBoundPredicate ( reference (reference), locus (locus), error_flag (false), polarity (polarity) { + rust_assert (!subst.empty ()); + substitutions.clear (); for (const auto &p : subst) substitutions.push_back (p.clone ()); @@ -335,6 +339,12 @@ TypeBoundPredicate::TypeBoundPredicate ( used_arguments.get_mappings ().push_back (placeholder_self); } +TypeBoundPredicate::TypeBoundPredicate (mark_is_error) + : SubstitutionRef ({}, SubstitutionArgumentMappings::empty ()), + reference (UNKNOWN_DEFID), locus (UNDEF_LOCATION), error_flag (true), + polarity (BoundPolarity::RegularBound) +{} + TypeBoundPredicate::TypeBoundPredicate (const TypeBoundPredicate &other) : SubstitutionRef ({}, SubstitutionArgumentMappings::empty ()), reference (other.reference), locus (other.locus), @@ -413,10 +423,7 @@ TypeBoundPredicate::operator= (const TypeBoundPredicate &other) TypeBoundPredicate TypeBoundPredicate::error () { - auto p = TypeBoundPredicate (UNKNOWN_DEFID, {}, BoundPolarity::RegularBound, - UNDEF_LOCATION); - p.error_flag = true; - return p; + return TypeBoundPredicate (mark_is_error ()); } std::string diff --git a/gcc/rust/typecheck/rust-tyty.h b/gcc/rust/typecheck/rust-tyty.h index e7831f8..6795a79 100644 --- a/gcc/rust/typecheck/rust-tyty.h +++ b/gcc/rust/typecheck/rust-tyty.h @@ -450,6 +450,12 @@ public: bool is_equal (const TypeBoundPredicate &other) const; private: + struct mark_is_error + { + }; + + TypeBoundPredicate (mark_is_error); + DefId reference; location_t locus; bool error_flag; |