aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOwen Avery <powerboat9.gamer@gmail.com>2023-08-23 22:49:30 -0400
committerArthur Cohen <arthur.cohen@embecosm.com>2024-01-16 19:04:30 +0100
commitc00624a6c8b9a08b10674abff7826ac990e9248a (patch)
treef31d4ecfdc8b5156a8c767ac4f8eb6e829312a89
parentfb14147b9f336d5467b3bb26afeab4ab925dd748 (diff)
downloadgcc-c00624a6c8b9a08b10674abff7826ac990e9248a.zip
gcc-c00624a6c8b9a08b10674abff7826ac990e9248a.tar.gz
gcc-c00624a6c8b9a08b10674abff7826ac990e9248a.tar.bz2
gccrs: 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.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 af350ed..f4ffc40 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 6239a83..6a87c05 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 fa2c88c..51bf0b4 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;