]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: Prevent forward declaration in type parameters
authorPierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
Wed, 23 Apr 2025 12:40:22 +0000 (14:40 +0200)
committerArthur Cohen <arthur.cohen@embecosm.com>
Mon, 28 Apr 2025 14:18:55 +0000 (16:18 +0200)
gcc/rust/ChangeLog:

* resolve/rust-default-resolver.cc (DefaultResolver::visit): Add visit
function for TypeParam.
* resolve/rust-default-resolver.h: Add function prototype.
* resolve/rust-forever-stack.h: Add function to check for forward
declaration ban.
* resolve/rust-late-name-resolver-2.0.cc (Late::visit): Check forward
declarations.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
gcc/rust/resolve/rust-default-resolver.cc
gcc/rust/resolve/rust-default-resolver.h
gcc/rust/resolve/rust-forever-stack.h
gcc/rust/resolve/rust-late-name-resolver-2.0.cc

index 7528e7950e644116b949bcabc0fd1023c74ad7ee..480034c89741c8f01be5421dcd44291c6a0deb87 100644 (file)
@@ -179,5 +179,13 @@ DefaultResolver::visit (AST::StaticItem &item)
   ctx.scoped (Rib::Kind::ConstantItem, item.get_node_id (), expr_vis);
 }
 
+void
+DefaultResolver::visit (AST::TypeParam &param)
+{
+  auto expr_vis = [this, &param] () { AST::DefaultASTVisitor::visit (param); };
+
+  ctx.scoped (Rib::Kind::ForwardTypeParamBan, param.get_node_id (), expr_vis);
+}
+
 } // namespace Resolver2_0
 } // namespace Rust
index 587d7d458034fb0664c2c44788ccac0743d6a8ed..2a987efdf5c49c31990a9a22b3aa459c1bd97ec0 100644 (file)
@@ -50,6 +50,8 @@ public:
   void visit (AST::InherentImpl &) override;
   void visit (AST::TraitImpl &) override;
 
+  void visit (AST::TypeParam &) override;
+
   // type dec nodes, which visit their fields or variants by default
   void visit (AST::StructStruct &) override;
   void visit (AST::TupleStruct &) override;
index 75d8c1d9b59042b86227199e315df33337aafc3a..81468e5c386f0c7b2fe652fa260b3a8855803c37 100644 (file)
@@ -831,6 +831,21 @@ private:
   tl::optional<Node &> dfs_node (Node &starting_point, NodeId to_find);
   tl::optional<const Node &> dfs_node (const Node &starting_point,
                                       NodeId to_find) const;
+
+public:
+  bool forward_declared (NodeId definition, NodeId usage)
+  {
+    if (peek ().kind != Rib::Kind::ForwardTypeParamBan)
+      return false;
+
+    const auto &definition_rib = dfs_rib (cursor (), definition);
+
+    if (!definition_rib)
+      return false;
+
+    return (definition_rib
+           && definition_rib.value ().kind == Rib::Kind::ForwardTypeParamBan);
+  }
 };
 
 } // namespace Resolver2_0
index e0cd951518090a1ffc9f68c9b13f2e41bd373d38..48e33c097de499cd939e6a2362642b6f728b6410 100644 (file)
@@ -401,6 +401,14 @@ Late::visit (AST::TypePath &type)
       return;
     }
 
+  if (ctx.types.forward_declared (resolved->get_node_id (),
+                                 type.get_node_id ()))
+    {
+      rust_error_at (type.get_locus (), ErrorCode::E0128,
+                    "type parameters with a default cannot use forward "
+                    "declared identifiers");
+    }
+
   ctx.map_usage (Usage (type.get_node_id ()),
                 Definition (resolved->get_node_id ()));
 }