aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorOwen Avery <powerboat9.gamer@gmail.com>2023-08-23 22:49:30 -0400
committerPhilip Herron <philip.herron@embecosm.com>2023-09-01 10:46:58 +0000
commitacb4810bf06ac0e38cd9ede14f7eef4c3ebeb92a (patch)
tree51593f5f6217c1bec12ccb7c553659840025a9f4 /gcc
parentb3933cc6ea4b51c2ac2b85f7ea461851dad8aee5 (diff)
downloadgcc-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>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-expr.cc1
-rw-r--r--gcc/rust/typecheck/rust-tyty-bounds.cc15
-rw-r--r--gcc/rust/typecheck/rust-tyty.h6
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;