[COMMITTED 133/144] gccrs: Use name resolver 2.0 during pattern typechecking

2025-04-04 Thread arthur . cohen
From: Owen Avery 

gcc/rust/ChangeLog:

* typecheck/rust-hir-type-check-pattern.cc: Add includes.
(TypeCheckPattern::visit): Use name resolver 2.0 if enabled.

* resolve/rust-name-resolution-context.cc
(NameResolutionContext::lookup): Make const qualified.
* resolve/rust-name-resolution-context.h
(NameResolutionContext::lookup): Likewise.

Signed-off-by: Owen Avery 
---
 .../resolve/rust-name-resolution-context.cc   |  2 +-
 .../resolve/rust-name-resolution-context.h|  2 +-
 .../typecheck/rust-hir-type-check-pattern.cc  | 30 +++
 3 files changed, 26 insertions(+), 8 deletions(-)

diff --git a/gcc/rust/resolve/rust-name-resolution-context.cc 
b/gcc/rust/resolve/rust-name-resolution-context.cc
index d79f7b5f222..9bfaa094abe 100644
--- a/gcc/rust/resolve/rust-name-resolution-context.cc
+++ b/gcc/rust/resolve/rust-name-resolution-context.cc
@@ -92,7 +92,7 @@ NameResolutionContext::map_usage (Usage usage, Definition 
definition)
 }
 
 tl::optional
-NameResolutionContext::lookup (NodeId usage)
+NameResolutionContext::lookup (NodeId usage) const
 {
   auto it = resolved_nodes.find (Usage (usage));
 
diff --git a/gcc/rust/resolve/rust-name-resolution-context.h 
b/gcc/rust/resolve/rust-name-resolution-context.h
index e2652dc3b9e..cd6fa931be5 100644
--- a/gcc/rust/resolve/rust-name-resolution-context.h
+++ b/gcc/rust/resolve/rust-name-resolution-context.h
@@ -213,7 +213,7 @@ public:
   // TODO: Use newtype pattern for Usage and Definition
   void map_usage (Usage usage, Definition definition);
 
-  tl::optional lookup (NodeId usage);
+  tl::optional lookup (NodeId usage) const;
 
 private:
   /* Map of "usage" nodes which have been resolved to a "definition" node */
diff --git a/gcc/rust/typecheck/rust-hir-type-check-pattern.cc 
b/gcc/rust/typecheck/rust-hir-type-check-pattern.cc
index 53196369202..88e4d32f6bc 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-pattern.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-pattern.cc
@@ -20,6 +20,10 @@
 #include "rust-hir-pattern.h"
 #include "rust-hir-type-check-expr.h"
 #include "rust-type-util.h"
+#include "rust-immutable-name-resolution-context.h"
+
+// for flag_name_resolution_2_0
+#include "options.h"
 
 namespace Rust {
 namespace Resolver {
@@ -49,12 +53,26 @@ TypeCheckPattern::visit (HIR::PathInExpression &pattern)
 
   NodeId ref_node_id = UNKNOWN_NODEID;
   bool maybe_item = false;
-  maybe_item
-|= resolver->lookup_resolved_name (pattern.get_mappings ().get_nodeid (),
-  &ref_node_id);
-  maybe_item
-|= resolver->lookup_resolved_type (pattern.get_mappings ().get_nodeid (),
-  &ref_node_id);
+
+  if (flag_name_resolution_2_0)
+{
+  auto &nr_ctx
+   = Resolver2_0::ImmutableNameResolutionContext::get ().resolver ();
+
+  if (auto id = nr_ctx.lookup (pattern.get_mappings ().get_nodeid ()))
+   {
+ ref_node_id = *id;
+ maybe_item = true;
+   }
+}
+  else
+{
+  maybe_item |= resolver->lookup_resolved_name (
+   pattern.get_mappings ().get_nodeid (), &ref_node_id);
+  maybe_item |= resolver->lookup_resolved_type (
+   pattern.get_mappings ().get_nodeid (), &ref_node_id);
+}
+
   bool path_is_const_item = false;
 
   if (maybe_item)
-- 
2.45.2



[COMMITTED 047/144] gccrs: Minor fix to asm codegen pr

2025-04-04 Thread arthur . cohen
From: badumbatish 

gcc/rust/ChangeLog:

* backend/rust-compile-asm.cc (CompileAsm::asm_build_expr):
Use expr's is_simple_asm and is_inline_asm
(CompileAsm::asm_is_simple): removed
(CompileAsm::asm_is_inline): removed
* backend/rust-compile-asm.h: Add docs to ASM_TREE_ARRAY_LENGTH
* hir/tree/rust-hir-expr.h: Add is_simple_asm, is_inline_asm
and remove #include tree
---
 gcc/rust/backend/rust-compile-asm.cc | 17 ++---
 gcc/rust/backend/rust-compile-asm.h  | 10 --
 gcc/rust/hir/tree/rust-hir-expr.h| 12 +++-
 3 files changed, 21 insertions(+), 18 deletions(-)

diff --git a/gcc/rust/backend/rust-compile-asm.cc 
b/gcc/rust/backend/rust-compile-asm.cc
index 8fd62dd48c9..0dd4f672008 100644
--- a/gcc/rust/backend/rust-compile-asm.cc
+++ b/gcc/rust/backend/rust-compile-asm.cc
@@ -36,9 +36,9 @@ CompileAsm::asm_build_expr (HIR::InlineAsm &expr)
  asm_construct_clobber_tree (expr),
  asm_construct_label_tree (expr)});
 
-  ASM_BASIC_P (asm_expr) = CompileAsm::asm_is_simple (expr);
+  ASM_BASIC_P (asm_expr) = expr.is_simple_asm ();
   ASM_VOLATILE_P (asm_expr) = false;
-  ASM_INLINE_P (asm_expr) = CompileAsm::asm_is_inline (expr);
+  ASM_INLINE_P (asm_expr) = expr.is_inline_asm ();
   return asm_expr;
 }
 
@@ -120,18 +120,5 @@ CompileAsm::asm_construct_label_tree (HIR::InlineAsm &expr)
   return NULL_TREE;
 }
 
-bool
-CompileAsm::asm_is_simple (HIR::InlineAsm &expr)
-{
-  // TODO: Check back later to determine how an InlineAsm is simple.
-  return true;
-}
-
-bool
-CompileAsm::asm_is_inline (HIR::InlineAsm &expr)
-{
-  // TODO: Check back later to determine how an InlineAsm is inline.
-  return true;
-}
 } // namespace Compile
 } // namespace Rust
diff --git a/gcc/rust/backend/rust-compile-asm.h 
b/gcc/rust/backend/rust-compile-asm.h
index 15ffc707986..8307d895bd5 100644
--- a/gcc/rust/backend/rust-compile-asm.h
+++ b/gcc/rust/backend/rust-compile-asm.h
@@ -40,6 +40,14 @@ public:
   // static tree Compile (HIR::Expr *expr, Context *ctx);
 
   // RELEVANT MEMBER FUNCTIONS
+
+  // The limit is 5 because it stands for the 5 things that the C version of
+  //  build_asm_expr accepts: string, output, input, clobber and label.
+  // The function signature is
+  //
+  // tree
+  // build_asm_expr (location_t loc, tree string, tree outputs, tree inputs,
+  //   tree clobbers, tree labels, bool simple, bool is_inline)
   static const int ASM_TREE_ARRAY_LENGTH = 5;
   static tree asm_build_expr (HIR::InlineAsm &);
   static tree asm_build_stmt (location_t,
@@ -50,8 +58,6 @@ public:
   static tree asm_construct_inputs (HIR::InlineAsm &);
   static tree asm_construct_clobber_tree (HIR::InlineAsm &);
   static tree asm_construct_label_tree (HIR::InlineAsm &);
-  static bool asm_is_simple (HIR::InlineAsm &);
-  static bool asm_is_inline (HIR::InlineAsm &);
 
   CompileAsm (Context *ctx);
 
diff --git a/gcc/rust/hir/tree/rust-hir-expr.h 
b/gcc/rust/hir/tree/rust-hir-expr.h
index 2b86d59f969..8a42c8b3a67 100644
--- a/gcc/rust/hir/tree/rust-hir-expr.h
+++ b/gcc/rust/hir/tree/rust-hir-expr.h
@@ -25,7 +25,6 @@
 #include "rust-hir-path.h"
 #include "rust-operators.h"
 #include "rust-expr.h"
-#include "tree.h"
 namespace Rust {
 namespace HIR {
 
@@ -4147,6 +4146,17 @@ public:
 
   std::set get_options () { return options; }
 
+  bool is_simple_asm ()
+  {
+// TODO: Check back later to determine how an InlineAsm is simple.
+return true;
+  }
+
+  bool is_inline_asm ()
+  {
+// TODO: Check back later to determine how an InlineAsm is inline.
+return true;
+  }
   InlineAsm (location_t locus, bool is_global_asm,
 std::vector template_,
 std::vector template_strs,
-- 
2.45.2



[COMMITTED 071/144] gccrs: Used `IndexVec` for Loans

2025-04-04 Thread arthur . cohen
From: Kushal Pal 

gcc/rust/ChangeLog:

* checks/errors/borrowck/rust-bir-place.h: Used `IndexVec` with
ScopeId as index.
* checks/errors/borrowck/rust-borrow-checker-diagnostics.cc
(BorrowCheckerDiagnostics::get_loan): Convert Polonius::Loan to
BIR::Loan, so we can use it as index.

Signed-off-by: Kushal Pal 
---
 gcc/rust/checks/errors/borrowck/rust-bir-place.h | 16 
 .../borrowck/rust-borrow-checker-diagnostics.cc  |  2 +-
 2 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/gcc/rust/checks/errors/borrowck/rust-bir-place.h 
b/gcc/rust/checks/errors/borrowck/rust-bir-place.h
index bf4dfe625a0..ae8bec2e273 100644
--- a/gcc/rust/checks/errors/borrowck/rust-bir-place.h
+++ b/gcc/rust/checks/errors/borrowck/rust-bir-place.h
@@ -215,10 +215,12 @@ public:
   {
 internal_vector.emplace_back (std::forward (args)...);
   }
+  std::vector &get_vector () { return internal_vector; }
   size_t size () const { return internal_vector.size (); }
 };
 
 using Scopes = IndexVec;
+using Loans = IndexVec;
 
 /** Allocated places and keeps track of paths. */
 class PlaceDB
@@ -230,7 +232,7 @@ private:
   Scopes scopes;
   ScopeId current_scope = ROOT_SCOPE;
 
-  std::vector loans;
+  Loans loans;
 
   FreeRegion next_free_region = {1};
 
@@ -251,11 +253,8 @@ public:
 
   size_t size () const { return places.size (); }
 
-  const std::vector &get_loans () const { return loans; }
-  const Loan &get_loan (LoanId loan_id) const
-  {
-return loans.at (loan_id.value);
-  }
+  const Loans &get_loans () const { return loans; }
+  const Loan &get_loan (LoanId loan_id) const { return loans.at (loan_id); }
 
   ScopeId get_current_scope_id () const { return current_scope; }
 
@@ -383,8 +382,9 @@ public:
   {
 LoanId id = {loans.size ()};
 loans.push_back (std::forward (loan));
-PlaceId borrowed_place = loans.rbegin ()->place;
-places[loans.rbegin ()->place.value].borrowed_by.push_back (id);
+PlaceId borrowed_place = loans.get_vector ().rbegin ()->place;
+places[loans.get_vector ().rbegin ()->place.value].borrowed_by.push_back (
+  id);
 if (places[borrowed_place.value].kind == Place::DEREF)
   {
places[places[borrowed_place.value].path.parent.value]
diff --git a/gcc/rust/checks/errors/borrowck/rust-borrow-checker-diagnostics.cc 
b/gcc/rust/checks/errors/borrowck/rust-borrow-checker-diagnostics.cc
index f2e4c38cfa0..4002ed4dd34 100644
--- a/gcc/rust/checks/errors/borrowck/rust-borrow-checker-diagnostics.cc
+++ b/gcc/rust/checks/errors/borrowck/rust-borrow-checker-diagnostics.cc
@@ -142,7 +142,7 @@ BorrowCheckerDiagnostics::get_statement (Polonius::Point 
point)
 const BIR::Loan &
 BorrowCheckerDiagnostics::get_loan (Polonius::Loan loan)
 {
-  return bir_function.place_db.get_loans ()[loan];
+  return bir_function.place_db.get_loans ()[{loan}];
 }
 
 const HIR::LifetimeParam *
-- 
2.45.2



[COMMITTED 092/146] gccrs: ast: Add EnumItem::Kind

2025-04-04 Thread arthur . cohen
From: Arthur Cohen 

gcc/rust/ChangeLog:

* ast/rust-item.h: Add EnumItem::Kind for differentiating all variants 
that may be
used inside an enum declaration.
---
 gcc/rust/ast/rust-item.h | 52 
 1 file changed, 52 insertions(+)

diff --git a/gcc/rust/ast/rust-item.h b/gcc/rust/ast/rust-item.h
index 6b77449eb8d..ecd355f6b8a 100644
--- a/gcc/rust/ast/rust-item.h
+++ b/gcc/rust/ast/rust-item.h
@@ -1994,6 +1994,41 @@ class EnumItem : public VisItem
   location_t locus;
 
 public:
+  enum class Kind
+  {
+Identifier,
+Tuple,
+Struct,
+
+// FIXME: In the future, we'll need to remove this possibility as well as
+// remove the EnumItemDiscriminant class. The feature for arbitrary
+// discriminants on all kinds of variants has been stabilized, and a
+// "discriminant" is no longer an enum item variant - it's simply an
+// optional part of all variants.
+//
+// Per the reference:
+//
+// EnumItem :
+//OuterAttribute* Visibility?
+//IDENTIFIER ( EnumItemTuple | EnumItemStruct )? EnumItemDiscriminant?
+//
+// EnumItemTuple :
+//( TupleFields? )
+//
+// EnumItemStruct :
+//{ StructFields? }
+//
+// EnumItemDiscriminant :
+//= Expression
+//
+// So we instead need to remove the class, and add an optional expression 
to
+// the base EnumItem class
+//
+// gccrs#3340
+
+Discriminant,
+  };
+
   virtual ~EnumItem () {}
 
   EnumItem (Identifier variant_name, Visibility vis,
@@ -2002,6 +2037,8 @@ public:
   variant_name (std::move (variant_name)), locus (locus)
   {}
 
+  virtual Kind get_enum_item_kind () const { return Kind::Identifier; }
+
   // Unique pointer custom clone function
   std::unique_ptr clone_enum_item () const
   {
@@ -2043,6 +2080,11 @@ public:
   tuple_fields (std::move (tuple_fields))
   {}
 
+  EnumItem::Kind get_enum_item_kind () const override
+  {
+return EnumItem::Kind::Tuple;
+  }
+
   std::string as_string () const override;
 
   void accept_vis (ASTVisitor &vis) override;
@@ -2080,6 +2122,11 @@ public:
   struct_fields (std::move (struct_fields))
   {}
 
+  EnumItem::Kind get_enum_item_kind () const override
+  {
+return EnumItem::Kind::Struct;
+  }
+
   std::string as_string () const override;
 
   void accept_vis (ASTVisitor &vis) override;
@@ -2133,6 +2180,11 @@ public:
   EnumItemDiscriminant (EnumItemDiscriminant &&other) = default;
   EnumItemDiscriminant &operator= (EnumItemDiscriminant &&other) = default;
 
+  EnumItem::Kind get_enum_item_kind () const override
+  {
+return EnumItem::Kind::Discriminant;
+  }
+
   std::string as_string () const override;
 
   void accept_vis (ASTVisitor &vis) override;
-- 
2.45.2



[COMMITTED 049/146] gccrs: Prevent execution of some nr1.0 functions with nr2.0

2025-04-04 Thread arthur . cohen
From: Owen Avery 

gcc/rust/ChangeLog:

* resolve/rust-name-resolver.cc: Include options.txt.
(Resolver::insert_resolved_name): Assert that name resolution
2.0 is disabled.
(Resolver::lookup_resolved_name): Likewise.
(Resolver::insert_resolved_type): Likewise.
(Resolver::lookup_resolved_type): Likewise.
(Resolver::insert_resolved_label): Likewise.
(Resolver::lookup_resolved_label): Likewise.
(Resolver::insert_resolved_macro): Likewise.
(Resolver::lookup_resolved_macro): Likewise.
(Resolver::insert_resolved_misc): Likewise.
(Resolver::lookup_resolved_misc): Likewise.

Signed-off-by: Owen Avery 
---
 gcc/rust/resolve/rust-name-resolver.cc | 13 +
 1 file changed, 13 insertions(+)

diff --git a/gcc/rust/resolve/rust-name-resolver.cc 
b/gcc/rust/resolve/rust-name-resolver.cc
index 3b4e3111d93..0f5b1084774 100644
--- a/gcc/rust/resolve/rust-name-resolver.cc
+++ b/gcc/rust/resolve/rust-name-resolver.cc
@@ -19,6 +19,9 @@
 #include "rust-name-resolver.h"
 #include "rust-ast-full.h"
 
+// for flag_name_resolution_2_0
+#include "options.h"
+
 namespace Rust {
 namespace Resolver {
 
@@ -468,6 +471,7 @@ Resolver::setup_builtin (const std::string &name, 
TyTy::BaseType *tyty)
 void
 Resolver::insert_resolved_name (NodeId refId, NodeId defId)
 {
+  rust_assert (!flag_name_resolution_2_0);
   resolved_names[refId] = defId;
   get_name_scope ().append_reference_for_def (refId, defId);
   insert_captured_item (defId);
@@ -476,6 +480,7 @@ Resolver::insert_resolved_name (NodeId refId, NodeId defId)
 bool
 Resolver::lookup_resolved_name (NodeId refId, NodeId *defId)
 {
+  rust_assert (!flag_name_resolution_2_0);
   auto it = resolved_names.find (refId);
   if (it == resolved_names.end ())
 return false;
@@ -489,6 +494,7 @@ Resolver::insert_resolved_type (NodeId refId, NodeId defId)
 {
   // auto it = resolved_types.find (refId);
   // rust_assert (it == resolved_types.end ());
+  rust_assert (!flag_name_resolution_2_0);
 
   resolved_types[refId] = defId;
   get_type_scope ().append_reference_for_def (refId, defId);
@@ -497,6 +503,7 @@ Resolver::insert_resolved_type (NodeId refId, NodeId defId)
 bool
 Resolver::lookup_resolved_type (NodeId refId, NodeId *defId)
 {
+  rust_assert (!flag_name_resolution_2_0);
   auto it = resolved_types.find (refId);
   if (it == resolved_types.end ())
 return false;
@@ -508,6 +515,7 @@ Resolver::lookup_resolved_type (NodeId refId, NodeId *defId)
 void
 Resolver::insert_resolved_label (NodeId refId, NodeId defId)
 {
+  rust_assert (!flag_name_resolution_2_0);
   auto it = resolved_labels.find (refId);
   rust_assert (it == resolved_labels.end ());
 
@@ -518,6 +526,7 @@ Resolver::insert_resolved_label (NodeId refId, NodeId defId)
 bool
 Resolver::lookup_resolved_label (NodeId refId, NodeId *defId)
 {
+  rust_assert (!flag_name_resolution_2_0);
   auto it = resolved_labels.find (refId);
   if (it == resolved_labels.end ())
 return false;
@@ -529,6 +538,7 @@ Resolver::lookup_resolved_label (NodeId refId, NodeId 
*defId)
 void
 Resolver::insert_resolved_macro (NodeId refId, NodeId defId)
 {
+  rust_assert (!flag_name_resolution_2_0);
   auto it = resolved_macros.find (refId);
   rust_assert (it == resolved_macros.end ());
 
@@ -539,6 +549,7 @@ Resolver::insert_resolved_macro (NodeId refId, NodeId defId)
 bool
 Resolver::lookup_resolved_macro (NodeId refId, NodeId *defId)
 {
+  rust_assert (!flag_name_resolution_2_0);
   auto it = resolved_macros.find (refId);
   if (it == resolved_macros.end ())
 return false;
@@ -550,6 +561,7 @@ Resolver::lookup_resolved_macro (NodeId refId, NodeId 
*defId)
 void
 Resolver::insert_resolved_misc (NodeId refId, NodeId defId)
 {
+  rust_assert (!flag_name_resolution_2_0);
   auto it = misc_resolved_items.find (refId);
   rust_assert (it == misc_resolved_items.end ());
 
@@ -559,6 +571,7 @@ Resolver::insert_resolved_misc (NodeId refId, NodeId defId)
 bool
 Resolver::lookup_resolved_misc (NodeId refId, NodeId *defId)
 {
+  rust_assert (!flag_name_resolution_2_0);
   auto it = misc_resolved_items.find (refId);
   if (it == misc_resolved_items.end ())
 return false;
-- 
2.45.2



[Bug rust/119641] New: narrowing Warning during bootstrap in Rust::BIR::PlaceDB::lookup_or_add_variable

2025-04-04 Thread pinskia at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119641

Bug ID: 119641
   Summary: narrowing Warning during bootstrap in
Rust::BIR::PlaceDB::lookup_or_add_variable
   Product: gcc
   Version: 15.0
Status: UNCONFIRMED
  Severity: normal
  Priority: P3
 Component: rust
  Assignee: unassigned at gcc dot gnu.org
  Reporter: pinskia at gcc dot gnu.org
CC: dkm at gcc dot gnu.org, gcc-rust at gcc dot gnu.org,
pierre-emmanuel.patry at embecosm dot com
  Target Milestone: ---

```
/home/apinski/src/upstream-gcc-match/gcc/gcc/rust/checks/errors/borrowck/rust-bir-place.h:
In member function ‘Rust::BIR::PlaceId
Rust::BIR::PlaceDB::lookup_or_add_variable(Rust::NodeId,
Rust::TyTy::BaseType*)’:
/home/apinski/src/upstream-gcc-match/gcc/gcc/rust/checks/errors/borrowck/rust-bir-place.h:422:28:
warning: narrowing conversion of
‘(((Rust::BIR::PlaceDB*)this)->Rust::BIR::PlaceDB::places.Rust::BIR::IndexVec::size() - 1)’ from ‘size_t’ {aka ‘long unsigned int’} to
‘uint32_t’ {aka ‘unsigned int’} [-Wnarrowing]
  422 | return {places.size () - 1};
  | ~~~^~~
```

It would be useful to get this fixed.

-- 
You are receiving this mail because:
You are on the CC list for the bug.

☺ Buildbot (Sourceware): gccrust - build successful (master)

2025-04-04 Thread builder
A restored build has been detected on builder gccrust-fedora-ppc64le while 
building gccrust.

Full details are available at:
https://builder.sourceware.org/buildbot/#/builders/19/builds/2176

Build state: build successful
Revision: b9aaa6192f3310a0cb26f7773b31703a8c9c544c
Worker: fedora-ppc64le
Build Reason: (unknown)
Blamelist: Antoni Boucher , Arthur Cohen 
, Benjamin Thos , 
CohenArthur , Dylan Gardner 
, GS-GOAT <86884129+gs-g...@users.noreply.github.com>, 
Jarkko Sakkinen , Jason Merrill , 
Liam Naddell , Marc Poulhiès , Nobel 
, Om Swaroop Nayak <96killera...@gmail.com>, Owen Avery 
, Philip Herron , 
Pierre-Emmanuel Patry , Prajwal S N 
, Ryutaro Okada <1015ry...@gmail.com>, Sam James 
, Sri Ganesh Thota , 
badumbatish , benjamin.thos , 
lishin , liushuyu 

Steps:

- 0: worker_preparation ( success )

- 1: git checkout ( success )
Logs:
- stdio: 
https://builder.sourceware.org/buildbot/#/builders/19/builds/2176/steps/1/logs/stdio

- 2: rm -rf gccrs-build ( success )
Logs:
- stdio: 
https://builder.sourceware.org/buildbot/#/builders/19/builds/2176/steps/2/logs/stdio

- 3: configure ( success )
Logs:
- stdio: 
https://builder.sourceware.org/buildbot/#/builders/19/builds/2176/steps/3/logs/stdio
- config.log: 
https://builder.sourceware.org/buildbot/#/builders/19/builds/2176/steps/3/logs/config_log

- 4: make ( warnings )
Logs:
- stdio: 
https://builder.sourceware.org/buildbot/#/builders/19/builds/2176/steps/4/logs/stdio
- warnings (43): 
https://builder.sourceware.org/buildbot/#/builders/19/builds/2176/steps/4/logs/warnings__43_

- 5: make check ( warnings )
Logs:
- stdio: 
https://builder.sourceware.org/buildbot/#/builders/19/builds/2176/steps/5/logs/stdio
- rust.sum: 
https://builder.sourceware.org/buildbot/#/builders/19/builds/2176/steps/5/logs/rust_sum
- rust.log: 
https://builder.sourceware.org/buildbot/#/builders/19/builds/2176/steps/5/logs/rust_log
- warnings (4): 
https://builder.sourceware.org/buildbot/#/builders/19/builds/2176/steps/5/logs/warnings__4_

- 6: grep FAIL or unexpected rust.sum ( success )
Logs:
- stdio: 
https://builder.sourceware.org/buildbot/#/builders/19/builds/2176/steps/6/logs/stdio

- 7: prep ( success )
Logs:
- stdio: 
https://builder.sourceware.org/buildbot/#/builders/19/builds/2176/steps/7/logs/stdio

- 8: build bunsen.cpio.gz ( success )
Logs:
- stdio: 
https://builder.sourceware.org/buildbot/#/builders/19/builds/2176/steps/8/logs/stdio

- 9: fetch bunsen.cpio.gz ( success )
Logs:
- stdio: 
https://builder.sourceware.org/buildbot/#/builders/19/builds/2176/steps/9/logs/stdio

- 10: unpack bunsen.cpio.gz ( success )
Logs:
- stdio: 
https://builder.sourceware.org/buildbot/#/builders/19/builds/2176/steps/10/logs/stdio

- 11: pass .bunsen.source.* ( success )
Logs:
- stdio: 
https://builder.sourceware.org/buildbot/#/builders/19/builds/2176/steps/11/logs/stdio

- 12: upload to bunsen ( success )
Logs:
- stdio: 
https://builder.sourceware.org/buildbot/#/builders/19/builds/2176/steps/12/logs/stdio

- 13: clean up ( success )
Logs:
- stdio: 
https://builder.sourceware.org/buildbot/#/builders/19/builds/2176/steps/13/logs/stdio

- 14: rm -rf gccrs-build_1 ( success )
Logs:
- stdio: 
https://builder.sourceware.org/buildbot/#/builders/19/builds/2176/steps/14/logs/stdio

A restored build has been detected on builder gccrust-debian-i386 while 
building gccrust.

Full details are available at:
https://builder.sourceware.org/buildbot/#/builders/27/builds/2833

Build state: build successful
Revision: b9aaa6192f3310a0cb26f7773b31703a8c9c544c
Worker: debian-i386
Build Reason: (unknown)
Blamelist: 0xn4utilus , Aldy Hernandez 
, Alex Coplan , Alexander Westbrooks 
, Alexandre Oliva , Andre Simoes 
Dias Vieira , Andre Vieira 
, Andreas Schwab , Andrew 
Carlotti , Andrew Pinski , 
Andrew Stubbs , Antoni Boucher , Antonio 
Gomes , Arthur Cohen , 
Benjamin Thos , Bernhard Reutner-Fischer 
, Brian Inglis , Charalampos 
Mitrodimas , Christoph Müllner 
, Christophe Lyon , 
Chung-Lin Tang , CohenArthur , 
Cupertino Miranda , Daniel Cederman , Dave Evans , David Faust 
, David Malcolm , Dimitar Dimitrov 
, Dylan Gardner , Edwin Lu 
, Emanuele Micheletti , 
Eric Botcazou , Fangrui Song , 
Fangrui Song , Filip Kastl , 
Francois-Xavier Coudert , François Dumont 
, GCC Administrator , GS-GOAT 
<86884129+gs-g...@users.noreply.github.com>, Gaius Mulley 
, Georg-Johann Lay , Gerald Pfeifer 
, Greg McGary , Guillaume Gomez 
, H.J. Lu <(no_default)>, H.J. Lu 
, Hans-Peter Nilsson , Hans-Peter Nilsson 
, Haochen Gui , Haochen Jiang 
, 
 Harald Anlauf , Huanghui Nie , Iain Buclaw 
, Iain Sandoe , Ian Lance Taylor 
, Ilya Leoshkevich , Jakub Dupak 
, Jakub Jelinek , Jan Dubiec 
, Jan Hubicka , Jarkko Sakkinen 
, Jason Merrill , Jeevitha 
, Jeff Law , Jerry DeLisle 
, Jiahao Xu , Jin Ma 
, JoanVC , 

[COMMITTED 053/146] gccrs: allow casts from numeric types to floats

2025-04-04 Thread arthur . cohen
From: Philip Herron 

Fixes Rust-GCC#3261

gcc/rust/ChangeLog:

* typecheck/rust-casts.cc (TypeCastRules::cast_rules): allow casts to 
float

gcc/testsuite/ChangeLog:

* rust/compile/issue-3261.rs: New test.

Signed-off-by: Philip Herron 
---
 gcc/rust/typecheck/rust-casts.cc | 10 ++
 gcc/testsuite/rust/compile/issue-3261.rs | 18 ++
 2 files changed, 28 insertions(+)
 create mode 100644 gcc/testsuite/rust/compile/issue-3261.rs

diff --git a/gcc/rust/typecheck/rust-casts.cc b/gcc/rust/typecheck/rust-casts.cc
index 5235069fa23..cf4de4b3320 100644
--- a/gcc/rust/typecheck/rust-casts.cc
+++ b/gcc/rust/typecheck/rust-casts.cc
@@ -200,6 +200,16 @@ TypeCastRules::cast_rules ()
  }
  break;
 
+ case TyTy::TypeKind::FLOAT: {
+   // can only do this for number types not char
+   bool from_char
+ = from.get_ty ()->get_kind () == TyTy::TypeKind::CHAR;
+   if (!from_char)
+ return TypeCoercionRules::CoercionResult{{},
+  to.get_ty ()->clone ()};
+ }
+ break;
+
case TyTy::TypeKind::INFER:
case TyTy::TypeKind::USIZE:
case TyTy::TypeKind::ISIZE:
diff --git a/gcc/testsuite/rust/compile/issue-3261.rs 
b/gcc/testsuite/rust/compile/issue-3261.rs
new file mode 100644
index 000..37e974d6169
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-3261.rs
@@ -0,0 +1,18 @@
+// { dg-options "-w" }
+fn main() {
+let a: i8 = 50;
+let b = a as f32;
+let c = a as f64;
+
+let a: i16 = 1337;
+let b = a as f32;
+let c = a as f64;
+
+let a: i32 = 1337;
+let b = a as f32;
+let c = a as f64;
+
+let a: i64 = 1337;
+let b = a as f32;
+let c = a as f64;
+}
-- 
2.45.2



[COMMITTED 064/144] gccrs: Strong type FreeRegion

2025-04-04 Thread arthur . cohen
From: Kushal Pal 

gcc/rust/ChangeLog:

* checks/errors/borrowck/rust-bir-builder-internal.h: Use
STATIC_FREE_REGION, use value of FreeRegion for origin.
* checks/errors/borrowck/rust-bir-builder.h: Use free region
value.
* checks/errors/borrowck/rust-bir-dump.cc (Dump::visit_scope):
Likewise.
* checks/errors/borrowck/rust-bir-fact-collector.h (points):
Likewise.
* checks/errors/borrowck/rust-bir-free-region.h (struct FreeRegion):
Make FreeRegion a struct.
* checks/errors/borrowck/rust-bir-place.h: Use FreeRegion
instead of Origin in PlaceDB.
* typecheck/rust-tyty-variance-analysis.cc 
(FieldVisitorCtx::add_constraints_from_region):
Use value of FreeRegion for origin.
(FieldVisitorCtx::add_constrints_from_param): Likewise.
(Term::make_transform): Likewise.

Signed-off-by: Kushal Pal 
---
 .../borrowck/rust-bir-builder-internal.h  | 11 +++---
 .../checks/errors/borrowck/rust-bir-builder.h |  6 ++--
 .../checks/errors/borrowck/rust-bir-dump.cc   |  2 +-
 .../errors/borrowck/rust-bir-fact-collector.h | 36 ++-
 .../errors/borrowck/rust-bir-free-region.h| 30 +---
 .../checks/errors/borrowck/rust-bir-place.h   | 14 +---
 .../typecheck/rust-tyty-variance-analysis.cc  |  6 ++--
 7 files changed, 68 insertions(+), 37 deletions(-)

diff --git a/gcc/rust/checks/errors/borrowck/rust-bir-builder-internal.h 
b/gcc/rust/checks/errors/borrowck/rust-bir-builder-internal.h
index 74be02b90f6..afaeb12d458 100644
--- a/gcc/rust/checks/errors/borrowck/rust-bir-builder-internal.h
+++ b/gcc/rust/checks/errors/borrowck/rust-bir-builder-internal.h
@@ -215,7 +215,7 @@ protected:
  }
else if (region.is_static ())
  {
-   free_regions.push_back (0);
+   free_regions.push_back (STATIC_FREE_REGION);
  }
else if (region.is_anonymous ())
  {
@@ -314,9 +314,10 @@ protected: // Helpers to add BIR statements
   {
 auto mutability = ty->as ()->mutability ();
 auto loan = ctx.place_db.add_loan ({mutability, place_id, location});
-push_tmp_assignment (new BorrowExpr (place_id, loan,
-ctx.place_db.get_next_free_region ()),
-ty, location);
+push_tmp_assignment (
+  new BorrowExpr (place_id, loan,
+ ctx.place_db.get_next_free_region ().value),
+  ty, location);
 return translated;
   }
 
@@ -609,7 +610,7 @@ protected:
   {ty->as ()->mutability (), place_id,
location});
 return_expr (new BorrowExpr (place_id, loan,
-ctx.place_db.get_next_free_region ()),
+ctx.place_db.get_next_free_region ().value),
 ty, location);
 return translated;
   }
diff --git a/gcc/rust/checks/errors/borrowck/rust-bir-builder.h 
b/gcc/rust/checks/errors/borrowck/rust-bir-builder.h
index e3d61b5b36e..4e48ced3299 100644
--- a/gcc/rust/checks/errors/borrowck/rust-bir-builder.h
+++ b/gcc/rust/checks/errors/borrowck/rust-bir-builder.h
@@ -94,8 +94,8 @@ private:
  ctx.fn_free_regions[bound.second.get_index ()]);
 
auto last_bound = universal_region_bounds.back ();
-   rust_debug ("\t\t %lu: %lu", (unsigned long) last_bound.first,
-   (unsigned long) last_bound.second);
+   rust_debug ("\t\t %lu: %lu", (unsigned long) last_bound.first.value,
+   (unsigned long) last_bound.second.value);
   }
 
 // TODO: handle type_region constraints
@@ -178,7 +178,7 @@ private:
if (generic_param->get_kind ()
== HIR::GenericParam::GenericKind::LIFETIME)
  {
-   result[regions[region_index++]]
+   result[regions[region_index++].value]
  = static_cast (generic_param.get ());
  }
   }
diff --git a/gcc/rust/checks/errors/borrowck/rust-bir-dump.cc 
b/gcc/rust/checks/errors/borrowck/rust-bir-dump.cc
index 924c7d9a6e8..e69c0002b3c 100644
--- a/gcc/rust/checks/errors/borrowck/rust-bir-dump.cc
+++ b/gcc/rust/checks/errors/borrowck/rust-bir-dump.cc
@@ -380,7 +380,7 @@ Dump::visit_scope (ScopeId id, size_t depth)
   print_comma_separated (stream,
 func.place_db[local].regions.get_regions (),
 [this] (FreeRegion region_id) {
-  stream << "'?" << region_id;
+  stream << "'?" << region_id.value;
 });
   stream << "]\n";
 }
diff --git a/gcc/rust/checks/errors/borrowck/rust-bir-fact-collector.h 
b/gcc/rust/checks/errors/borrowck/rust-bir-fact-collector.h
index fa7cbb38eef..ed2133a361b 100644
--- a/gcc/rust/checks/errors/borrowck/rust-bir-fact-collector.h
+++ b/gcc/rust/checks/errors/borrowck/rust-bir-fact-collector.h
@@ -107,14 +107,15 @@ protected: // Main collection entry points (for different 
ca

[COMMITTED 081/146] gccrs: typecheck-path: Fix typo (reciever -> receiver)

2025-04-04 Thread arthur . cohen
From: Arthur Cohen 

gcc/rust/ChangeLog:

* typecheck/rust-hir-path-probe.cc: Fix typos.
* typecheck/rust-hir-path-probe.h: Likewise.
* typecheck/rust-hir-type-check-path.cc: Likewise.
---
 gcc/rust/typecheck/rust-hir-path-probe.cc  |  4 ++--
 gcc/rust/typecheck/rust-hir-path-probe.h   |  2 +-
 gcc/rust/typecheck/rust-hir-type-check-path.cc | 10 +-
 3 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/gcc/rust/typecheck/rust-hir-path-probe.cc 
b/gcc/rust/typecheck/rust-hir-path-probe.cc
index 2e9ad95dde3..1148b24b010 100644
--- a/gcc/rust/typecheck/rust-hir-path-probe.cc
+++ b/gcc/rust/typecheck/rust-hir-path-probe.cc
@@ -168,7 +168,7 @@ PathProbeType::Probe (const TyTy::BaseType *receiver,
   if (!probe_bounds)
 return probe.candidates;
 
-  if (!probe.is_reciever_generic ())
+  if (!probe.is_receiver_generic ())
 {
   std::vector> probed_bounds
= TypeBoundsProbe::Probe (receiver);
@@ -433,7 +433,7 @@ PathProbeType::union_bounds (
 }
 
 bool
-PathProbeType::is_reciever_generic () const
+PathProbeType::is_receiver_generic () const
 {
   const TyTy::BaseType *root = receiver->get_root ();
   bool receiver_is_type_param = root->get_kind () == TyTy::TypeKind::PARAM;
diff --git a/gcc/rust/typecheck/rust-hir-path-probe.h 
b/gcc/rust/typecheck/rust-hir-path-probe.h
index 09a6492596d..59ffeb114e0 100644
--- a/gcc/rust/typecheck/rust-hir-path-probe.h
+++ b/gcc/rust/typecheck/rust-hir-path-probe.h
@@ -145,7 +145,7 @@ protected:
 const std::vector> b)
 const;
 
-  bool is_reciever_generic () const;
+  bool is_receiver_generic () const;
 
   const TyTy::BaseType *receiver;
   const HIR::PathIdentSegment &search;
diff --git a/gcc/rust/typecheck/rust-hir-type-check-path.cc 
b/gcc/rust/typecheck/rust-hir-type-check-path.cc
index 4746e7d730d..4c7dec1dea3 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-path.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-path.cc
@@ -354,13 +354,13 @@ TypeCheckExpr::resolve_segments (NodeId 
root_resolved_node_id,
 {
   NodeId resolved_node_id = root_resolved_node_id;
   TyTy::BaseType *prev_segment = tyseg;
-  bool reciever_is_generic = prev_segment->get_kind () == 
TyTy::TypeKind::PARAM;
-  bool reciever_is_dyn = prev_segment->get_kind () == TyTy::TypeKind::DYNAMIC;
+  bool receiver_is_generic = prev_segment->get_kind () == 
TyTy::TypeKind::PARAM;
+  bool receiver_is_dyn = prev_segment->get_kind () == TyTy::TypeKind::DYNAMIC;
 
   for (size_t i = offset; i < segments.size (); i++)
 {
   HIR::PathExprSegment &seg = segments.at (i);
-  bool probe_impls = !reciever_is_generic;
+  bool probe_impls = !receiver_is_generic;
 
   // probe the path is done in two parts one where we search impls if no
   // candidate is found then we search extensions from traits
@@ -435,7 +435,7 @@ TypeCheckExpr::resolve_segments (NodeId 
root_resolved_node_id,
}
}
 
-  if (associated_impl_block != nullptr && !reciever_is_dyn)
+  if (associated_impl_block != nullptr && !receiver_is_dyn)
{
  // associated types
  HirId impl_block_id
@@ -492,7 +492,7 @@ TypeCheckExpr::resolve_segments (NodeId 
root_resolved_node_id,
  if (tyseg->get_kind () == TyTy::TypeKind::ERROR)
return;
}
-  else if (tyseg->needs_generic_substitutions () && !reciever_is_generic)
+  else if (tyseg->needs_generic_substitutions () && !receiver_is_generic)
{
  location_t locus = seg.get_locus ();
  tyseg = SubstMapper::InferSubst (tyseg, locus);
-- 
2.45.2



[COMMITTED 111/144] gccrs: Move bir builder function implementation

2025-04-04 Thread arthur . cohen
From: Pierre-Emmanuel Patry 

Move function implementation to their own file.

gcc/rust/ChangeLog:

* Make-lang.in: Add new rust-bir-builder-pattern file.
* checks/errors/borrowck/rust-bir-builder-pattern.h: Remove
implementation.
* checks/errors/borrowck/rust-bir-builder-pattern.cc: New file.

Signed-off-by: Pierre-Emmanuel Patry 
---
 gcc/rust/Make-lang.in |   1 +
 .../borrowck/rust-bir-builder-pattern.cc  | 273 ++
 .../borrowck/rust-bir-builder-pattern.h   | 260 +
 3 files changed, 283 insertions(+), 251 deletions(-)
 create mode 100644 gcc/rust/checks/errors/borrowck/rust-bir-builder-pattern.cc

diff --git a/gcc/rust/Make-lang.in b/gcc/rust/Make-lang.in
index c1a3c1fe9f3..51645be6ff6 100644
--- a/gcc/rust/Make-lang.in
+++ b/gcc/rust/Make-lang.in
@@ -172,6 +172,7 @@ GRS_OBJS = \
 rust/rust-borrow-checker.o \
 rust/rust-borrow-checker-diagnostics.o\
 rust/rust-bir-builder-expr-stmt.o \
+rust/rust-bir-builder-pattern.o \
 rust/rust-bir-dump.o \
 rust/rust-polonius.o\
 rust/rust-hir-dot-operator.o \
diff --git a/gcc/rust/checks/errors/borrowck/rust-bir-builder-pattern.cc 
b/gcc/rust/checks/errors/borrowck/rust-bir-builder-pattern.cc
new file mode 100644
index 000..723ff7334b6
--- /dev/null
+++ b/gcc/rust/checks/errors/borrowck/rust-bir-builder-pattern.cc
@@ -0,0 +1,273 @@
+#include "rust-bir-builder-pattern.h"
+
+namespace Rust {
+namespace BIR {
+
+void
+PatternBindingBuilder::visit_identifier (const Analysis::NodeMapping &node,
+bool is_ref, location_t location,
+bool is_mut)
+{
+  if (is_ref)
+{
+  translated = declare_variable (
+   node,
+   new TyTy::ReferenceType (node.get_hirid (),
+TyTy::TyVar (node.get_hirid ()),
+(is_mut) ? Mutability::Mut : Mutability::Imm));
+}
+  else
+{
+  translated = declare_variable (node);
+}
+
+  if (init.has_value ())
+{
+  push_assignment (translated, init.value (), location);
+}
+}
+
+void
+PatternBindingBuilder::visit (HIR::IdentifierPattern &pattern)
+{
+  // Top-level identifiers are resolved directly to avoid useless temporary
+  // (for cleaner BIR).
+  visit_identifier (pattern.get_mappings (), pattern.get_is_ref (),
+   pattern.get_locus (), pattern.is_mut ());
+}
+
+void
+PatternBindingBuilder::visit (HIR::ReferencePattern &pattern)
+{
+  SavedState saved (this);
+
+  init = init.map ([&] (PlaceId id) {
+return ctx.place_db.lookup_or_add_path (Place::DEREF, lookup_type 
(pattern),
+   id);
+  });
+
+  type_annotation = type_annotation.map ([&] (TyTy::BaseType *ty) {
+return ty->as ()->get_base ();
+  });
+
+  pattern.get_referenced_pattern ()->accept_vis (*this);
+}
+
+void
+PatternBindingBuilder::visit (HIR::SlicePattern &pattern)
+{
+  SavedState saved (this);
+
+  // All indexes are supposed to point to the same place for borrow-checking.
+  // init = ctx.place_db.lookup_or_add_path (Place::INDEX, lookup_type
+  // (pattern), saved.init);
+  init = init.map ([&] (PlaceId id) {
+return ctx.place_db.lookup_or_add_path (Place::INDEX, lookup_type 
(pattern),
+   id);
+  });
+
+  type_annotation = type_annotation.map ([&] (TyTy::BaseType *ty) {
+return ty->as ()->get_element_type ();
+  });
+
+  // Regions are unchnaged.
+
+  for (auto &item : pattern.get_items ())
+{
+  item->accept_vis (*this);
+}
+}
+
+void
+PatternBindingBuilder::visit (HIR::AltPattern &pattern)
+{
+  rust_sorry_at (pattern.get_locus (),
+"borrow-checking of alt patterns is not yet implemented");
+}
+
+void
+PatternBindingBuilder::visit (HIR::StructPattern &pattern)
+{
+  SavedState saved (this);
+
+  auto tyty = ctx.place_db[init.value ()].tyty;
+  rust_assert (tyty->get_kind () == TyTy::ADT);
+  auto adt_ty = static_cast (tyty);
+  rust_assert (adt_ty->is_struct_struct ());
+  auto struct_ty = adt_ty->get_variants ().at (0);
+
+  for (auto &field :
+   pattern.get_struct_pattern_elems ().get_struct_pattern_fields ())
+{
+  switch (field->get_item_type ())
+   {
+ case HIR::StructPatternField::TUPLE_PAT: {
+   auto tuple
+ = static_cast (field.get ());
+
+   init = init.map ([&] (PlaceId id) {
+ return ctx.place_db.lookup_or_add_path (
+   Place::FIELD, lookup_type (*tuple->get_tuple_pattern ()), id,
+   tuple->get_index ());
+   });
+
+   type_annotation = type_annotation.map ([&] (TyTy::BaseType *ty) {
+ return ty->as ()
+   ->get_variants ()
+   .at (0)
+   ->get_fields ()
+   .at (tuple->get_index ())
+   ->get_field_type ();
+   });
+
+   tuple-

[Bug rust/119508] Hundreds of rust tests XPASS

2025-04-04 Thread mark at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119508

Mark Wielaard  changed:

   What|Removed |Added

   Last reconfirmed||2025-04-04
 Ever confirmed|0   |1
 Status|UNCONFIRMED |NEW

--- Comment #6 from Mark Wielaard  ---
Same on the buildbot (which indeed runs make check -j$(nproc)).
https://builder.sourceware.org/buildbot/#/builders?tags=gccrust

See also
https://inbox.sourceware.org/gcc-rust/e4fa6922ce9fad8a338eecb8b3eb58f457f153ba.ca...@klomp.org/

-- 
You are receiving this mail because:
You are on the CC list for the bug.

[COMMITTED 065/146] gccrs: lang-items: Store NodeId mappings for lang items

2025-04-04 Thread arthur . cohen
From: Arthur Cohen 

gcc/rust/ChangeLog:

* util/rust-hir-map.h: Keep a NodeId mappings for lang items.
* util/rust-hir-map.cc (Mappings::insert_lang_item_node): New function.
(Mappings::lookup_lang_item_node): Likewise.
---
 gcc/rust/util/rust-hir-map.cc | 22 ++
 gcc/rust/util/rust-hir-map.h  |  8 
 2 files changed, 30 insertions(+)

diff --git a/gcc/rust/util/rust-hir-map.cc b/gcc/rust/util/rust-hir-map.cc
index 5f77f570073..f11a77954ae 100644
--- a/gcc/rust/util/rust-hir-map.cc
+++ b/gcc/rust/util/rust-hir-map.cc
@@ -1241,6 +1241,9 @@ Mappings::lookup_builtin_marker ()
   return builtinMarker;
 }
 
+// FIXME: Before merging: Should we remove the `locus` parameter here? since
+// lang items are looked up mostly for code generation, it doesn't make sense 
to
+// error out on the locus of the node trying to access an inexistant lang item
 DefId
 Mappings::get_lang_item (LangItem::Kind item_type, location_t locus)
 {
@@ -1277,5 +1280,24 @@ Mappings::lookup_lang_item (LangItem::Kind item_type)
   return it->second;
 }
 
+void
+Mappings::insert_lang_item_node (LangItem::Kind item_type, NodeId node_id)
+{
+  auto it = lang_item_nodes.find (item_type);
+  rust_assert (it == lang_item_nodes.end ());
+
+  lang_item_nodes.insert ({item_type, node_id});
+}
+
+tl::optional
+Mappings::lookup_lang_item_node (LangItem::Kind item_type)
+{
+  auto it = lang_item_nodes.find (item_type);
+  if (it == lang_item_nodes.end ())
+return tl::nullopt;
+
+  return it->second;
+}
+
 } // namespace Analysis
 } // namespace Rust
diff --git a/gcc/rust/util/rust-hir-map.h b/gcc/rust/util/rust-hir-map.h
index 14a0514338b..aba51be4827 100644
--- a/gcc/rust/util/rust-hir-map.h
+++ b/gcc/rust/util/rust-hir-map.h
@@ -259,6 +259,9 @@ public:
   void insert_lang_item (LangItem::Kind item_type, DefId id);
   tl::optional lookup_lang_item (LangItem::Kind item_type);
 
+  void insert_lang_item_node (LangItem::Kind item_type, NodeId node_id);
+  tl::optional lookup_lang_item_node (LangItem::Kind item_type);
+
   // This will fatal_error when this lang item does not exist
   DefId get_lang_item (LangItem::Kind item_type, location_t locus);
 
@@ -375,7 +378,12 @@ private:
   std::map hirGenericParamMappings;
   std::map hirTraitItemsToTraitMappings;
   std::map hirPatternMappings;
+
+  // We need to have two maps here, as lang-items need to be used for both AST
+  // passes and HIR passes. Thus those two maps are created at different times.
   std::map lang_item_mappings;
+  std::map lang_item_nodes;
+
   std::map paths;
   std::map locations;
   std::map nodeIdToHirMappings;
-- 
2.45.2



[COMMITTED 25/35] gccrs: Fix ICE when compiling path which resolves to trait constant

2025-04-04 Thread arthur . cohen
From: Philip Herron 

Fixes Rust-GCC#3552

gcc/rust/ChangeLog:

* backend/rust-compile-resolve-path.cc (HIRCompileBase::query_compile): 
check for Expr trait
* hir/rust-hir-dump.cc (Dump::visit): expr is optional

gcc/testsuite/ChangeLog:

* rust/compile/issue-3552.rs: New test.

Signed-off-by: Philip Herron 
---
 gcc/rust/backend/rust-compile-resolve-path.cc | 21 +++
 gcc/rust/hir/rust-hir-dump.cc |  4 +++-
 gcc/testsuite/rust/compile/issue-3552.rs  | 14 +
 3 files changed, 38 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/rust/compile/issue-3552.rs

diff --git a/gcc/rust/backend/rust-compile-resolve-path.cc 
b/gcc/rust/backend/rust-compile-resolve-path.cc
index 2b6880c9b1a..115dd046465 100644
--- a/gcc/rust/backend/rust-compile-resolve-path.cc
+++ b/gcc/rust/backend/rust-compile-resolve-path.cc
@@ -301,6 +301,27 @@ HIRCompileBase::query_compile (HirId ref, TyTy::BaseType 
*lookup,
trait->get_mappings ().get_defid (), &trait_ref);
  rust_assert (ok);
 
+ if (trait_item.value ()->get_item_kind ()
+ == HIR::TraitItem::TraitItemKind::CONST)
+   {
+ auto &c
+   = *static_cast (trait_item.value ());
+ if (!c.has_expr ())
+   {
+ rich_location r (line_table, expr_locus);
+ r.add_range (trait->get_locus ());
+ r.add_range (c.get_locus ());
+ rust_error_at (r, "no default expression on trait constant");
+ return error_mark_node;
+   }
+
+ return CompileExpr::Compile (c.get_expr (), ctx);
+   }
+
+ if (trait_item.value ()->get_item_kind ()
+ != HIR::TraitItem::TraitItemKind::FUNC)
+   return error_mark_node;
+
  // the type resolver can only resolve type bounds to their trait
  // item so its up to us to figure out if this path should resolve
  // to an trait-impl-block-item or if it can be defaulted to the
diff --git a/gcc/rust/hir/rust-hir-dump.cc b/gcc/rust/hir/rust-hir-dump.cc
index d4958410013..0a9d617a919 100644
--- a/gcc/rust/hir/rust-hir-dump.cc
+++ b/gcc/rust/hir/rust-hir-dump.cc
@@ -1932,7 +1932,9 @@ Dump::visit (TraitItemConst &e)
 
   put_field ("name", e.get_name ().as_string ());
   visit_field ("type", e.get_type ());
-  visit_field ("expr", e.get_expr ());
+  if (e.has_expr ())
+visit_field ("expr", e.get_expr ());
+
   end ("TraitItemConst");
 }
 
diff --git a/gcc/testsuite/rust/compile/issue-3552.rs 
b/gcc/testsuite/rust/compile/issue-3552.rs
new file mode 100644
index 000..9a4451b14b8
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-3552.rs
@@ -0,0 +1,14 @@
+trait Foo {
+const BAR: u32;
+}
+
+const TRAIT_REF_BAR: u32 = ::BAR;
+// { dg-error "no default expression on trait constant" "" { target *-*-* } 
.-1 }
+
+struct GlobalTraitRef;
+
+impl Foo for GlobalTraitRef {
+const BAR: u32 = TRAIT_REF_BAR;
+}
+
+fn main() {}
-- 
2.49.0



☺ Buildbot (Sourceware): gccrust - build successful (master)

2025-04-04 Thread builder
A restored build has been detected on builder gccrust-fedora-x86_64 while 
building gccrust.

Full details are available at:
https://builder.sourceware.org/buildbot/#/builders/16/builds/3431

Build state: build successful
Revision: 9554470e7f876f8b05f2620ecca376c319191d1d
Worker: bb2-1
Build Reason: (unknown)
Blamelist: 0xn4utilus , Aldy Hernandez 
, Alex Coplan , Alexander Westbrooks 
, Alexandre Oliva , Andre Simoes 
Dias Vieira , Andre Vieira 
, Andreas Schwab , Andrew 
Carlotti , Andrew Pinski , 
Andrew Stubbs , Antoni Boucher , Antonio 
Gomes , Arthur Cohen , 
Benjamin Thos , Bernhard Reutner-Fischer 
, Brian Inglis , Christoph Müllner 
, Christophe Lyon , 
Chung-Lin Tang , CohenArthur , 
Cupertino Miranda , Daniel Cederman 
, David Faust , David Malcolm , Dimitar Dimitrov 
, Dylan Gardner , Edwin Lu 
, Eric Botcazou , Fangrui Song 
, Fangrui Song , Filip Kastl 
, Francois-Xavier Coudert , François 
Dumont , GCC Administrator , GS-GOAT 
<86884129+gs-g...@users.noreply.github.com>, Gaius Mulley 
, Georg-Johann Lay , Gerald Pfeifer 
, Greg McGary , H.J. Lu <(no_default)>, 
H.J. Lu , Hans-Peter Nilsson , Hans-Peter 
Nilsson , Haochen Gui , Haochen Jiang 
, Harald Anlauf , Huanghui Nie 
, Iain Buclaw , Iain Sandoe 
, Ian Lance Taylor , Ilya L
 eoshkevich , Jakub Dupak , Jakub 
Jelinek , Jan Dubiec , Jan Hubicka 
, Jarkko Sakkinen , Jason Merrill 
, Jeevitha , Jeff Law 
, Jerry DeLisle , Jiahao Xu 
, Jin Ma , JoanVC 
, John David Anglin , Jonathan 
Wakely , Jonathan Yong <10wa...@gmail.com>, Jose E. 
Marchesi , Joseph Myers , 
Juergen Christ , Jun Sha (Joshua) 
, Juzhe-Zhong , Ken 
Matsui , Kewen Lin , Khem Raj 
, Kito Cheng , Kuan-Lin Chen 
, Kushal Pal , Kwok Cheung Yeung 
, Kwok Cheung Yeung , Lehua Ding 
, Lewis Hyatt , Li Wei 
, Liam Naddell , Liam Naddell 
, Lulu Cheng , M V V S Manoj Kumar 
, Maciej W. Rozycki , Maciej W. 
Rozycki , Mael Cravero , Manos 
Anagnostakis , Marc Poulhiès , 
Marc Poulhiès , Marek Polacek , Mark 
Wielaard , Martin Jambor , Martin Uecker 
, Mary Bennett , Matteo Italia 
, Matthieu Longo , Maxim Kuvyrkov 
, Mikael Morin , Mikael 
Pettersson , Monk Chiang , 
Muhammad Mahad , Nathaniel Shead , Nirmal Patel 
, Nobel , Nobel Singh 
, Oleg Endo , Om Swaroop Nayak 
<96killera...@gmail.com>, Owen Avery , Palmer 
Dabbelt , Pan Li , Patrick O'Neill 
, Patrick Palka , Paul Keir 
, Peter Bergner , Peter Hill 
, Philip Herron , 
Pierre-Emmanuel Patry , Prajwal S N 
, Prathamesh Kulkarni 
, Raiki Tamura , Rainer 
Orth , Richard Ball , 
Richard Biener , Richard Earnshaw , 
Richard Sandiford , Robert Goss 
, Ro
 bin Dapp , Robin Dapp , Roger 
Sayle , Ronan Desplanques 
, Ryutaro Okada <1015ry...@gmail.com>, SIGMazer 
, Sahil Yeole , Sam James 
, Sandra Loosemore , Sandra Loosemore 
, Saurabh Jha , Sri Ganesh 
Thota , Stam Markianos-Wright 
, Steve Kargl , Szabolcs Nagy 
, Takayuki 'January June' Suwa 
, Tamar Christina , Tejas 
Belagod , Thomas Schwinge , 
Tobias Burnus , Tom Tromey , Torbjörn 
SVENSSON , Uros Bizjak , 
Victor Do Nascimento , Vineet Gupta <
 vine...@rivosinc.com>, Vladimir N. Makarov , Wilco 
Dijkstra , Will Hawkins , Xi Ruoyao 
, Yang Yujie , Yanzhang Wang 
, YunQiang Su , YunQiang Su 
, Zac Walker , ansh 
, badumbatish , benjamin.thos 
, chenguoqi , chenxiaolong 
, dave , demin.han 
, jjasmine , lishin 
, liuhongt , liushuyu 
, waffl3x , xuli 
, zhanghe9702 

Steps:

- 0: worker_preparation ( success )

- 1: git checkout ( success )
Logs:
- stdio: 
https://builder.sourceware.org/buildbot/#/builders/16/builds/3431/steps/1/logs/stdio

- 2: rm -rf gccrs-build ( success )
Logs:
- stdio: 
https://builder.sourceware.org/buildbot/#/builders/16/builds/3431/steps/2/logs/stdio

- 3: configure ( success )
Logs:
- stdio: 
https://builder.sourceware.org/buildbot/#/builders/16/builds/3431/steps/3/logs/stdio
- config.log: 
https://builder.sourceware.org/buildbot/#/builders/16/builds/3431/steps/3/logs/config_log

- 4: make ( warnings )
Logs:
- stdio: 
https://builder.sourceware.org/buildbot/#/builders/16/builds/3431/steps/4/logs/stdio
- warnings (19): 
https://builder.sourceware.org/buildbot/#/builders/16/builds/3431/steps/4/logs/warnings__19_

- 5: make check ( warnings )
Logs:
- stdio: 
https://builder.sourceware.org/buildbot/#/builders/16/builds/3431/steps/5/logs/stdio
- rust.sum: 
https://builder.sourceware.org/buildbot/#/builders/16/builds/3431/steps/5/logs/rust_sum
- rust.log: 
https://builder.sourceware.org/buildbot/#/builders/16/builds/3431/steps/5/logs/rust_log
- warnings (6): 
https://builder.sourceware.org/buildbot/#/builders/16/builds/3431/steps/5/logs/warnings__6_

- 6: grep FAIL or unexpected rust.sum ( success )
Logs:
- stdio: 
https://builder.sourceware.org/buildbot/#/builders/16/builds/3431/steps/6/logs/stdio

- 7: prep ( success )
Logs:
- stdio: 
https://builder.sourceware.org/buildbot/#/builders/16/builds/3431/steps/7/logs/stdio

- 8: build b

[COMMITTED 28/35] gccrs: nr2.0: Rename prelude to lang_prelude

2025-04-04 Thread arthur . cohen
From: Owen Avery 

gcc/rust/ChangeLog:

* resolve/rust-forever-stack.h
(ForeverStack::get_prelude): Rename to...
(ForeverStack::get_lang_prelude): ...here.
(ForeverStack::prelude): Rename to...
(ForeverStack::lang_prelude): ...here.
(ForeverStack::ForeverStack): Handle renames.
* resolve/rust-forever-stack.hxx
(ForeverStack::push_inner): Likewise.
(ForeverStack::resolve_segments): Likewise.
(ForeverStack::resolve_path): Likewise.
(ForeverStack::get_prelude): Rename to...
(ForeverStack::get_lang_prelude): ...here and handle renames.
* resolve/rust-late-name-resolver-2.0.cc
(Late::visit): Handle renames.

Signed-off-by: Owen Avery 
---
 gcc/rust/resolve/rust-forever-stack.h   |  8 
 gcc/rust/resolve/rust-forever-stack.hxx | 17 +
 gcc/rust/resolve/rust-late-name-resolver-2.0.cc |  2 +-
 3 files changed, 14 insertions(+), 13 deletions(-)

diff --git a/gcc/rust/resolve/rust-forever-stack.h 
b/gcc/rust/resolve/rust-forever-stack.h
index d86212073b8..f390e3889df 100644
--- a/gcc/rust/resolve/rust-forever-stack.h
+++ b/gcc/rust/resolve/rust-forever-stack.h
@@ -548,7 +548,7 @@ template  class ForeverStack
 public:
   ForeverStack ()
 : root (Node (Rib (Rib::Kind::Normal), UNKNOWN_NODEID)),
-  prelude (Node (Rib (Rib::Kind::Prelude), UNKNOWN_NODEID, root)),
+  lang_prelude (Node (Rib (Rib::Kind::Prelude), UNKNOWN_NODEID, root)),
   cursor_reference (root)
   {
 rust_assert (root.is_root ());
@@ -658,8 +658,8 @@ public:
* the current map, an empty one otherwise.
*/
   tl::optional get (const Identifier &name);
-  tl::optional get_prelude (const Identifier &name);
-  tl::optional get_prelude (const std::string &name);
+  tl::optional get_lang_prelude (const Identifier &name);
+  tl::optional get_lang_prelude (const std::string &name);
 
   /**
* Resolve a path to its definition in the current `ForeverStack`
@@ -767,7 +767,7 @@ private:
* It has the root node as a parent, and acts as a "special case" for name
* resolution
*/
-  Node prelude;
+  Node lang_prelude;
 
   std::reference_wrapper cursor_reference;
 
diff --git a/gcc/rust/resolve/rust-forever-stack.hxx 
b/gcc/rust/resolve/rust-forever-stack.hxx
index fbe537d3b41..885f2820684 100644
--- a/gcc/rust/resolve/rust-forever-stack.hxx
+++ b/gcc/rust/resolve/rust-forever-stack.hxx
@@ -77,7 +77,7 @@ ForeverStack::push_inner (Rib rib, Link link)
   rust_assert (&cursor_reference.get () == &root);
   // Prelude doesn't have an access path
   rust_assert (!link.path);
-  update_cursor (this->prelude);
+  update_cursor (this->lang_prelude);
   return;
 }
   // If the link does not exist, we create it and emplace a new `Node` with the
@@ -319,16 +319,16 @@ ForeverStack::get (const Identifier &name)
 
 template 
 tl::optional
-ForeverStack::get_prelude (const Identifier &name)
+ForeverStack::get_lang_prelude (const Identifier &name)
 {
-  return prelude.rib.get (name.as_string ());
+  return lang_prelude.rib.get (name.as_string ());
 }
 
 template 
 tl::optional
-ForeverStack::get_prelude (const std::string &name)
+ForeverStack::get_lang_prelude (const std::string &name)
 {
-  return prelude.rib.get (name);
+  return lang_prelude.rib.get (name);
 }
 
 template <>
@@ -571,7 +571,7 @@ ForeverStack::resolve_segments (
  if (current_node->is_root () && !searched_prelude)
{
  searched_prelude = true;
- current_node = &prelude;
+ current_node = &lang_prelude;
  continue;
}
 
@@ -641,7 +641,8 @@ ForeverStack::resolve_path (
= get (unwrap_type_segment (segments.back ()).as_string ());
 
   if (!res)
-   res = get_prelude (unwrap_type_segment (segments.back ()).as_string ());
+   res = get_lang_prelude (
+ unwrap_type_segment (segments.back ()).as_string ());
 
   if (res && !res->is_ambiguous ())
insert_segment_resolution (segments.back (), res->get_node_id ());
@@ -672,7 +673,7 @@ ForeverStack::resolve_path (
 seg.is_lower_self_seg ());
   // Ok we didn't find it in the rib, Lets try the prelude...
   if (!res)
-   res = get_prelude (seg_name);
+   res = get_lang_prelude (seg_name);
 
   if (res && !res->is_ambiguous ())
insert_segment_resolution (segments.back (), res->get_node_id ());
diff --git a/gcc/rust/resolve/rust-late-name-resolver-2.0.cc 
b/gcc/rust/resolve/rust-late-name-resolver-2.0.cc
index 95df7272c75..7d323745edb 100644
--- a/gcc/rust/resolve/rust-late-name-resolver-2.0.cc
+++ b/gcc/rust/resolve/rust-late-name-resolver-2.0.cc
@@ -235,7 +235,7 @@ Late::visit (AST::IdentifierExpr &expr)
 }
   else
 {
-  if (auto type = ctx.types.get_prelude (expr.get_ident ()))
+  if (auto type = ctx.types.get_lang_prelude (expr.get_ident ()))
{
  resolved = 

[COMMITTED 137/146] gccrs: ast-builder: Add new methods around type paths.

2025-04-04 Thread arthur . cohen
From: Arthur Cohen 

gcc/rust/ChangeLog:

* ast/rust-ast-builder.cc: New functions.
* ast/rust-ast-builder.h: Declare them.
---
 gcc/rust/ast/rust-ast-builder.cc | 57 ++--
 gcc/rust/ast/rust-ast-builder.h  | 13 +++-
 2 files changed, 67 insertions(+), 3 deletions(-)

diff --git a/gcc/rust/ast/rust-ast-builder.cc b/gcc/rust/ast/rust-ast-builder.cc
index 55d59c94b52..fe80924fece 100644
--- a/gcc/rust/ast/rust-ast-builder.cc
+++ b/gcc/rust/ast/rust-ast-builder.cc
@@ -23,6 +23,7 @@
 #include "rust-expr.h"
 #include "rust-path.h"
 #include "rust-item.h"
+#include "rust-path.h"
 #include "rust-token.h"
 
 namespace Rust {
@@ -101,12 +102,27 @@ Builder::type_path_segment (std::string seg) const
 }
 
 std::unique_ptr
-Builder::generic_type_path_segment (std::string seg, GenericArgs args) const
+Builder::type_path_segment (LangItem::Kind lang_item) const
+{
+  return std::unique_ptr (
+new TypePathSegment (lang_item, loc));
+}
+
+std::unique_ptr
+Builder::type_path_segment_generic (std::string seg, GenericArgs args) const
 {
   return std::unique_ptr (
 new TypePathSegmentGeneric (PathIdentSegment (seg, loc), false, args, 
loc));
 }
 
+std::unique_ptr
+Builder::type_path_segment_generic (LangItem::Kind lang_item,
+   GenericArgs args) const
+{
+  return std::unique_ptr (
+new TypePathSegmentGeneric (lang_item, args, loc));
+}
+
 std::unique_ptr
 Builder::single_type_path (std::string type) const
 {
@@ -116,15 +132,52 @@ Builder::single_type_path (std::string type) const
   return std::unique_ptr (new TypePath (std::move (segments), loc));
 }
 
+std::unique_ptr
+Builder::single_type_path (LangItem::Kind lang_item) const
+{
+  return std::unique_ptr (new TypePath (lang_item, {}, loc));
+}
+
 std::unique_ptr
 Builder::single_generic_type_path (std::string type, GenericArgs args) const
 {
   auto segments = std::vector> ();
-  segments.emplace_back (generic_type_path_segment (type, args));
+  segments.emplace_back (type_path_segment_generic (type, args));
 
   return std::unique_ptr (new TypePath (std::move (segments), loc));
 }
 
+std::unique_ptr
+Builder::single_generic_type_path (LangItem::Kind lang_item,
+  GenericArgs args) const
+{
+  auto segments = std::vector> ();
+  segments.emplace_back (type_path_segment_generic (lang_item, args));
+
+  return std::unique_ptr (new TypePath (std::move (segments), loc));
+}
+
+TypePath
+Builder::type_path (std::unique_ptr &&segment) const
+{
+  auto segments = std::vector> ();
+  segments.emplace_back (std::move (segment));
+
+  return TypePath (std::move (segments), loc);
+}
+
+TypePath
+Builder::type_path (std::string type) const
+{
+  return type_path (type_path_segment (type));
+}
+
+TypePath
+Builder::type_path (LangItem::Kind lang_item) const
+{
+  return type_path (type_path_segment (lang_item));
+}
+
 PathInExpression
 Builder::path_in_expression (std::vector &&segments) const
 {
diff --git a/gcc/rust/ast/rust-ast-builder.h b/gcc/rust/ast/rust-ast-builder.h
index 36c0da2cff2..624cd715181 100644
--- a/gcc/rust/ast/rust-ast-builder.h
+++ b/gcc/rust/ast/rust-ast-builder.h
@@ -114,16 +114,27 @@ public:
 
   /* And similarly for type path segments */
   std::unique_ptr type_path_segment (std::string seg) const;
+  std::unique_ptr
+  type_path_segment (LangItem::Kind lang_item) const;
 
   std::unique_ptr
-  generic_type_path_segment (std::string seg, GenericArgs args) const;
+  type_path_segment_generic (std::string seg, GenericArgs args) const;
+  std::unique_ptr
+  type_path_segment_generic (LangItem::Kind lang_item, GenericArgs args) const;
 
   /* Create a Type from a single string - the most basic kind of type in our 
AST
*/
   std::unique_ptr single_type_path (std::string type) const;
+  std::unique_ptr single_type_path (LangItem::Kind lang_item) const;
 
   std::unique_ptr single_generic_type_path (std::string type,
  GenericArgs args) const;
+  std::unique_ptr single_generic_type_path (LangItem::Kind lang_item,
+ GenericArgs args) const;
+
+  TypePath type_path (std::unique_ptr &&segment) const;
+  TypePath type_path (std::string type) const;
+  TypePath type_path (LangItem::Kind lang_item) const;
 
   /**
* Create a path in expression from multiple segments (`Clone::clone`). You
-- 
2.45.2



[COMMITTED 145/146] gccrs: derive(Clone): Add lang item typepaths failure testcases to nr2 exclude

2025-04-04 Thread arthur . cohen
From: Arthur Cohen 

gcc/testsuite/ChangeLog:

* rust/compile/nr2/exclude: Add failing lang item typepaths tests.
* rust/execute/torture/derive_macro4.rs: Mark Clone as lang item.
---
 gcc/testsuite/rust/compile/nr2/exclude  | 5 +
 gcc/testsuite/rust/execute/torture/derive_macro4.rs | 1 +
 2 files changed, 6 insertions(+)

diff --git a/gcc/testsuite/rust/compile/nr2/exclude 
b/gcc/testsuite/rust/compile/nr2/exclude
index 1a9c8e7113a..60322f3276a 100644
--- a/gcc/testsuite/rust/compile/nr2/exclude
+++ b/gcc/testsuite/rust/compile/nr2/exclude
@@ -146,4 +146,9 @@ cmp1.rs
 derive_clone_enum1.rs
 derive_clone_enum2.rs
 derive_clone_enum3.rs
+derive_macro4.rs
+derive_macro6.rs
+issue-2987.rs
+issue-3139-1.rs
+issue-3139-3.rs
 # please don't delete the trailing newline
diff --git a/gcc/testsuite/rust/execute/torture/derive_macro4.rs 
b/gcc/testsuite/rust/execute/torture/derive_macro4.rs
index c355ac7905f..38c4808574a 100644
--- a/gcc/testsuite/rust/execute/torture/derive_macro4.rs
+++ b/gcc/testsuite/rust/execute/torture/derive_macro4.rs
@@ -1,6 +1,7 @@
 #[lang = "sized"]
 pub trait Sized {}
 
+#[lang = "clone"]
 pub trait Clone {
 fn clone(&self) -> Self;
 }
-- 
2.45.2



[COMMITTED 111/146] gccrs: Visit the trait paths of trait implementations

2025-04-04 Thread arthur . cohen
From: Owen Avery 

gcc/rust/ChangeLog:

* ast/rust-ast-visitor.cc
(DefaultASTVisitor::visit): When visiting a TraitImpl, visit its
trait path.

gcc/testsuite/ChangeLog:

* rust/compile/nr2/exclude: Remove entries.

Signed-off-by: Owen Avery 
---
 gcc/rust/ast/rust-ast-visitor.cc   |  1 +
 gcc/testsuite/rust/compile/nr2/exclude | 46 --
 2 files changed, 1 insertion(+), 46 deletions(-)

diff --git a/gcc/rust/ast/rust-ast-visitor.cc b/gcc/rust/ast/rust-ast-visitor.cc
index 32e8025e9b2..d10ca6ca07b 100644
--- a/gcc/rust/ast/rust-ast-visitor.cc
+++ b/gcc/rust/ast/rust-ast-visitor.cc
@@ -1039,6 +1039,7 @@ DefaultASTVisitor::visit (AST::TraitImpl &impl)
   if (impl.has_where_clause ())
 visit (impl.get_where_clause ());
   visit (impl.get_type ());
+  visit (impl.get_trait_path ());
   visit_inner_attrs (impl);
   for (auto &item : impl.get_impl_items ())
 visit (item);
diff --git a/gcc/testsuite/rust/compile/nr2/exclude 
b/gcc/testsuite/rust/compile/nr2/exclude
index 9b1ee7ceaf9..9b490c18bab 100644
--- a/gcc/testsuite/rust/compile/nr2/exclude
+++ b/gcc/testsuite/rust/compile/nr2/exclude
@@ -13,7 +13,6 @@ cfg4.rs
 cfg5.rs
 closure_no_type_anno.rs
 complex-path1.rs
-complex_qualified_path_in_expr.rs
 const-issue1440.rs
 const_generics_3.rs
 const_generics_4.rs
@@ -21,12 +20,8 @@ const_generics_5.rs
 const_generics_7.rs
 derive_empty.rs
 derive_macro1.rs
-derive_macro3.rs
-derive_macro4.rs
-derive_macro6.rs
 expected_type_args2.rs
 feature_rust_attri0.rs
-for_lifetimes.rs
 format_args_basic_expansion.rs
 generic-default1.rs
 generics1.rs
@@ -38,9 +33,6 @@ generics5.rs
 generics6.rs
 generics9.rs
 if_let_expr.rs
-issue-1019.rs
-issue-1034.rs
-issue-1129-2.rs
 issue-1130.rs
 issue-1173.rs
 issue-1272.rs
@@ -52,24 +44,12 @@ issue-1786.rs
 issue-1893.rs
 issue-1901.rs
 issue-1981.rs
-issue-2019-1.rs
-issue-2019-2.rs
-issue-2019-3.rs
 issue-2036.rs
-issue-2037.rs
 issue-2043.rs
-issue-2070.rs
-issue-2135.rs
-issue-2136-1.rs
 issue-2136-2.rs
-issue-2139.rs
 issue-2142.rs
-issue-2165.rs
-issue-2166.rs
 issue-2238.rs
-issue-2304.rs
 issue-2330.rs
-issue-2478.rs
 issue-2479.rs
 issue-2723-1.rs
 issue-2723-2.rs
@@ -80,10 +60,8 @@ issue-2812.rs
 issue-850.rs
 issue-852.rs
 issue-855.rs
-issue-925.rs
 iterators1.rs
 lookup_err1.rs
-macros/mbe/macro-issue1400.rs
 macros/mbe/macro13.rs
 macros/mbe/macro15.rs
 macros/mbe/macro23.rs
@@ -111,7 +89,6 @@ name_resolution4.rs
 nested_macro_use1.rs
 nested_macro_use2.rs
 nested_macro_use3.rs
-non_member_const.rs
 not_find_value_in_scope.rs
 parse_associated_type_as_generic_arg.rs
 parse_associated_type_as_generic_arg2.rs
@@ -135,17 +112,10 @@ redef_error5.rs
 self-path1.rs
 self-path2.rs
 sizeof-stray-infer-var-bug.rs
-stmt_with_block_dot.rs
 struct-expr-parse.rs
-traits1.rs
-traits12.rs
-traits2.rs
 traits3.rs
-traits4.rs
-traits5.rs
 traits6.rs
 traits7.rs
-traits8.rs
 type-bindings1.rs
 unconstrained_type_param.rs
 undeclared_label.rs
@@ -154,27 +124,13 @@ use_2.rs
 v0-mangle1.rs
 v0-mangle2.rs
 while_break_expr.rs
-negative_impls.rs
 exhaustiveness1.rs
 exhaustiveness2.rs
 exhaustiveness3.rs
-trait13.rs
-trait14.rs
 issue-2324-1.rs
 issue-2324-2.rs
-issue-2987.rs
-issue-3045-1.rs
-issue-3045-2.rs
 issue-3046.rs
-issue-3030.rs
-issue-3035.rs
-issue-3139-1.rs
 issue-3139-2.rs
-issue-3139-3.rs
-issue-3036.rs
-issue-2951.rs
-issue-2203.rs
-issue-2499.rs
 issue-3032-1.rs
 issue-3032-2.rs
 # https://github.com/Rust-GCC/gccrs/issues/3189
@@ -184,13 +140,11 @@ issue-3033.rs
 issue-3009.rs
 issue-2953-2.rs
 issue-1773.rs
-issue-2905-1.rs
 issue-2905-2.rs
 issue-2907.rs
 issue-2423.rs
 issue-266.rs
 additional-trait-bounds2.rs
-auto_traits2.rs
 auto_traits3.rs
 issue-3140.rs
 cmp1.rs
-- 
2.45.2



[COMMITTED 024/146] gccrs: Improve handling of implicit Self parameter in AST

2025-04-04 Thread arthur . cohen
From: Owen Avery 

gcc/rust/ChangeLog:

* ast/rust-item.h
(Trait::self_param): Add.
(Trait::Trait): Initialize self_param.
(Trait::operator=): Copy self_param.
(Trait::insert_implicit_self): Remove.
(Trait::get_implicit_self): Add.
* hir/rust-ast-lower-item.cc
(ASTLoweringItem::visit): Make sure implicit self is still
lowered to HIR.
* resolve/rust-ast-resolve-item.cc
(ResolveItem::visit): Adjust handling of implicit self.
* resolve/rust-early-name-resolver.cc
(EarlyNameResolver::visit): Add commit to Trait visitor
mentioning that implicit self is not visited.
* resolve/rust-toplevel-name-resolver-2.0.cc
(TopLevel::visit): Remove call to Trait::insert_implicit_self.

gcc/testsuite/ChangeLog:

* rust/compile/nr2/exclude: Remove entries.
* rust/link/generic_function_0.rs: No longer expect failure.
* rust/link/trait_import_0.rs: Likewise.
* rust/link/trait_import_1.rs
(trait Sized): Add.

Signed-off-by: Owen Avery 
---
 gcc/rust/ast/rust-item.h  | 23 ++-
 gcc/rust/hir/rust-ast-lower-item.cc   |  6 +
 gcc/rust/resolve/rust-ast-resolve-item.cc | 12 +++---
 gcc/rust/resolve/rust-early-name-resolver.cc  |  2 ++
 .../rust-toplevel-name-resolver-2.0.cc| 17 --
 gcc/testsuite/rust/compile/nr2/exclude|  9 
 gcc/testsuite/rust/link/generic_function_0.rs |  3 ---
 gcc/testsuite/rust/link/trait_import_0.rs |  3 ---
 gcc/testsuite/rust/link/trait_import_1.rs |  3 +++
 9 files changed, 21 insertions(+), 57 deletions(-)

diff --git a/gcc/rust/ast/rust-item.h b/gcc/rust/ast/rust-item.h
index 2ae7c44398b..6611707a9a6 100644
--- a/gcc/rust/ast/rust-item.h
+++ b/gcc/rust/ast/rust-item.h
@@ -2831,6 +2831,7 @@ class Trait : public VisItem
   bool has_auto;
   Identifier name;
   std::vector> generic_params;
+  TypeParam self_param;
   std::vector> type_param_bounds;
   WhereClause where_clause;
   std::vector inner_attrs;
@@ -2870,7 +2871,7 @@ public:
 std::vector inner_attrs, location_t locus)
 : VisItem (std::move (vis), std::move (outer_attrs)),
   has_unsafe (is_unsafe), has_auto (is_auto), name (std::move (name)),
-  generic_params (std::move (generic_params)),
+  generic_params (std::move (generic_params)), self_param ({"Self"}, 
locus),
   type_param_bounds (std::move (type_param_bounds)),
   where_clause (std::move (where_clause)),
   inner_attrs (std::move (inner_attrs)),
@@ -2880,8 +2881,9 @@ public:
   // Copy constructor with vector clone
   Trait (Trait const &other)
 : VisItem (other), has_unsafe (other.has_unsafe), has_auto 
(other.has_auto),
-  name (other.name), where_clause (other.where_clause),
-  inner_attrs (other.inner_attrs), locus (other.locus)
+  name (other.name), self_param (other.self_param),
+  where_clause (other.where_clause), inner_attrs (other.inner_attrs),
+  locus (other.locus)
   {
 generic_params.reserve (other.generic_params.size ());
 for (const auto &e : other.generic_params)
@@ -2901,6 +2903,7 @@ public:
   {
 VisItem::operator= (other);
 name = other.name;
+self_param = other.self_param;
 has_unsafe = other.has_unsafe;
 has_auto = other.has_auto;
 where_clause = other.where_clause;
@@ -2968,19 +2971,7 @@ public:
 
   WhereClause &get_where_clause () { return where_clause; }
 
-  void insert_implict_self (std::unique_ptr &¶m)
-  {
-std::vector> new_list;
-new_list.reserve (generic_params.size () + 1);
-
-new_list.push_back (std::move (param));
-for (auto &p : generic_params)
-  {
-   new_list.push_back (std::move (p));
-  }
-
-generic_params = std::move (new_list);
-  }
+  AST::TypeParam &get_implicit_self () { return self_param; }
 
 protected:
   /* Use covariance to implement clone function as returning this object
diff --git a/gcc/rust/hir/rust-ast-lower-item.cc 
b/gcc/rust/hir/rust-ast-lower-item.cc
index 171737ab029..ae938d98658 100644
--- a/gcc/rust/hir/rust-ast-lower-item.cc
+++ b/gcc/rust/hir/rust-ast-lower-item.cc
@@ -572,6 +572,12 @@ ASTLoweringItem::visit (AST::Trait &trait)
   generic_params = lower_generic_params (trait.get_generic_params ());
 }
 
+  // TODO: separate "Self" from normal generic parameters
+  //   in HIR as well as in AST?
+  HIR::GenericParam *self_param
+= ASTLowerGenericParam::translate (trait.get_implicit_self ());
+  generic_params.emplace (generic_params.begin (), self_param);
+
   std::vector> type_param_bounds;
   if (trait.has_type_param_bounds ())
 {
diff --git a/gcc/rust/resolve/rust-ast-resolve-item.cc 
b/gcc/rust/resolve/rust-ast-resolve-item.cc
index 34098bce0de..2861fb94d9f 100644
--- a/gcc/rust/resolve/rust-ast-resolve-item.cc
+++ b/gcc/rust/resolve/rust-ast-resolve-item.cc
@@ -755,20 +755,14 @@ ResolveItem::visit (AST::Trait &trait)
   re

☺ Buildbot (Sourceware): gccrust - build successful (master)

2025-04-04 Thread builder
A restored build has been detected on builder gccrust-fedora-arm64 while 
building gccrust.

Full details are available at:
https://builder.sourceware.org/buildbot/#/builders/179/builds/2198

Build state: build successful
Revision: 9554470e7f876f8b05f2620ecca376c319191d1d
Worker: fedora-arm64
Build Reason: (unknown)
Blamelist: 0xn4utilus , Aldy Hernandez 
, Alex Coplan , Alexander Westbrooks 
, Alexandre Oliva , Andre Simoes 
Dias Vieira , Andre Vieira 
, Andreas Schwab , Andrew 
Carlotti , Andrew Pinski , 
Andrew Stubbs , Antoni Boucher , Antonio 
Gomes , Arthur Cohen , 
Benjamin Thos , Bernhard Reutner-Fischer 
, Brian Inglis , Charalampos 
Mitrodimas , Christoph Müllner 
, Christophe Lyon , 
Chung-Lin Tang , CohenArthur , 
Cupertino Miranda , Daniel Cederman , Dave Evans , David Faust 
, David Malcolm , Dimitar Dimitrov 
, Dylan Gardner , Edwin Lu 
, Emanuele Micheletti , 
Eric Botcazou , Fangrui Song , 
Fangrui Song , Filip Kastl , 
Francois-Xavier Coudert , François Dumont 
, GCC Administrator , GS-GOAT 
<86884129+gs-g...@users.noreply.github.com>, Gaius Mulley 
, Georg-Johann Lay , Gerald Pfeifer 
, Greg McGary , Guillaume Gomez 
, H.J. Lu <(no_default)>, H.J. Lu 
, Hans-Peter Nilsson , Hans-Peter Nilsson 
, Haochen Gui , Haochen Jiang 
, 
 Harald Anlauf , Huanghui Nie , Iain Buclaw 
, Iain Sandoe , Ian Lance Taylor 
, Ilya Leoshkevich , Jakub Dupak 
, Jakub Jelinek , Jan Dubiec 
, Jan Hubicka , Jarkko Sakkinen 
, Jason Merrill , Jeevitha 
, Jeff Law , Jerry DeLisle 
, Jiahao Xu , Jiakun Fan 
<120090...@link.cuhk.edu.cn>, Jin Ma , JoanVC 
, John David Anglin , Jonathan 
Wakely , Jonathan Yong <10wa...@gmail.com>, Jose E. 
Marchesi , Joseph Myers , 
Juergen Christ , Jun Sha (Joshua) 
, Juzhe-Zhong , Ken 
Matsui , Kewen Lin , Khem Raj , 
Kito Cheng , Kuan-Lin Chen , Kushal 
Pal , Kwok Cheung Yeung , Kwok 
Cheung Yeung , Lehua Ding , Lewis 
Hyatt , Li Wei , Liam Naddell 
, Liam Naddell , Lulu Cheng 
, M V V S Manoj Kumar , Maciej 
W. Rozycki , Maciej W. Rozycki , Mael 
Cravero , Mahmoud Mohamed , 
Manos Anagnostakis , Marc Poulhiès 
, Marc Poulhiès , Marek Polacek 
, Mark Wielaard , Martin Jambor 
, Martin Uecker , Mary Bennett 
, Matte
 o Italia , Matthew Jasper , Matthieu 
Longo , Maxim Kuvyrkov , 
Mikael Morin , Mikael Pettersson , 
Mohammed Rizan Farooqui , Monk Chiang 
, Muhammad Mahad , Nathaniel Shead 
, Nikos Alexandris 
, Nirmal Patel , Nobel 
, Nobel Singh , Oleg Endo 
, Om Swaroop Nayak <96killera...@gmail.com>, Owen Avery 
, Palmer Dabbelt , Pan Li 
, Patrick O'Neill , Patrick Palka 
, Paul Keir , Peter Bergner 
, Peter Hill , Philip Herron 
, Pierre-Emmanuel Patry , Prajwal S N , Prathamesh 
Kulkarni , Raiki Tamura 
, Rainer Orth , Richard 
Ball , Richard Biener , Richard 
Earnshaw , Richard Sandiford , 
Robert Goss , Robin Dapp , Robin 
Dapp , Roger Sayle , Ronan 
Desplanques , Ryutaro Okada <1015ry...@gmail.com>, 
SIGMazer , Sahil Yeole , Sam James 
, Sandra Loosemore , Sandra Loosemore 
, Saurabh Jha , Sebastian 
Kirmayer , Sergey Bugaev , Sri Ganesh 
Thota , Stam Markianos-Wright 
, S
 teve Kargl , Szabolcs Nagy , Tage 
Johansson , Takayuki 'January June' Suwa 
, Tamar Christina , Tejas 
Belagod , Thomas Schwinge , 
Thomas Schwinge , TieWay59 , 
Tobias Burnus , Tom Tromey , Torbjörn 
SVENSSON , Uros Bizjak , 
Victor Do Nascimento , Vineet Gupta 
, Vladimir N. Makarov , Wilco 
Dijkstra , Will Hawkins , Xi Ruoyao 
, Xiao Ma , Yang Yujie 
, Yanzhang Wang , YunQiang Su 
, YunQiang Su , Zac Walker 
, Zheyuan Chen , ansh , badumbatish 
, benjamin.thos , chenguoqi 
, chenxiaolong , dave 
, demin.han , emanuele-em 
, goar5670 , jjasmine 
, lishin , liuhongt 
, liushuyu , tieway59 
, vincent , waffl3x 
, xuli , zhanghe9702 


Steps:

- 0: worker_preparation ( success )

- 1: git checkout ( success )
Logs:
- stdio: 
https://builder.sourceware.org/buildbot/#/builders/179/builds/2198/steps/1/logs/stdio

- 2: rm -rf gccrs-build ( success )
Logs:
- stdio: 
https://builder.sourceware.org/buildbot/#/builders/179/builds/2198/steps/2/logs/stdio

- 3: configure ( success )
Logs:
- stdio: 
https://builder.sourceware.org/buildbot/#/builders/179/builds/2198/steps/3/logs/stdio
- config.log: 
https://builder.sourceware.org/buildbot/#/builders/179/builds/2198/steps/3/logs/config_log

- 4: make ( warnings )
Logs:
- stdio: 
https://builder.sourceware.org/buildbot/#/builders/179/builds/2198/steps/4/logs/stdio
- warnings (179): 
https://builder.sourceware.org/buildbot/#/builders/179/builds/2198/steps/4/logs/warnings__179_

- 5: make check ( warnings )
Logs:
- stdio: 
https://builder.sourceware.org/buildbot/#/builders/179/builds/2198/steps/5/logs/stdio
- rust.sum: 
https://builder.sourceware.org/buildbot/#/builders/179/builds/2198/steps/5/logs/rust_sum
- rust.log: 
https://builder.sourceware.org/buildbot/#/builders/179/builds/2198/steps/5/logs/rust_log
- warnings (8): 
https://builder.sourceware.org/buildbot/#/bui

[COMMITTED 26/35] gccrs: Fix ICE during const expr eval on array expressions

2025-04-04 Thread arthur . cohen
From: Philip Herron 

Array expressions are still getting turned into VIEW_CONVERT_EXPR's becuase
TYPE_MAIN_VARIANT is not set so then we might as well reuse the type-hasher
to sort this out.

Fixes Rust-GCC#3588

gcc/rust/ChangeLog:

* backend/rust-compile-context.h: only push named types
* backend/rust-compile-type.cc (TyTyResolveCompile::visit): run the 
type hasher

gcc/testsuite/ChangeLog:

* rust/compile/issue-3588.rs: New test.

Signed-off-by: Philip Herron 
---
 gcc/rust/backend/rust-compile-context.h  | 5 -
 gcc/rust/backend/rust-compile-type.cc| 2 ++
 gcc/testsuite/rust/compile/issue-3588.rs | 5 +
 3 files changed, 11 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/rust/compile/issue-3588.rs

diff --git a/gcc/rust/backend/rust-compile-context.h 
b/gcc/rust/backend/rust-compile-context.h
index a44638817db..ce81a1d0db2 100644
--- a/gcc/rust/backend/rust-compile-context.h
+++ b/gcc/rust/backend/rust-compile-context.h
@@ -72,7 +72,10 @@ public:
   return it->second;
 
 compiled_type_map.insert ({h, type});
-push_type (type);
+
+if (TYPE_NAME (type) != NULL)
+  push_type (type);
+
 return type;
   }
 
diff --git a/gcc/rust/backend/rust-compile-type.cc 
b/gcc/rust/backend/rust-compile-type.cc
index 813e11c47cf..83e5756429f 100644
--- a/gcc/rust/backend/rust-compile-type.cc
+++ b/gcc/rust/backend/rust-compile-type.cc
@@ -481,6 +481,8 @@ TyTyResolveCompile::visit (const TyTy::ArrayType &type)
   tree folded_capacity_expr = fold_expr (capacity_expr);
 
   translated = Backend::array_type (element_type, folded_capacity_expr);
+  if (translated != error_mark_node)
+translated = ctx->insert_compiled_type (translated);
 }
 
 void
diff --git a/gcc/testsuite/rust/compile/issue-3588.rs 
b/gcc/testsuite/rust/compile/issue-3588.rs
new file mode 100644
index 000..744d9671c42
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-3588.rs
@@ -0,0 +1,5 @@
+const FOO: i32 = if true { [1, 2, 3] } else { [2, 3, 4] }[0];
+
+pub fn test() -> i32 {
+FOO
+}
-- 
2.49.0



Re: [COMMITTED 136/145] gccrs: Fix nightly rustc warnings

2025-04-04 Thread Thomas Schwinge
Hi Arthur!

On 2025-03-22T15:48:18+0100, Arthur Cohen  wrote:
> Thanks for testing that commit. I think a partial revert is not
> necessary, as I'm currently
> working on our milestone to make all Rust code compile with a Rust
> 1.49 toolchain.
>
> I think pushing a partial revert upstream would just create some
> confusion when the
> correct version of the code which will fully compile with Rust 1.49
> will be on our dev repo
> in a few days or weeks. I'm hoping to upstream it on Monday or next
> Monday if I cannot
> finish it in time.
>
> I feel like holding on on this for a few days would make the process
> easier? What do you
> think?

Works for me; I'll keep this local until then.


Grüße
 Thomas


> On Sat, 22 Mar 2025 at 15:43, Thomas Schwinge  wrote:
>>
>> Hi!
>>
>> On 2025-03-17T16:33:34+0100, arthur.co...@embecosm.com wrote:
>> > From: Kushal Pal 
>> >
>> > libgrust/ChangeLog:
>> >
>> >   * libformat_parser/Cargo.toml:
>> >   Used crate-type instead of depricated crate_type.
>> >   * libformat_parser/generic_format_parser/src/lib.rs:
>> >   Remove dead code.
>> >   * libformat_parser/src/lib.rs: Likewise.
>> >
>> > Signed-off-by: Kushal Pal 
>>
>> This isn't "dead code" on a Debian "bookworm" system where I'm testing
>> with:
>>
>> $ rustc --version
>> rustc 1.63.0
>>
>> With this commit in place, I get:
>>
>> [...]
>> Making all in libformat_parser
>> make[3]: Entering directory '[...]/build-gcc/libgrust/libformat_parser'
>> cargo \
>>   --config [...]/source-gcc/libgrust/libformat_parser/.cargo/config \
>>   build \
>> --offline \
>> --target-dir . \
>> --manifest-path 
>> [...]/source-gcc/libgrust/libformat_parser/Cargo.toml \
>> # FIXME: Not always '--release', right?
>>Compiling generic_format_parser v0.1.0 
>> ([...]/source-gcc/libgrust/libformat_parser/generic_format_parser)
>> error[E0658]: use of unstable library feature 'is_some_with'
>>--> generic_format_parser/src/lib.rs:615:34
>> |
>> 615 | ...   .is_some_and(is_id_start)
>> |^^^
>> |
>> = note: see issue #93050 
>>  for more information
>>
>> error[E0631]: type mismatch in function arguments
>>--> generic_format_parser/src/lib.rs:615:46
>> |
>> 17  | fn is_id_start(c: char) -> bool {
>> | --- found signature of `fn(char) -> _`
>> ...
>> 615 | .is_some_and(is_id_start)
>> |  --- ^^^ expected 
>> signature of `for<'r> fn(&'r char) -> _`
>> |  |
>> |  required by a bound introduced by 
>> this call
>> |
>> note: required by a bound in `Optionis_some_and`
>>
>> Some errors have detailed explanations: E0631, E0658.
>> For more information about an error, try `rustc --explain E0631`.
>> error: could not compile `generic_format_parser` due to 2 previous errors
>> make[3]: *** [Makefile:431: debug/liblibformat_parser.a] Error 101
>> make[3]: Target 'all' not remade because of errors.
>> make[3]: Leaving directory '[...]/build-gcc/libgrust/libformat_parser'
>> [...]
>>
>> With this commit reverted, the build again succeeds, with good test
>> results.  May I, therefore, push a (partial, I suppose?) 'git revert' of
>> this commit?
>>
>>
>> Grüße
>>  Thomas
>>
>>
>> > ---
>> >  libgrust/libformat_parser/Cargo.toml |  2 +-
>> >  .../generic_format_parser/src/lib.rs | 16 
>> >  libgrust/libformat_parser/src/lib.rs | 14 --
>> >  3 files changed, 1 insertion(+), 31 deletions(-)
>> >
>> > diff --git a/libgrust/libformat_parser/Cargo.toml 
>> > b/libgrust/libformat_parser/Cargo.toml
>> > index 3c214915d31..39c017d249b 100644
>> > --- a/libgrust/libformat_parser/Cargo.toml
>> > +++ b/libgrust/libformat_parser/Cargo.toml
>> > @@ -14,7 +14,7 @@ libc = "0.2"
>> >  generic_format_parser = { path = "generic_format_parser" }
>> >
>> >  [lib]
>> > -crate_type = ["staticlib", "rlib"]
>> > +crate-type = ["staticlib", "rlib"]
>> >
>> >  [[bin]]
>> >  name = "format_parser_test"
>> > diff --git a/libgrust/libformat_parser/generic_format_parser/src/lib.rs 
>> > b/libgrust/libformat_parser/generic_format_parser/src/lib.rs
>> > index e255bf16908..25f6b0ead17 100644
>> > --- a/libgrust/libformat_parser/generic_format_parser/src/lib.rs
>> > +++ b/libgrust/libformat_parser/generic_format_parser/src/lib.rs
>> > @@ -22,22 +22,6 @@ fn is_id_continue(c: char) -> bool {
>> >  unicode_xid::UnicodeXID::is_xid_continue(c)
>> >  }
>> >
>> > -// Workaround for Ubuntu 18.04. The default Rust package is 1.65 (and 
>> > unlikely to change I assume?), but the
>> > -// generic format parser library uses `is_so

[COMMITTED 095/144] gccrs: imports: Add FinalizeImports class

2025-04-04 Thread arthur . cohen
From: Arthur Cohen 

gcc/rust/ChangeLog:

* Make-lang.in: Add new object file.
* ast/rust-item.h: Constify method.
* resolve/rust-early-name-resolver-2.0.cc (Early::go): Call into
the imports finalizer.
(Early::resolve_glob_import): Remove old resolution.
(Early::resolve_rebind_import): Likewise.
* resolve/rust-toplevel-name-resolver-2.0.cc (GlobbingVisitor::go):
New function.
(GlobbingVisitor::visit): Likewise.
(TopLevel::visit): Do not call into handle_use_* functions anymore.
* resolve/rust-toplevel-name-resolver-2.0.h (class GlobbingVisitor):
New.
* resolve/rust-finalize-imports-2.0.cc: New file.
* resolve/rust-finalize-imports-2.0.h: New file.
---
 gcc/rust/Make-lang.in |   1 +
 gcc/rust/ast/rust-item.h  |   2 +-
 .../resolve/rust-early-name-resolver-2.0.cc   |  31 +--
 gcc/rust/resolve/rust-finalize-imports-2.0.cc | 206 ++
 gcc/rust/resolve/rust-finalize-imports-2.0.h  |  96 
 .../rust-toplevel-name-resolver-2.0.cc| 112 --
 .../resolve/rust-toplevel-name-resolver-2.0.h |  25 +--
 7 files changed, 309 insertions(+), 164 deletions(-)
 create mode 100644 gcc/rust/resolve/rust-finalize-imports-2.0.cc
 create mode 100644 gcc/rust/resolve/rust-finalize-imports-2.0.h

diff --git a/gcc/rust/Make-lang.in b/gcc/rust/Make-lang.in
index 950cd3af073..c1a3c1fe9f3 100644
--- a/gcc/rust/Make-lang.in
+++ b/gcc/rust/Make-lang.in
@@ -131,6 +131,7 @@ GRS_OBJS = \
 rust/rust-default-resolver.o \
 rust/rust-toplevel-name-resolver-2.0.o \
 rust/rust-early-name-resolver-2.0.o \
+   rust/rust-finalize-imports-2.0.o \
 rust/rust-late-name-resolver-2.0.o \
rust/rust-immutable-name-resolution-context.o \
 rust/rust-early-name-resolver.o \
diff --git a/gcc/rust/ast/rust-item.h b/gcc/rust/ast/rust-item.h
index bd9113ffa23..2ae7c44398b 100644
--- a/gcc/rust/ast/rust-item.h
+++ b/gcc/rust/ast/rust-item.h
@@ -1213,7 +1213,7 @@ public:
 
   std::string as_string () const override;
 
-  NewBindType get_new_bind_type () { return bind_type; }
+  NewBindType get_new_bind_type () const { return bind_type; }
 
   void accept_vis (ASTVisitor &vis) override;
 
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 884c05a93c3..41d0a075bbb 100644
--- a/gcc/rust/resolve/rust-early-name-resolver-2.0.cc
+++ b/gcc/rust/resolve/rust-early-name-resolver-2.0.cc
@@ -21,6 +21,7 @@
 #include "rust-diagnostics.h"
 #include "rust-toplevel-name-resolver-2.0.h"
 #include "rust-attributes.h"
+#include "rust-finalize-imports-2.0.h"
 
 namespace Rust {
 namespace Resolver2_0 {
@@ -57,6 +58,9 @@ Early::go (AST::Crate &crate)
   for (auto &&import : toplevel.get_imports_to_resolve ())
 build_import_mapping (std::move (import));
 
+  // Once this is done, we finalize their resolution
+  FinalizeImports::go (import_mappings, toplevel, ctx);
+
   // We now proceed with resolving macros, which can be nested in almost any
   // items
   textual_scope.push ();
@@ -81,10 +85,6 @@ Early::resolve_glob_import (TopLevel::ImportKind &&glob)
   // up the module proper in `FinalizeImports`
   import_mappings.insert ({std::move (glob), resolved->get_node_id ()});
 
-  // FIXME: This needs to be done in `FinalizeImports`
-  // GlobbingVisitor gvisitor (ctx);
-  // gvisitor.go (result.value ());
-
   return true;
 }
 
@@ -169,29 +169,6 @@ Early::resolve_rebind_import (TopLevel::ImportKind 
&&rebind_import)
 {
   auto &path = rebind_import.to_resolve;
 
-  // We can fetch the value here as `resolve_rebind` will only be called on
-  // imports of the right kind
-  auto &rebind = rebind_import.rebind.value ();
-
-  location_t locus = UNKNOWN_LOCATION;
-  std::string declared_name;
-
-  // FIXME: This needs to be done in `FinalizeImports`
-  switch (rebind.get_new_bind_type ())
-{
-case AST::UseTreeRebind::NewBindType::IDENTIFIER:
-  declared_name = rebind.get_identifier ().as_string ();
-  locus = rebind.get_identifier ().get_locus ();
-  break;
-case AST::UseTreeRebind::NewBindType::NONE:
-  declared_name = path.get_final_segment ().as_string ();
-  locus = path.get_final_segment ().get_locus ();
-  break;
-case AST::UseTreeRebind::NewBindType::WILDCARD:
-  rust_unreachable ();
-  break;
-}
-
   return ctx.values.resolve_path (path.get_segments ())
 .or_else ([&] () { return ctx.types.resolve_path (path.get_segments ()); })
 .or_else ([&] () { return ctx.macros.resolve_path (path.get_segments ()); 
})
diff --git a/gcc/rust/resolve/rust-finalize-imports-2.0.cc 
b/gcc/rust/resolve/rust-finalize-imports-2.0.cc
new file mode 100644
index 000..1725e71e17b
--- /dev/null
+++ b/gcc/rust/resolve/rust-finalize-imports-2.0.cc
@@ -0,0 +1,206 @@
+// Copyright (C) 2020-2024 Free Software Foundation, Inc.
+
+// This file is part of GCC.

[COMMITTED 017/146] gccrs: Improve handling of struct expressions in nr2.0

2025-04-04 Thread arthur . cohen
From: Owen Avery 

gcc/rust/ChangeLog:

* resolve/rust-late-name-resolver-2.0.cc
(Late::visit): Handle StructExprStruct and use
ForeverStack::resolve_path instead of ForeverStack::get to
resolve struct expression paths.
* resolve/rust-late-name-resolver-2.0.h
(Late::visit): Handle StructExprStruct.

Signed-off-by: Owen Avery 
---
 gcc/rust/resolve/rust-late-name-resolver-2.0.cc | 13 +++--
 gcc/rust/resolve/rust-late-name-resolver-2.0.h  |  1 +
 2 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/gcc/rust/resolve/rust-late-name-resolver-2.0.cc 
b/gcc/rust/resolve/rust-late-name-resolver-2.0.cc
index 812154eaf79..850f96aef89 100644
--- a/gcc/rust/resolve/rust-late-name-resolver-2.0.cc
+++ b/gcc/rust/resolve/rust-late-name-resolver-2.0.cc
@@ -272,10 +272,19 @@ Late::visit (AST::StructStruct &s)
   ctx.scoped (Rib::Kind::Item, s.get_node_id (), s_vis);
 }
 
+void
+Late::visit (AST::StructExprStruct &s)
+{
+  auto resolved = ctx.types.resolve_path (s.get_struct_name ().get_segments 
());
+
+  ctx.map_usage (Usage (s.get_struct_name ().get_node_id ()),
+Definition (resolved->get_node_id ()));
+}
+
 void
 Late::visit (AST::StructExprStructBase &s)
 {
-  auto resolved = ctx.types.get (s.get_struct_name ().as_string ());
+  auto resolved = ctx.types.resolve_path (s.get_struct_name ().get_segments 
());
 
   ctx.map_usage (Usage (s.get_struct_name ().get_node_id ()),
 Definition (resolved->get_node_id ()));
@@ -285,7 +294,7 @@ Late::visit (AST::StructExprStructBase &s)
 void
 Late::visit (AST::StructExprStructFields &s)
 {
-  auto resolved = ctx.types.get (s.get_struct_name ().as_string ());
+  auto resolved = ctx.types.resolve_path (s.get_struct_name ().get_segments 
());
 
   ctx.map_usage (Usage (s.get_struct_name ().get_node_id ()),
 Definition (resolved->get_node_id ()));
diff --git a/gcc/rust/resolve/rust-late-name-resolver-2.0.h 
b/gcc/rust/resolve/rust-late-name-resolver-2.0.h
index 35fe400aeea..79572fbc4fa 100644
--- a/gcc/rust/resolve/rust-late-name-resolver-2.0.h
+++ b/gcc/rust/resolve/rust-late-name-resolver-2.0.h
@@ -47,6 +47,7 @@ public:
   void visit (AST::IdentifierExpr &) override;
   void visit (AST::PathInExpression &) override;
   void visit (AST::TypePath &) override;
+  void visit (AST::StructExprStruct &) override;
   void visit (AST::StructExprStructBase &) override;
   void visit (AST::StructExprStructFields &) override;
   void visit (AST::StructStruct &) override;
-- 
2.45.2



[COMMITTED 137/144] gccrs: Handle const generic parameters during resolution 2.0

2025-04-04 Thread arthur . cohen
From: Owen Avery 

gcc/rust/ChangeLog:

* resolve/rust-toplevel-name-resolver-2.0.cc
(TopLevel::visit): Handle ConstGenericParam.
* resolve/rust-toplevel-name-resolver-2.0.h
(TopLevel::visit): Likewise.

Signed-off-by: Owen Avery 
---
 gcc/rust/resolve/rust-toplevel-name-resolver-2.0.cc | 8 
 gcc/rust/resolve/rust-toplevel-name-resolver-2.0.h  | 1 +
 2 files changed, 9 insertions(+)

diff --git a/gcc/rust/resolve/rust-toplevel-name-resolver-2.0.cc 
b/gcc/rust/resolve/rust-toplevel-name-resolver-2.0.cc
index d3a3c5d78bc..92a115108e6 100644
--- a/gcc/rust/resolve/rust-toplevel-name-resolver-2.0.cc
+++ b/gcc/rust/resolve/rust-toplevel-name-resolver-2.0.cc
@@ -286,6 +286,14 @@ TopLevel::visit (AST::TypeParam &type_param)
 Namespace::Types);
 }
 
+void
+TopLevel::visit (AST::ConstGenericParam &const_param)
+{
+  insert_or_error_out (const_param.get_name (), const_param, 
Namespace::Values);
+
+  DefaultResolver::visit (const_param);
+}
+
 void
 TopLevel::visit (AST::TupleStruct &tuple_struct)
 {
diff --git a/gcc/rust/resolve/rust-toplevel-name-resolver-2.0.h 
b/gcc/rust/resolve/rust-toplevel-name-resolver-2.0.h
index cc301ed7fdd..e9e0306f11a 100644
--- a/gcc/rust/resolve/rust-toplevel-name-resolver-2.0.h
+++ b/gcc/rust/resolve/rust-toplevel-name-resolver-2.0.h
@@ -164,6 +164,7 @@ private:
   void visit (AST::TypeAlias &type_item) override;
   void visit (AST::ExternCrate &crate) override;
   void visit (AST::TypeParam &type_param) override;
+  void visit (AST::ConstGenericParam &const_param) override;
 
   void visit (AST::UseDeclaration &use) override;
 };
-- 
2.45.2



[COMMITTED 039/144] gccrs: Scaffolding asm codegen

2025-04-04 Thread arthur . cohen
From: jjasmine 

gcc/rust/ChangeLog:

* backend/rust-compile-block.h:
Scaffolding asm codegen
* backend/rust-compile-expr.cc (CompileExpr::visit): Likewise.
* backend/rust-compile-expr.h: Likewise.
* checks/errors/borrowck/rust-bir-builder-expr-stmt.cc 
(ExprStmtBuilder::visit): Likewise.
* checks/errors/borrowck/rust-bir-builder-expr-stmt.h: Likewise.
* checks/errors/borrowck/rust-bir-builder-lazyboolexpr.h: Likewise.
* checks/errors/privacy/rust-privacy-reporter.cc 
(PrivacyReporter::visit): Likewise.
* checks/errors/privacy/rust-privacy-reporter.h: Likewise.
* hir/tree/rust-hir-expr.h: Likewise.
* hir/tree/rust-hir-visitor.h: Likewise.
* typecheck/rust-hir-type-check-expr.cc (TypeCheckExpr::visit): 
Likewise.
* typecheck/rust-hir-type-check-expr.h: Likewise.
---
 gcc/rust/backend/rust-compile-block.h  |  2 ++
 gcc/rust/backend/rust-compile-expr.cc  |  4 
 gcc/rust/backend/rust-compile-expr.h   |  1 +
 .../errors/borrowck/rust-bir-builder-expr-stmt.cc  |  5 +
 .../errors/borrowck/rust-bir-builder-expr-stmt.h   |  1 +
 .../errors/borrowck/rust-bir-builder-lazyboolexpr.h|  2 ++
 .../checks/errors/privacy/rust-privacy-reporter.cc |  6 ++
 gcc/rust/checks/errors/privacy/rust-privacy-reporter.h |  1 +
 gcc/rust/hir/tree/rust-hir-expr.h  | 10 ++
 gcc/rust/hir/tree/rust-hir-visitor.h   |  1 +
 gcc/rust/typecheck/rust-hir-type-check-expr.cc |  6 ++
 gcc/rust/typecheck/rust-hir-type-check-expr.h  |  1 +
 12 files changed, 40 insertions(+)

diff --git a/gcc/rust/backend/rust-compile-block.h 
b/gcc/rust/backend/rust-compile-block.h
index b315c776513..d226b4be9f4 100644
--- a/gcc/rust/backend/rust-compile-block.h
+++ b/gcc/rust/backend/rust-compile-block.h
@@ -101,6 +101,7 @@ public:
   void visit (HIR::MatchExpr &) override {}
   void visit (HIR::AwaitExpr &) override {}
   void visit (HIR::AsyncBlockExpr &) override {}
+  void visit (HIR::InlineAsm &) override {}
 
 private:
   CompileConditionalBlocks (Context *ctx, Bvariable *result)
@@ -184,6 +185,7 @@ public:
   void visit (HIR::MatchExpr &) override {}
   void visit (HIR::AwaitExpr &) override {}
   void visit (HIR::AsyncBlockExpr &) override {}
+  void visit (HIR::InlineAsm &) override {}
 
 private:
   CompileExprWithBlock (Context *ctx, Bvariable *result)
diff --git a/gcc/rust/backend/rust-compile-expr.cc 
b/gcc/rust/backend/rust-compile-expr.cc
index e2fa6dda09e..e23c691d1db 100644
--- a/gcc/rust/backend/rust-compile-expr.cc
+++ b/gcc/rust/backend/rust-compile-expr.cc
@@ -318,6 +318,10 @@ CompileExpr::visit (HIR::IfExpr &expr)
   ctx->add_statement (stmt);
 }
 
+void
+CompileExpr::visit (HIR::InlineAsm &expr)
+{}
+
 void
 CompileExpr::visit (HIR::IfExprConseqElse &expr)
 {
diff --git a/gcc/rust/backend/rust-compile-expr.h 
b/gcc/rust/backend/rust-compile-expr.h
index b257da5e59c..ef907d1ca62 100644
--- a/gcc/rust/backend/rust-compile-expr.h
+++ b/gcc/rust/backend/rust-compile-expr.h
@@ -68,6 +68,7 @@ public:
   void visit (HIR::RangeFullExpr &expr) override;
   void visit (HIR::RangeFromToInclExpr &expr) override;
   void visit (HIR::ClosureExpr &expr) override;
+  void visit (HIR::InlineAsm &expr) override;
 
   // TODO
   void visit (HIR::ErrorPropagationExpr &) override {}
diff --git a/gcc/rust/checks/errors/borrowck/rust-bir-builder-expr-stmt.cc 
b/gcc/rust/checks/errors/borrowck/rust-bir-builder-expr-stmt.cc
index 3515bdf030b..8d4d90aab80 100644
--- a/gcc/rust/checks/errors/borrowck/rust-bir-builder-expr-stmt.cc
+++ b/gcc/rust/checks/errors/borrowck/rust-bir-builder-expr-stmt.cc
@@ -21,6 +21,7 @@
 #include "rust-bir-builder-lazyboolexpr.h"
 #include "rust-bir-builder-pattern.h"
 #include "rust-bir-builder-struct.h"
+#include "rust-hir-expr.h"
 
 namespace Rust {
 namespace BIR {
@@ -317,6 +318,10 @@ ExprStmtBuilder::visit (HIR::CallExpr &expr)
   expr.get_locus (), true);
 }
 
+void
+ExprStmtBuilder::visit (HIR::InlineAsm &expr)
+{}
+
 void
 ExprStmtBuilder::visit (HIR::MethodCallExpr &expr)
 {}
diff --git a/gcc/rust/checks/errors/borrowck/rust-bir-builder-expr-stmt.h 
b/gcc/rust/checks/errors/borrowck/rust-bir-builder-expr-stmt.h
index 3a58611e338..574f0f36fdd 100644
--- a/gcc/rust/checks/errors/borrowck/rust-bir-builder-expr-stmt.h
+++ b/gcc/rust/checks/errors/borrowck/rust-bir-builder-expr-stmt.h
@@ -99,6 +99,7 @@ protected: // Expr
   void visit (HIR::WhileLetLoopExpr &expr) override;
   void visit (HIR::IfExpr &expr) override;
   void visit (HIR::IfExprConseqElse &expr) override;
+  void visit (HIR::InlineAsm &expr) override;
 
   void visit (HIR::IfLetExpr &expr) override;
   void visit (HIR::IfLetExprConseqElse &expr) override;
diff --git a/gcc/rust/checks/errors/borrowck/rust-bir-builder-lazyboolexpr.h 
b/gcc/rust/checks/errors/borrowck/rust-bir-builder-lazyboolexpr.h
index 3f46d57ea51..8c1c

Пополнение игрового аккаунта на Noob-Rp

2025-04-04 Thread Noob Role Play
[Noob Role Play](https://noob-rp.ru)

Для вас был создан донат-код на сервере Noob-Rp.

Код #1: 711619

Код #2: 499657

Сумма: 5000

© 2025 Noob Role Play. All rights reserved.



[COMMITTED 119/144] gccrs: Postpone break on error after name resolution

2025-04-04 Thread arthur . cohen
From: Pierre-Emmanuel Patry 

We need the top level to run at least once before breaking because it
will be required by the other name resolution steps.

gcc/rust/ChangeLog:

* rust-session-manager.cc (Session::expansion): Break on error after
top level name resolution.

Signed-off-by: Pierre-Emmanuel Patry 
---
 gcc/rust/rust-session-manager.cc | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/gcc/rust/rust-session-manager.cc b/gcc/rust/rust-session-manager.cc
index 5668d4d65d3..11ff25062d0 100644
--- a/gcc/rust/rust-session-manager.cc
+++ b/gcc/rust/rust-session-manager.cc
@@ -925,9 +925,6 @@ Session::expansion (AST::Crate &crate, 
Resolver2_0::NameResolutionContext &ctx)
 {
   CfgStrip ().go (crate);
   // Errors might happen during cfg strip pass
-  if (saw_errors ())
-   break;
-
   bool visitor_dirty = false;
 
   if (flag_name_resolution_2_0)
@@ -940,6 +937,9 @@ Session::expansion (AST::Crate &crate, 
Resolver2_0::NameResolutionContext &ctx)
   else
Resolver::EarlyNameResolver ().go (crate);
 
+  if (saw_errors ())
+   break;
+
   ExpandVisitor (expander).go (crate);
 
   fixed_point_reached = !expander.has_changed () && !visitor_dirty;
-- 
2.45.2



[COMMITTED 100/144] gccrs: Insert imports in all namespaces they were resolved in

2025-04-04 Thread arthur . cohen
From: Arthur Cohen 

gcc/rust/ChangeLog:

* resolve/rust-early-name-resolver-2.0.cc 
(Early::resolve_simple_import):
Insert import in all namespaces where they were resolved.
(Early::resolve_rebind_import): Likewise.
* resolve/rust-early-name-resolver-2.0.h: Improve APIs, make them
accept multiple resolutions.
* resolve/rust-finalize-imports-2.0.cc: Handle multiple resolutions.
* resolve/rust-name-resolution-context.h (resolve_path): Remove 
function.
---
 .../resolve/rust-early-name-resolver-2.0.cc   | 74 +++
 .../resolve/rust-early-name-resolver-2.0.h| 66 ++---
 gcc/rust/resolve/rust-finalize-imports-2.0.cc | 17 ++---
 .../resolve/rust-name-resolution-context.h| 26 ---
 4 files changed, 106 insertions(+), 77 deletions(-)

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 47582a6f339..5201c32e24d 100644
--- a/gcc/rust/resolve/rust-early-name-resolver-2.0.cc
+++ b/gcc/rust/resolve/rust-early-name-resolver-2.0.cc
@@ -94,44 +94,54 @@ Early::resolve_glob_import (NodeId use_dec_id, 
TopLevel::ImportKind &&glob)
 bool
 Early::resolve_simple_import (NodeId use_dec_id, TopLevel::ImportKind &&import)
 {
-  return ctx.resolve_path (import.to_resolve)
-.map ([&] (std::pair def_ns) {
-  // We insert an empty vector, unless an element was already present for
-  // `use_dec_id` - which is returned in the tuple's first member
-  auto tuple = import_mappings.insert ({use_dec_id, {}});
-  // We then get that tuple's first member, which will be an iterator to 
the
-  // existing vec> OR an iterator to our newly
-  // created empty vector (plus its key since this is a hashmap iterator).
-  // we then access the second member of the pair to get access to the
-  // vector directly.
-  auto &imports = tuple.first->second;
-
-  imports.emplace_back (
-   std::make_pair (std::move (import), ImportData::Simple (def_ns)));
-})
-.has_value ();
+  auto definitions = resolve_path_in_all_ns (import.to_resolve);
+
+  // if we've found at least one definition, then we're good
+  if (definitions.empty ())
+return false;
+
+  // We insert an empty vector, unless an element was already present for
+  // `use_dec_id` - which is returned in the tuple's first member
+  auto tuple = import_mappings.insert ({use_dec_id, {}});
+  // We then get that tuple's first member, which will be an iterator to the
+  // existing vec> OR an iterator to our newly
+  // created empty vector (plus its key since this is a hashmap iterator).
+  // we then access the second member of the pair to get access to the
+  // vector directly.
+  auto &imports = tuple.first->second;
+
+  imports.emplace_back (
+std::make_pair (std::move (import),
+   ImportData::Simple (std::move (definitions;
+
+  return true;
 }
 
 bool
 Early::resolve_rebind_import (NodeId use_dec_id,
  TopLevel::ImportKind &&rebind_import)
 {
-  return ctx.resolve_path (rebind_import.to_resolve)
-.map ([&] (std::pair def_ns) {
-  // We insert an empty vector, unless an element was already present for
-  // `use_dec_id` - which is returned in the tuple's first member
-  auto tuple = import_mappings.insert ({use_dec_id, {}});
-  // We then get that tuple's first member, which will be an iterator to 
the
-  // existing vec> OR an iterator to our newly
-  // created empty vector (plus its key since this is a hashmap iterator).
-  // we then access the second member of the pair to get access to the
-  // vector directly.
-  auto &imports = tuple.first->second;
-
-  imports.emplace_back (std::make_pair (std::move (rebind_import),
-   ImportData::Rebind (def_ns)));
-})
-.has_value ();
+  auto definitions = resolve_path_in_all_ns (rebind_import.to_resolve);
+
+  // if we've found at least one definition, then we're good
+  if (definitions.empty ())
+return false;
+
+  // We insert an empty vector, unless an element was already present for
+  // `use_dec_id` - which is returned in the tuple's first member
+  auto tuple = import_mappings.insert ({use_dec_id, {}});
+  // We then get that tuple's first member, which will be an iterator to the
+  // existing vec> OR an iterator to our newly
+  // created empty vector (plus its key since this is a hashmap iterator).
+  // we then access the second member of the pair to get access to the
+  // vector directly.
+  auto &imports = tuple.first->second;
+
+  imports.emplace_back (
+std::make_pair (std::move (rebind_import),
+   ImportData::Rebind (std::move (definitions;
+
+  return true;
 }
 
 void
diff --git a/gcc/rust/resolve/rust-early-name-resolver-2.0.h 
b/gcc/rust/resolve/rust-early-name-resolver-2.0.h
index a503686508c..7d0864ee100 100644
--- a/gcc/rust/resolve/rust-earl

[COMMITTED 101/144] gccrs: nr2.0: Cleanup import mappings and factor into a class.

2025-04-04 Thread arthur . cohen
From: Arthur Cohen 

gcc/rust/ChangeLog:

* resolve/rust-early-name-resolver-2.0.h: New class for imports.
* resolve/rust-finalize-imports-2.0.cc (finalize_simple_import): Use
the new API.
(finalize_glob_import): Likewise.
(finalize_rebind_import): Likewise.
(FinalizeImports::FinalizeImports): Likewise.
(FinalizeImports::visit): Likewise.
* resolve/rust-finalize-imports-2.0.h: Likewise.
* resolve/rust-early-name-resolver-2.0.cc (Early::resolve_glob_import): 
Likewise.
(Early::resolve_simple_import): Likewise.
(Early::resolve_rebind_import): Likewise.
---
 .../resolve/rust-early-name-resolver-2.0.cc   | 33 
 .../resolve/rust-early-name-resolver-2.0.h| 51 +--
 gcc/rust/resolve/rust-finalize-imports-2.0.cc | 39 ++
 gcc/rust/resolve/rust-finalize-imports-2.0.h  | 11 ++--
 4 files changed, 75 insertions(+), 59 deletions(-)

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 5201c32e24d..c4f9b27e297 100644
--- a/gcc/rust/resolve/rust-early-name-resolver-2.0.cc
+++ b/gcc/rust/resolve/rust-early-name-resolver-2.0.cc
@@ -85,8 +85,9 @@ Early::resolve_glob_import (NodeId use_dec_id, 
TopLevel::ImportKind &&glob)
   // up the module proper in `FinalizeImports`
   // The namespace does not matter here since we are dealing with a glob
   // TODO: Ugly
-  import_mappings.insert (
-{use_dec_id, {{std::move (glob), ImportData::Glob (*resolved)}}});
+  import_mappings.insert (use_dec_id,
+ ImportPair (std::move (glob),
+ ImportData::Glob (*resolved)));
 
   return true;
 }
@@ -100,19 +101,11 @@ Early::resolve_simple_import (NodeId use_dec_id, 
TopLevel::ImportKind &&import)
   if (definitions.empty ())
 return false;
 
-  // We insert an empty vector, unless an element was already present for
-  // `use_dec_id` - which is returned in the tuple's first member
-  auto tuple = import_mappings.insert ({use_dec_id, {}});
-  // We then get that tuple's first member, which will be an iterator to the
-  // existing vec> OR an iterator to our newly
-  // created empty vector (plus its key since this is a hashmap iterator).
-  // we then access the second member of the pair to get access to the
-  // vector directly.
-  auto &imports = tuple.first->second;
+  auto &imports = import_mappings.new_or_access (use_dec_id);
 
   imports.emplace_back (
-std::make_pair (std::move (import),
-   ImportData::Simple (std::move (definitions;
+ImportPair (std::move (import),
+   ImportData::Simple (std::move (definitions;
 
   return true;
 }
@@ -127,19 +120,11 @@ Early::resolve_rebind_import (NodeId use_dec_id,
   if (definitions.empty ())
 return false;
 
-  // We insert an empty vector, unless an element was already present for
-  // `use_dec_id` - which is returned in the tuple's first member
-  auto tuple = import_mappings.insert ({use_dec_id, {}});
-  // We then get that tuple's first member, which will be an iterator to the
-  // existing vec> OR an iterator to our newly
-  // created empty vector (plus its key since this is a hashmap iterator).
-  // we then access the second member of the pair to get access to the
-  // vector directly.
-  auto &imports = tuple.first->second;
+  auto &imports = import_mappings.new_or_access (use_dec_id);
 
   imports.emplace_back (
-std::make_pair (std::move (rebind_import),
-   ImportData::Rebind (std::move (definitions;
+ImportPair (std::move (rebind_import),
+   ImportData::Rebind (std::move (definitions;
 
   return true;
 }
diff --git a/gcc/rust/resolve/rust-early-name-resolver-2.0.h 
b/gcc/rust/resolve/rust-early-name-resolver-2.0.h
index 7d0864ee100..ec1d914c05d 100644
--- a/gcc/rust/resolve/rust-early-name-resolver-2.0.h
+++ b/gcc/rust/resolve/rust-early-name-resolver-2.0.h
@@ -114,6 +114,52 @@ public:
 Rib::Definition glob_module;
   };
 
+  struct ImportPair
+  {
+TopLevel::ImportKind import_kind;
+ImportData data;
+
+explicit ImportPair (TopLevel::ImportKind &&kind, ImportData &&data)
+  : import_kind (std::move (kind)), data (std::move (data))
+{}
+  };
+
+  class ImportMappings
+  {
+  public:
+std::vector &new_or_access (NodeId path_id)
+{
+  // We insert an empty vector, unless an element was already present for
+  // `use_dec_id` - which is returned in the tuple's first member
+  auto iter = mappings.insert ({{path_id}, {}});
+
+  // We then get that tuple's first member, which will be an iterator to 
the
+  // existing vec> OR an iterator to our newly
+  // created empty vector (plus its key since this is a hashmap iterator).
+  // we then access the second member of the pair to get access to the
+  // vector directly.
+  return iter.first->second;
+}
+
+void 

[COMMITTED 29/35] gccrs: Add ending newline to rust-macro-builtins-log-debug.cc

2025-04-04 Thread arthur . cohen
From: Owen Avery 

gcc/rust/ChangeLog:

* expand/rust-macro-builtins-log-debug.cc:
Add newline to end of file.

Signed-off-by: Owen Avery 
---
 gcc/rust/expand/rust-macro-builtins-log-debug.cc | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/gcc/rust/expand/rust-macro-builtins-log-debug.cc 
b/gcc/rust/expand/rust-macro-builtins-log-debug.cc
index 49670d2b986..3d7b54f7b0c 100644
--- a/gcc/rust/expand/rust-macro-builtins-log-debug.cc
+++ b/gcc/rust/expand/rust-macro-builtins-log-debug.cc
@@ -30,4 +30,4 @@ MacroBuiltin::assert_handler (location_t invoc_locus,
 
   return AST::Fragment::create_error ();
 }
-} // namespace Rust
\ No newline at end of file
+} // namespace Rust
-- 
2.49.0



[COMMITTED 144/146] gccrs: derive(Clone): Implement derive clone for enum struct variants

2025-04-04 Thread arthur . cohen
From: Arthur Cohen 

gcc/rust/ChangeLog:

* expand/rust-derive-clone.cc (DeriveClone::clone_enum_struct): New 
function for deriving
enum struct variants.
(DeriveClone::visit_enum): Call into the new function.

gcc/testsuite/ChangeLog:

* rust/compile/nr2/exclude:
* rust/compile/derive_clone_enum1.rs: New test.
* rust/compile/derive_clone_enum2.rs: New test.
* rust/compile/derive_clone_enum3.rs: New test.
* rust/execute/torture/derive_clone_enum1.rs: New test.
---
 gcc/rust/expand/rust-derive-clone.cc  | 85 +--
 .../rust/compile/derive_clone_enum1.rs| 16 
 .../rust/compile/derive_clone_enum2.rs| 16 
 .../rust/compile/derive_clone_enum3.rs| 16 
 gcc/testsuite/rust/compile/nr2/exclude|  3 +
 .../execute/torture/derive_clone_enum1.rs | 51 +++
 6 files changed, 180 insertions(+), 7 deletions(-)
 create mode 100644 gcc/testsuite/rust/compile/derive_clone_enum1.rs
 create mode 100644 gcc/testsuite/rust/compile/derive_clone_enum2.rs
 create mode 100644 gcc/testsuite/rust/compile/derive_clone_enum3.rs
 create mode 100644 gcc/testsuite/rust/execute/torture/derive_clone_enum1.rs

diff --git a/gcc/rust/expand/rust-derive-clone.cc 
b/gcc/rust/expand/rust-derive-clone.cc
index c2994b7b4f8..7620abe4e13 100644
--- a/gcc/rust/expand/rust-derive-clone.cc
+++ b/gcc/rust/expand/rust-derive-clone.cc
@@ -19,6 +19,7 @@
 #include "rust-derive-clone.h"
 #include "rust-ast.h"
 #include "rust-ast-dump.h"
+#include "rust-expr.h"
 #include "rust-item.h"
 #include "rust-path.h"
 #include "rust-pattern.h"
@@ -300,13 +301,84 @@ DeriveClone::clone_enum_tuple (Enum &item, const 
EnumItemTuple &variant)
   return builder.match_case (std::move (pattern), std::move (expr));
 }
 
+MatchCase
+DeriveClone::clone_enum_struct (Enum &item, const EnumItemStruct &variant)
+{
+  auto variant_path = variant_match_path (item, variant.get_identifier ());
+
+  auto field_patterns = std::vector> ();
+  auto cloned_fields = std::vector> ();
+
+#if 0
+  // NOTE: We currently do not support compiling struct patterns where an
+  // identifier is assigned a new pattern, e.g. Bloop { f0: x }
+  // This is the code we should eventually produce as it mimics what rustc does
+  // - which is probably here for a good reason. In the meantime, we can just
+  // use the field's identifier as the pattern: Bloop { f0 }
+  // We can then clone the field directly instead of calling `clone()` on the
+  // new pattern.
+  // TODO: Figure out if that is actually needed and why rustc does it?
+
+  for (size_t i = 0; i < variant.get_struct_fields ().size (); i++)
+{
+  auto &field = variant.get_struct_fields ()[i];
+
+  // Just like for tuples, the pattern we're creating for each field is
+  // `self_` where `i` is the index of the field. It doesn't actually
+  // matter what we use, as long as it's ordered, unique, and that we can
+  // reuse it in the match case's return expression to clone the field.
+  auto pattern_str = "__self_" + std::to_string (i);
+
+  field_patterns.emplace_back (
+   std::unique_ptr (new StructPatternFieldIdentPat (
+ field.get_field_name (), builder.identifier_pattern (pattern_str), {},
+ loc)));
+
+  cloned_fields.emplace_back (
+   std::unique_ptr (new StructExprFieldIdentifierValue (
+ field.get_field_name (),
+ clone_call (builder.ref (builder.identifier (pattern_str))), {},
+ loc)));
+}
+#endif
+
+  for (const auto &field : variant.get_struct_fields ())
+{
+  // We match on the struct's fields, and then recreate an instance of that
+  // struct, cloning each field
+
+  field_patterns.emplace_back (
+   std::unique_ptr (new StructPatternFieldIdent (
+ field.get_field_name (), false /* is_ref? true? */, false, {}, loc)));
+
+  cloned_fields.emplace_back (
+   std::unique_ptr (new StructExprFieldIdentifierValue (
+ field.get_field_name (),
+ clone_call (builder.ref (
+   builder.identifier (field.get_field_name ().as_string (,
+ {}, loc)));
+}
+
+  auto pattern_elts = StructPatternElements (std::move (field_patterns));
+
+  auto pattern = std::unique_ptr (
+new ReferencePattern (std::unique_ptr (new StructPattern (
+   variant_path, loc, pattern_elts)),
+ false, false, loc));
+  auto expr = std::unique_ptr (
+new StructExprStructFields (variant_path, std::move (cloned_fields), loc));
+
+  return builder.match_case (std::move (pattern), std::move (expr));
+}
+
 void
 DeriveClone::visit_enum (Enum &item)
 {
-  // Create an arm for each variant of the enum
-  // For enum item variants, just create the same variant
-  // For struct and tuple variants, destructure the pattern and call clone for
-  // each field
+  // Create an arm for each variant of the enum:
+  // - For enum item variants (sim

[COMMITTED 077/144] gccrs: Implement initial pattern analysis pass.

2025-04-04 Thread arthur . cohen
From: Raiki Tamura 

gcc/rust/ChangeLog:

* Make-lang.in: Add rust-hir-pattern-analysis.o.
* rust-session-manager.cc (Session::compile_crate):
Add pattern analysis pass.
* typecheck/rust-hir-type-check-pattern.cc (TypeCheckPattern::visit):
Do typecheck for subpatterns.
* checks/errors/rust-hir-pattern-analysis.cc: New file.
* checks/errors/rust-hir-pattern-analysis.h: New file.

gcc/testsuite/ChangeLog:

* rust/compile/exhaustiveness1.rs: New test.
* rust/compile/exhaustiveness2.rs: New test.
* rust/compile/exhaustiveness3.rs: New test.

Signed-off-by: Raiki Tamura 
---
 gcc/rust/Make-lang.in |1 +
 .../errors/rust-hir-pattern-analysis.cc   | 1554 +
 .../checks/errors/rust-hir-pattern-analysis.h |  526 ++
 gcc/rust/rust-session-manager.cc  |6 +
 .../typecheck/rust-hir-type-check-pattern.cc  |2 +
 gcc/testsuite/rust/compile/exhaustiveness1.rs |   53 +
 gcc/testsuite/rust/compile/exhaustiveness2.rs |   28 +
 gcc/testsuite/rust/compile/exhaustiveness3.rs |   55 +
 8 files changed, 2225 insertions(+)
 create mode 100644 gcc/rust/checks/errors/rust-hir-pattern-analysis.cc
 create mode 100644 gcc/rust/checks/errors/rust-hir-pattern-analysis.h
 create mode 100644 gcc/testsuite/rust/compile/exhaustiveness1.rs
 create mode 100644 gcc/testsuite/rust/compile/exhaustiveness2.rs
 create mode 100644 gcc/testsuite/rust/compile/exhaustiveness3.rs

diff --git a/gcc/rust/Make-lang.in b/gcc/rust/Make-lang.in
index d291dd64765..950cd3af073 100644
--- a/gcc/rust/Make-lang.in
+++ b/gcc/rust/Make-lang.in
@@ -188,6 +188,7 @@ GRS_OBJS = \
 rust/rust-readonly-check.o \
 rust/rust-hir-type-check-path.o \
 rust/rust-unsafe-checker.o \
+rust/rust-hir-pattern-analysis.o \
 rust/rust-compile-intrinsic.o \
 rust/rust-compile-pattern.o \
 rust/rust-compile-fnparam.o \
diff --git a/gcc/rust/checks/errors/rust-hir-pattern-analysis.cc 
b/gcc/rust/checks/errors/rust-hir-pattern-analysis.cc
new file mode 100644
index 000..fdbc6e8d2ec
--- /dev/null
+++ b/gcc/rust/checks/errors/rust-hir-pattern-analysis.cc
@@ -0,0 +1,1554 @@
+// Copyright (C) 2020-2024 Free Software Foundation, Inc.
+
+// This file is part of GCC.
+
+// GCC is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 3, or (at your option) any later
+// version.
+
+// GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+// for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with GCC; see the file COPYING3.  If not see
+// .
+
+#include "rust-system.h"
+#include "rust-hir-pattern-analysis.h"
+#include "rust-diagnostics.h"
+#include "rust-hir-full-decls.h"
+#include "rust-hir-path.h"
+#include "rust-hir-pattern.h"
+#include "rust-hir.h"
+#include "rust-mapping-common.h"
+#include "rust-system.h"
+#include "rust-tyty.h"
+
+namespace Rust {
+namespace Analysis {
+
+PatternChecker::PatternChecker ()
+  : tyctx (*Resolver::TypeCheckContext::get ()),
+resolver (*Resolver::Resolver::get ()),
+mappings (Analysis::Mappings::get ())
+{}
+
+void
+PatternChecker::go (HIR::Crate &crate)
+{
+  rust_debug ("started pattern check");
+  for (auto &item : crate.get_items ())
+item->accept_vis (*this);
+  rust_debug ("finished pattern check");
+}
+
+void
+PatternChecker::visit (Lifetime &)
+{}
+
+void
+PatternChecker::visit (LifetimeParam &)
+{}
+
+void
+PatternChecker::visit (PathInExpression &path)
+{}
+
+void
+PatternChecker::visit (TypePathSegment &)
+{}
+
+void
+PatternChecker::visit (TypePathSegmentGeneric &)
+{}
+
+void
+PatternChecker::visit (TypePathSegmentFunction &)
+{}
+
+void
+PatternChecker::visit (TypePath &)
+{}
+
+void
+PatternChecker::visit (QualifiedPathInExpression &)
+{}
+
+void
+PatternChecker::visit (QualifiedPathInType &)
+{}
+
+void
+PatternChecker::visit (LiteralExpr &)
+{}
+
+void
+PatternChecker::visit (BorrowExpr &expr)
+{
+  expr.get_expr ()->accept_vis (*this);
+}
+
+void
+PatternChecker::visit (DereferenceExpr &expr)
+{
+  expr.get_expr ()->accept_vis (*this);
+}
+
+void
+PatternChecker::visit (ErrorPropagationExpr &expr)
+{
+  expr.get_expr ()->accept_vis (*this);
+}
+
+void
+PatternChecker::visit (NegationExpr &expr)
+{
+  expr.get_expr ()->accept_vis (*this);
+}
+
+void
+PatternChecker::visit (ArithmeticOrLogicalExpr &expr)
+{
+  expr.get_lhs ()->accept_vis (*this);
+  expr.get_rhs ()->accept_vis (*this);
+}
+
+void
+PatternChecker::visit (ComparisonExpr &expr)
+{
+  expr.get_lhs ()->accept_vis (*this);
+  expr.get_rhs ()->accept_vis (*this);
+}
+
+void
+PatternChecker::visit (LazyBooleanExpr &expr)
+{