]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: Fixed glob-import all ICE
authorAhmedSaid3617 <said.ahmed3617@gmail.com>
Sat, 11 Apr 2026 09:35:56 +0000 (11:35 +0200)
committerArthur Cohen <arthur.cohen@embecosm.com>
Tue, 14 Apr 2026 21:49:02 +0000 (23:49 +0200)
Modified toplevel name resolver to recognize use ::*; and use *; as valid import statements, to prevent ICE.

gcc/rust/ChangeLog:

* ast/rust-item.h:(PathType::get_glob_type): Added const qualifier to allow
function call from const objects.
* resolve/rust-forever-stack.hxx:
(ForeverStack<N>::resolve_path): Check for empty segments vector and
return starting point.
* resolve/rust-toplevel-name-resolver-2.0.cc (flatten_glob): Preserve the
opening scope resolution property of the use statement.

Signed-off-by: AhmedSaid3617 <said.ahmed3617@gmail.com>
gcc/rust/ast/rust-item.h
gcc/rust/resolve/rust-forever-stack.hxx
gcc/rust/resolve/rust-toplevel-name-resolver-2.0.cc

index 91c52d2cc706213413f032fb373995983f12c492..0724638f210d6f8432ec6079963f5ea63e36329c 100644 (file)
@@ -1078,7 +1078,7 @@ public:
 
   void accept_vis (ASTVisitor &vis) override;
 
-  PathType get_glob_type () { return glob_type; }
+  PathType get_glob_type () const { return glob_type; }
 
   Kind get_kind () const override { return Glob; }
 
index e8f4e8449b332d6e4ca3075475f788489f9a3c14..c7f90ae3a21651b7b2afa29dc2b5bcd4a05299cf 100644 (file)
@@ -729,21 +729,24 @@ ForeverStack<N>::resolve_path (
     }
   else
     {
-      rust_assert (!path.get_segments ().empty ());
+      switch (mode)
+       {
+       case ResolutionMode::Normal:
+         break; // default
+       case ResolutionMode::FromRoot:
+         starting_point = root;
+         break;
+       case ResolutionMode::FromExtern:
+         starting_point = extern_prelude;
+         break;
+       default:
+         rust_unreachable ();
+       }
     }
 
-  switch (mode)
+  if (path.get_segments ().empty ())
     {
-    case ResolutionMode::Normal:
-      break; // default
-    case ResolutionMode::FromRoot:
-      starting_point = root;
-      break;
-    case ResolutionMode::FromExtern:
-      starting_point = extern_prelude;
-      break;
-    default:
-      rust_unreachable ();
+      return Rib::Definition::NonShadowable (starting_point.get ().id);
     }
 
   auto &segments = path.get_segments ();
index 630b5ab8b95afb5c6b5e46e23fcc98036d512664..84961ae2e5947ec146041262005fd7b6c3a679de 100644 (file)
@@ -504,7 +504,9 @@ flatten_glob (const AST::UseTreeGlob &glob, std::vector<AST::SimplePath> &paths,
   if (glob.has_path ())
     paths.emplace_back (glob.get_path ());
   else
-    paths.emplace_back (AST::SimplePath ({}, false, glob.get_locus ()));
+    paths.emplace_back (AST::SimplePath (
+      {}, glob.get_glob_type () == AST::UseTreeGlob::PathType::GLOBAL,
+      glob.get_locus ()));
 }
 
 static bool