public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r14-7957] gccrs: Fix invalid call to vector::front in TypeBoundPredicate constructors
@ 2024-01-16 18:08 Arthur Cohen
  0 siblings, 0 replies; only message in thread
From: Arthur Cohen @ 2024-01-16 18:08 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:c00624a6c8b9a08b10674abff7826ac990e9248a

commit r14-7957-gc00624a6c8b9a08b10674abff7826ac990e9248a
Author: Owen Avery <powerboat9.gamer@gmail.com>
Date:   Wed Aug 23 22:49:30 2023 -0400

    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>

Diff:
---
 gcc/rust/typecheck/rust-hir-type-check-expr.cc |  1 +
 gcc/rust/typecheck/rust-tyty-bounds.cc         | 15 +++++++++++----
 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 af350ed67d3..f4ffc40fe09 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 6239a83f607..6a87c05dbf4 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 fa2c88ccb9a..51bf0b463bd 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;

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2024-01-16 18:08 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-01-16 18:08 [gcc r14-7957] gccrs: Fix invalid call to vector::front in TypeBoundPredicate constructors Arthur Cohen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).