From: Pierre-Emmanuel Patry <[email protected]>
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]>
---
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(+)
create mode 100644 gcc/testsuite/rust/compile/use_self_alone.rs
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 0f1766c1815..6036f474afc 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 00000000000..1df923cc348
--- /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 }
--
2.50.1