https://gcc.gnu.org/g:83d04c56e0fdf733feba49d693694219ab16983a

commit r16-4826-g83d04c56e0fdf733feba49d693694219ab16983a
Author: Pierre-Emmanuel Patry <[email protected]>
Date:   Tue Aug 26 17:15:47 2025 +0200

    gccrs: Emit error on lonely self use declaration
    
    gcc/rust/ChangeLog:
    
            * resolve/rust-early-name-resolver-2.0.cc (Early::visit): Emit an 
error
            on top level rebind self use declaration.
    
    gcc/testsuite/ChangeLog:
    
            * rust/compile/use_self_alone.rs: New test.
    
    Signed-off-by: Pierre-Emmanuel Patry <[email protected]>

Diff:
---
 gcc/rust/resolve/rust-early-name-resolver-2.0.cc | 14 ++++++++++++++
 gcc/testsuite/rust/compile/use_self_alone.rs     |  2 ++
 2 files changed, 16 insertions(+)

diff --git a/gcc/rust/resolve/rust-early-name-resolver-2.0.cc 
b/gcc/rust/resolve/rust-early-name-resolver-2.0.cc
index 0f1766c18158..6036f474afc6 100644
--- a/gcc/rust/resolve/rust-early-name-resolver-2.0.cc
+++ b/gcc/rust/resolve/rust-early-name-resolver-2.0.cc
@@ -459,6 +459,20 @@ Early::finalize_rebind_import (const Early::ImportPair 
&mapping)
 void
 Early::visit (AST::UseDeclaration &decl)
 {
+  // We do not want to visit the use trees, we're only looking for top level
+  // rebind. eg. `use something;` or `use something::other;`
+  if (decl.get_tree ()->get_kind () == AST::UseTree::Kind::Rebind)
+    {
+      auto &rebind = static_cast<AST::UseTreeRebind &> (*decl.get_tree ());
+      if (rebind.get_path ().get_final_segment ().is_lower_self_seg ())
+       {
+         collect_error (
+           Error (decl.get_locus (), ErrorCode::E0429,
+                  "%<self%> imports are only allowed within a { } list"));
+         return;
+       }
+    }
+
   auto &imports = toplevel.get_imports_to_resolve ();
   auto current_import = imports.find (decl.get_node_id ());
   if (current_import != imports.end ())
diff --git a/gcc/testsuite/rust/compile/use_self_alone.rs 
b/gcc/testsuite/rust/compile/use_self_alone.rs
new file mode 100644
index 000000000000..1df923cc348b
--- /dev/null
+++ b/gcc/testsuite/rust/compile/use_self_alone.rs
@@ -0,0 +1,2 @@
+use self;
+// { dg-error ".self. imports are only allowed within a { } list" "" { target 
*-*-* } .-1 }

Reply via email to