]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: Track trait bound polarity properly
authorPhilip Herron <herron.philip@googlemail.com>
Tue, 18 Jul 2023 11:12:22 +0000 (12:12 +0100)
committerArthur Cohen <arthur.cohen@embecosm.com>
Tue, 16 Jan 2024 17:56:03 +0000 (18:56 +0100)
Trait bounds can have three forms in Rust the regular trait bound, '!' the
negative trait bound to enforice that this trait must not be implmented and
'?' the anti trait bound to remove this bound. This patch extends our
Polarity enum to include the Anti trait bound and updates the HIR lowering
code to track this properly.

Addresses #2443

gcc/rust/ChangeLog:

* hir/rust-ast-lower-item.cc (ASTLoweringItem::visit): use new BoundPolarity enum
* hir/rust-ast-lower-type.cc (ASTLoweringTypeBounds::visit): likewise
* hir/rust-hir-dump.cc (BoundPolarityString): new helper
(Dump::visit): update hir dump
* hir/tree/rust-hir-item.h (class ImplBlock): likewise
* hir/tree/rust-hir-type.h (class TraitBound): likewise
* hir/tree/rust-hir.cc (TraitBound::as_string): fix as string
* util/rust-common.h (enum Polarity): add new anti bound
(enum BoundPolarity): likewise
* util/rust-hir-map.cc (Mappings::Mappings): update naming

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
gcc/rust/hir/rust-ast-lower-item.cc
gcc/rust/hir/rust-ast-lower-type.cc
gcc/rust/hir/rust-hir-dump.cc
gcc/rust/hir/tree/rust-hir-item.h
gcc/rust/hir/tree/rust-hir-type.h
gcc/rust/hir/tree/rust-hir.cc
gcc/rust/util/rust-common.h
gcc/rust/util/rust-hir-map.cc

index 93659c2867a4d95c1f36aa6cb57bcbe3035e09fc..6eaf75ffd0b4bcd7d2962a0f9fd66bc5a6840b6f 100644 (file)
@@ -535,7 +535,7 @@ ASTLoweringItem::visit (AST::InherentImpl &impl_block)
       impl_item_ids.push_back (lowered->get_impl_mappings ().get_hirid ());
     }
 
-  Polarity polarity = Positive;
+  BoundPolarity polarity = BoundPolarity::RegularBound;
   HIR::ImplBlock *hir_impl_block = new HIR::ImplBlock (
     mapping, std::move (impl_items), std::move (generic_params),
     std::unique_ptr<HIR::Type> (impl_type), nullptr, where_clause, polarity,
@@ -683,7 +683,9 @@ ASTLoweringItem::visit (AST::TraitImpl &impl_block)
       impl_item_ids.push_back (lowered->get_impl_mappings ().get_hirid ());
     }
 
-  Polarity polarity = impl_block.is_exclam () ? Positive : Negative;
+  BoundPolarity polarity = impl_block.is_exclam ()
+                            ? BoundPolarity::RegularBound
+                            : BoundPolarity::NegativeBound;
   HIR::ImplBlock *hir_impl_block = new HIR::ImplBlock (
     mapping, std::move (impl_items), std::move (generic_params),
     std::unique_ptr<HIR::Type> (impl_type),
index 768817b8fc392358c0f507655b121b735837ff0c..5388f2139cedfe81fe6f6589fbc098cdb350dd55 100644 (file)
@@ -525,9 +525,11 @@ ASTLoweringTypeBounds::visit (AST::TraitBound &bound)
                                 mappings->get_next_hir_id (crate_num),
                                 UNKNOWN_LOCAL_DEFID);
 
+  BoundPolarity polarity = bound.has_opening_question_mark ()
+                            ? BoundPolarity::AntiBound
+                            : BoundPolarity::RegularBound;
   translated = new HIR::TraitBound (mapping, *trait_path, bound.get_locus (),
-                                   bound.is_in_parens (),
-                                   bound.has_opening_question_mark ());
+                                   bound.is_in_parens (), polarity);
 }
 
 void
index bb1fea920bf0718933b56fcdcd9755edce43d84d..012e3cd90cf97590dd4fc8ea30a6379f28ba1c37 100644 (file)
@@ -52,6 +52,21 @@ std::string Dump::delims[2][2] = {
   {std::string ("["), std::string ("]")},
 };
 
+static std::string
+BoundPolarityString (BoundPolarity polarity)
+{
+  switch (polarity)
+    {
+    case RegularBound:
+      return "regular";
+    case NegativeBound:
+      return "negative";
+    case AntiBound:
+      return "anti";
+    }
+  return "unknown";
+}
+
 void
 Dump::go (HIR::Crate &e)
 {
@@ -2276,8 +2291,7 @@ Dump::visit (TraitBound &e)
   begin ("TraitBound");
   do_mappings (e.get_mappings ());
   put_field ("in_parens", std::to_string (e.get_in_parens ()));
-  put_field ("opening_question_mark",
-            std::to_string (e.get_opening_question_mark ()));
+  put_field ("polarity", BoundPolarityString (e.get_polarity ()));
 
   visit_collection ("for_lifetime", e.get_for_lifetimes ());
   visit_field ("type_path", e.get_path ());
index 75e02e98c5ce83f6baab9c285d3c2598169cb877..b174acd31861e7f2c3e7db0e49a9c12ba7aef0ba 100644 (file)
@@ -2733,7 +2733,7 @@ class ImplBlock : public VisItem, public WithInnerAttrs
   std::unique_ptr<Type> impl_type;
   std::unique_ptr<TypePath> trait_ref;
   WhereClause where_clause;
-  Polarity polarity;
+  BoundPolarity polarity;
   location_t locus;
   std::vector<std::unique_ptr<ImplItem>> impl_items;
 
@@ -2743,7 +2743,7 @@ public:
             std::vector<std::unique_ptr<GenericParam>> generic_params,
             std::unique_ptr<Type> impl_type,
             std::unique_ptr<TypePath> trait_ref, WhereClause where_clause,
-            Polarity polarity, Visibility vis, AST::AttrVec inner_attrs,
+            BoundPolarity polarity, Visibility vis, AST::AttrVec inner_attrs,
             AST::AttrVec outer_attrs, location_t locus)
     : VisItem (std::move (mappings), std::move (vis), std::move (outer_attrs)),
       WithInnerAttrs (std::move (inner_attrs)),
@@ -2817,7 +2817,7 @@ public:
   bool has_where_clause () const { return !where_clause.is_empty (); }
 
   // Returns the polarity of the impl.
-  Polarity get_polarity () const { return polarity; }
+  BoundPolarity get_polarity () const { return polarity; }
 
   location_t get_locus () const override final { return locus; }
 
index 37d108e2d3f3901fc838ed6e0e49a4e3c9ddae80..8f068ef230e00745c8bf463775b8aa858eda9723 100644 (file)
@@ -33,7 +33,7 @@ class Lifetime;
 class TraitBound : public TypeParamBound
 {
   bool in_parens;
-  bool opening_question_mark;
+  BoundPolarity polarity;
   std::vector<LifetimeParam> for_lifetimes;
   TypePath type_path;
   location_t locus;
@@ -46,10 +46,10 @@ public:
 
   TraitBound (Analysis::NodeMapping mapping, TypePath type_path,
              location_t locus, bool in_parens = false,
-             bool opening_question_mark = false,
+             BoundPolarity polarity = BoundPolarity::RegularBound,
              std::vector<LifetimeParam> for_lifetimes
              = std::vector<LifetimeParam> ())
-    : in_parens (in_parens), opening_question_mark (opening_question_mark),
+    : in_parens (in_parens), polarity (polarity),
       for_lifetimes (std::move (for_lifetimes)),
       type_path (std::move (type_path)), locus (locus), mappings (mapping)
   {}
@@ -67,7 +67,7 @@ public:
 
   std::vector<LifetimeParam> &get_for_lifetimes () { return for_lifetimes; }
   bool get_in_parens () { return in_parens; }
-  bool get_opening_question_mark () { return opening_question_mark; }
+  BoundPolarity get_polarity () { return polarity; }
 
   BoundType get_bound_type () const final override { return TRAITBOUND; }
 
index 6e626c6f5d119aaabfd43b0e48fd1b1695397880..ac1ae63bf960e2c598c679b19eb43280cc923960 100644 (file)
@@ -1986,14 +1986,16 @@ TraitBound::as_string () const
 {
   std::string str ("TraitBound:");
 
-  str += "\n Has opening question mark: ";
-  if (opening_question_mark)
+  switch (polarity)
     {
-      str += "true";
-    }
-  else
-    {
-      str += "false";
+    case RegularBound:
+      break;
+    case NegativeBound:
+      str += "!";
+      break;
+    case AntiBound:
+      str += "?";
+      break;
     }
 
   str += "\n For lifetimes: ";
index ed1935d6f60d8c2d09bc28cf684cd7ae53683bb9..763771dceb511e3ad86c058bd98ece0577cf2281 100644 (file)
@@ -37,10 +37,11 @@ enum Unsafety
   Normal
 };
 
-enum Polarity
+enum BoundPolarity
 {
-  Positive,
-  Negative
+  RegularBound,
+  NegativeBound,
+  AntiBound,
 };
 
 enum AsyncConstStatus
index 9df7fe9e63a2038fe91eecd1112cc1135f8b1193..c50836cfd726476d8343517f46de2cc07856caca 100644 (file)
@@ -100,7 +100,7 @@ Mappings::Mappings ()
   Analysis::NodeMapping node (0, 0, 0, 0);
   builtinMarker
     = new HIR::ImplBlock (node, {}, {}, nullptr, nullptr, HIR::WhereClause ({}),
-                         Positive,
+                         BoundPolarity::RegularBound,
                          HIR::Visibility (HIR::Visibility::VisType::PUBLIC),
                          {}, {}, UNDEF_LOCATION);
 }