]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: Track polarity in type bound predicate
authorPhilip Herron <herron.philip@googlemail.com>
Tue, 18 Jul 2023 15:07:32 +0000 (16:07 +0100)
committerArthur Cohen <arthur.cohen@embecosm.com>
Tue, 16 Jan 2024 17:56:03 +0000 (18:56 +0100)
Addresses #2443

gcc/rust/ChangeLog:

* typecheck/rust-hir-path-probe.cc: track regular polarity
* typecheck/rust-hir-trait-resolve.cc (TraitResolver::resolve_trait): likewise
* typecheck/rust-hir-type-check-expr.cc (TypeCheckExpr::visit): likewise
* typecheck/rust-hir-type-check-item.cc (TypeCheckItem::visit): likewise
* typecheck/rust-tyty-bounds.cc (TypeCheckBase::get_predicate_from_bound): likewise
(TypeBoundPredicate::TypeBoundPredicate): update ctor
(TypeBoundPredicate::operator=): update copy assignment ctor
(TypeBoundPredicate::error): update error node
* typecheck/rust-tyty.h: add polarity field to predicate

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
gcc/rust/typecheck/rust-hir-path-probe.cc
gcc/rust/typecheck/rust-hir-trait-resolve.cc
gcc/rust/typecheck/rust-hir-type-check-expr.cc
gcc/rust/typecheck/rust-hir-type-check-item.cc
gcc/rust/typecheck/rust-tyty-bounds.cc
gcc/rust/typecheck/rust-tyty.h

index 2b40f5dd617ef47a41133a88801f754f0910c8f9..85cdc0408a4f246c2295935393fd88c6b667f3e9 100644 (file)
@@ -344,7 +344,8 @@ PathProbeType::process_associated_trait_for_candidates (
       break;
     }
 
-  const TyTy::TypeBoundPredicate p (*trait_ref, UNDEF_LOCATION);
+  const TyTy::TypeBoundPredicate p (*trait_ref, BoundPolarity::RegularBound,
+                                   UNDEF_LOCATION);
   TyTy::TypeBoundPredicateItem item (&p, trait_item_ref);
 
   TyTy::BaseType *trait_item_tyty = item.get_raw_item ()->get_tyty ();
index 97fec48909a1f764ff42177bca010e82e5257c12..f2dd191a04a2563d8286b6044cafbce3e2c9c111 100644 (file)
@@ -214,6 +214,7 @@ TraitResolver::resolve_trait (HIR::Trait *trait_reference)
   auto self_hrtb
     = TyTy::TypeBoundPredicate (trait_reference->get_mappings ().get_defid (),
                                std::move (self_subst_copy),
+                               BoundPolarity::RegularBound,
                                trait_reference->get_locus ());
   specified_bounds.push_back (self_hrtb);
 
index 7a7b3ac731427b2b018362488e5544aedb954494..b7538abe5db0f719f03f11995d5aa51403e19258 100644 (file)
@@ -1558,7 +1558,8 @@ TypeCheckExpr::visit (HIR::ClosureExpr &expr)
   TraitReference *trait = TraitResolver::Resolve (*trait_item);
   rust_assert (!trait->is_error ());
 
-  TyTy::TypeBoundPredicate predicate (*trait, expr.get_locus ());
+  TyTy::TypeBoundPredicate predicate (*trait, BoundPolarity::RegularBound,
+                                     expr.get_locus ());
 
   // resolve the trait bound where the <(Args)> are the parameter tuple type
   HIR::GenericArgs args = HIR::GenericArgs::create_empty (expr.get_locus ());
index b329ac131790cf0e9153ca754cfea850ac55857d..1290065f7c78eba407fd4010b06ad81859768a16 100644 (file)
@@ -528,7 +528,8 @@ TypeCheckItem::visit (HIR::Trait &trait)
   RustIdent ident{CanonicalPath::create_empty (), trait.get_locus ()};
   infered = new TyTy::DynamicObjectType (
     trait.get_mappings ().get_hirid (), ident,
-    {TyTy::TypeBoundPredicate (*trait_ref, trait.get_locus ())});
+    {TyTy::TypeBoundPredicate (*trait_ref, BoundPolarity::RegularBound,
+                              trait.get_locus ())});
 }
 
 void
index 805028f147a1f41ad6b752ce3cd3267daa213d9e..5947c21770725dfe4e2d444df987e50454fd87c6 100644 (file)
@@ -184,7 +184,8 @@ TypeCheckBase::get_predicate_from_bound (HIR::TypePath &type_path,
   if (trait->is_error ())
     return TyTy::TypeBoundPredicate::error ();
 
-  TyTy::TypeBoundPredicate predicate (*trait, type_path.get_locus ());
+  TyTy::TypeBoundPredicate predicate (*trait, BoundPolarity::RegularBound,
+                                     type_path.get_locus ());
   HIR::GenericArgs args
     = HIR::GenericArgs::create_empty (type_path.get_locus ());
 
@@ -290,10 +291,11 @@ TypeCheckBase::get_predicate_from_bound (HIR::TypePath &type_path,
 namespace TyTy {
 
 TypeBoundPredicate::TypeBoundPredicate (
-  const Resolver::TraitReference &trait_reference, location_t locus)
+  const Resolver::TraitReference &trait_reference, BoundPolarity polarity,
+  location_t locus)
   : SubstitutionRef ({}, SubstitutionArgumentMappings::empty ()),
     reference (trait_reference.get_mappings ().get_defid ()), locus (locus),
-    error_flag (false)
+    error_flag (false), polarity (polarity)
 {
   substitutions.clear ();
   for (const auto &p : trait_reference.get_trait_substs ())
@@ -306,9 +308,10 @@ TypeBoundPredicate::TypeBoundPredicate (
 
 TypeBoundPredicate::TypeBoundPredicate (
   DefId reference, std::vector<SubstitutionParamMapping> subst,
-  location_t locus)
+  BoundPolarity polarity, location_t locus)
   : SubstitutionRef ({}, SubstitutionArgumentMappings::empty ()),
-    reference (reference), locus (locus), error_flag (false)
+    reference (reference), locus (locus), error_flag (false),
+    polarity (polarity)
 {
   substitutions.clear ();
   for (const auto &p : subst)
@@ -322,7 +325,7 @@ TypeBoundPredicate::TypeBoundPredicate (
 TypeBoundPredicate::TypeBoundPredicate (const TypeBoundPredicate &other)
   : SubstitutionRef ({}, SubstitutionArgumentMappings::empty ()),
     reference (other.reference), locus (other.locus),
-    error_flag (other.error_flag)
+    error_flag (other.error_flag), polarity (other.polarity)
 {
   substitutions.clear ();
   for (const auto &p : other.get_substs ())
@@ -358,6 +361,7 @@ TypeBoundPredicate::operator= (const TypeBoundPredicate &other)
   reference = other.reference;
   locus = other.locus;
   error_flag = other.error_flag;
+  polarity = other.polarity;
   used_arguments = SubstitutionArgumentMappings::empty ();
 
   substitutions.clear ();
@@ -396,7 +400,8 @@ TypeBoundPredicate::operator= (const TypeBoundPredicate &other)
 TypeBoundPredicate
 TypeBoundPredicate::error ()
 {
-  auto p = TypeBoundPredicate (UNKNOWN_DEFID, {}, UNDEF_LOCATION);
+  auto p = TypeBoundPredicate (UNKNOWN_DEFID, {}, BoundPolarity::RegularBound,
+                              UNDEF_LOCATION);
   p.error_flag = true;
   return p;
 }
index cb844d71255eae814c2da34a4455b09771868b99..341a0e7063fbdfb56b203cbd9232e9b5b4858533 100644 (file)
@@ -381,11 +381,11 @@ class TypeBoundPredicate : public SubstitutionRef
 {
 public:
   TypeBoundPredicate (const Resolver::TraitReference &trait_reference,
-                     location_t locus);
+                     BoundPolarity polarity, location_t locus);
 
   TypeBoundPredicate (DefId reference,
                      std::vector<SubstitutionParamMapping> substitutions,
-                     location_t locus);
+                     BoundPolarity polarity, location_t locus);
 
   TypeBoundPredicate (const TypeBoundPredicate &other);
 
@@ -432,6 +432,8 @@ public:
 
   DefId get_id () const { return reference; }
 
+  BoundPolarity get_polarity () const { return polarity; }
+
   std::vector<TypeBoundPredicateItem> get_associated_type_items ();
 
   size_t get_num_associated_bindings () const override final;
@@ -445,6 +447,7 @@ private:
   DefId reference;
   location_t locus;
   bool error_flag;
+  BoundPolarity polarity;
 };
 
 // https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/struct.VariantDef.html