[COMMITTED 2/9] gccrs: Add testcase for matches!() macro

2024-02-21 Thread arthur . cohen
From: Arthur Cohen 

This adds a testcase for issue #2129.

gcc/testsuite/ChangeLog:

* rust/execute/torture/matches_macro.rs: New test.
---
 .../rust/execute/torture/matches_macro.rs | 30 +++
 1 file changed, 30 insertions(+)
 create mode 100644 gcc/testsuite/rust/execute/torture/matches_macro.rs

diff --git a/gcc/testsuite/rust/execute/torture/matches_macro.rs 
b/gcc/testsuite/rust/execute/torture/matches_macro.rs
new file mode 100644
index 000..7b61570727d
--- /dev/null
+++ b/gcc/testsuite/rust/execute/torture/matches_macro.rs
@@ -0,0 +1,30 @@
+macro_rules! matches {
+($expression:expr, $($pattern:pat)|+ $( if $guard:expr ),*) => {
+match $expression {
+$($pattern)|+ => true,
+_ => false,
+}
+}
+}
+
+pub fn should_match() -> bool {
+matches!(1, 1)
+}
+
+pub fn shouldnt() -> bool {
+matches!(1, 2)
+}
+
+fn main() -> i32 {
+let mut retval = 2;
+
+if should_match() {
+retval -= 1;
+}
+
+if !shouldnt() {
+retval -= 1;
+}
+
+retval
+}
-- 
2.42.1



[COMMITTED 1/9] gccrs: Fix typo in RegionConstraints instance

2024-02-21 Thread arthur . cohen
From: Arthur Cohen 

gcc/rust/ChangeLog:

* typecheck/rust-hir-type-check-implitem.h: Fix typo in field
(region_costraints -> region_constraints).
---
 gcc/rust/typecheck/rust-hir-type-check-implitem.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/gcc/rust/typecheck/rust-hir-type-check-implitem.h 
b/gcc/rust/typecheck/rust-hir-type-check-implitem.h
index 4d178440775..541b7280c1b 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-implitem.h
+++ b/gcc/rust/typecheck/rust-hir-type-check-implitem.h
@@ -97,7 +97,7 @@ private:
   HIR::ImplBlock *parent;
   TyTy::BaseType *self;
   std::vector substitutions;
-  TyTy::RegionConstraints region_costraints;
+  TyTy::RegionConstraints region_constraints;
 };
 
 } // namespace Resolver
-- 
2.42.1



[COMMITTED 5/9] gccrs: Add testcase for #[rustc_const_stable]

2024-02-21 Thread arthur . cohen
From: Arthur Cohen 

To ensure we don't introduce regressions back to issue #2314

gcc/testsuite/ChangeLog:

* rust/compile/rustc_const_stable.rs: New test.
---
 gcc/testsuite/rust/compile/rustc_const_stable.rs | 2 ++
 1 file changed, 2 insertions(+)
 create mode 100644 gcc/testsuite/rust/compile/rustc_const_stable.rs

diff --git a/gcc/testsuite/rust/compile/rustc_const_stable.rs 
b/gcc/testsuite/rust/compile/rustc_const_stable.rs
new file mode 100644
index 000..9208b1ab3b6
--- /dev/null
+++ b/gcc/testsuite/rust/compile/rustc_const_stable.rs
@@ -0,0 +1,2 @@
+#[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = 
"1.47.0")]
+pub fn foo() {} // { dg-error "macro not found" "" { target *-*-* } .-1 }
-- 
2.42.1



[COMMITTED 8/9] gccrs: Add variadic check on function params

2024-02-21 Thread arthur . cohen
From: 0xn4utilus 

gcc/rust/ChangeLog:

* checks/errors/rust-ast-validation.cc (ASTValidation::visit):
Add variadic check on all parameters.

gcc/testsuite/ChangeLog:

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

Signed-off-by: 0xn4utilus 
---
 gcc/rust/checks/errors/rust-ast-validation.cc | 12 
 gcc/testsuite/rust/compile/issue-2850.rs  | 17 +
 2 files changed, 25 insertions(+), 4 deletions(-)
 create mode 100644 gcc/testsuite/rust/compile/issue-2850.rs

diff --git a/gcc/rust/checks/errors/rust-ast-validation.cc 
b/gcc/rust/checks/errors/rust-ast-validation.cc
index d57b7cb70fe..fcba57d0a92 100644
--- a/gcc/rust/checks/errors/rust-ast-validation.cc
+++ b/gcc/rust/checks/errors/rust-ast-validation.cc
@@ -132,10 +132,14 @@ ASTValidation::visit (AST::Function &function)
rust_error_at (function.get_locus (), "free function without a body");
 }
 
-  if (function.is_variadic ())
-rust_error_at (
-  function.get_function_params ().back ()->get_locus (),
-  "only foreign or % functions may be C-variadic");
+  auto &function_params = function.get_function_params ();
+  for (auto it = function_params.begin (); it != function_params.end (); it++)
+{
+  if (it->get ()->is_variadic ())
+   rust_error_at (it->get ()->get_locus (),
+  "only foreign or % functions may "
+  "be C-variadic");
+}
 
   AST::ContextualASTVisitor::visit (function);
 }
diff --git a/gcc/testsuite/rust/compile/issue-2850.rs 
b/gcc/testsuite/rust/compile/issue-2850.rs
new file mode 100644
index 000..62cbe0f6524
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-2850.rs
@@ -0,0 +1,17 @@
+fn myfun0(...,_:i32) {}
+// { dg-error "only foreign or .unsafe extern \"C\". functions may be 
C-variadic" "" { target *-*-* } .-1 }
+
+fn myfun1(a:i32,...,_:i32) {}
+// { dg-error "only foreign or .unsafe extern \"C\". functions may be 
C-variadic" "" { target *-*-* } .-1 }
+
+struct z {
+x: f64,
+y: f64,
+}
+
+impl z {
+fn new(x: f64, ..., y: f64) -> z {
+// { dg-error "only foreign or .unsafe extern \"C\". functions may be 
C-variadic" "" { target *-*-* } .-1 }
+z { x: x, y: y }
+}
+}
\ No newline at end of file
-- 
2.42.1



[COMMITTED 9/9] Update copyright years.

2024-02-21 Thread arthur . cohen
From: Sahil Yeole 

Signed-off-by: Sahil Yeole 
---
 gcc/rust/ast/rust-ast-builder.cc  | 2 +-
 gcc/rust/ast/rust-ast-builder.h   | 2 +-
 gcc/rust/ast/rust-ast-collector.cc| 2 +-
 gcc/rust/ast/rust-ast-collector.h | 2 +-
 gcc/rust/ast/rust-ast-formatting.cc   | 2 +-
 gcc/rust/ast/rust-ast-formatting.h| 2 +-
 gcc/rust/ast/rust-ast-visitor.cc  | 2 +-
 gcc/rust/ast/rust-path.cc | 2 +-
 gcc/rust/ast/rust-pattern.cc  | 2 +-
 gcc/rust/backend/rust-mangle-legacy.cc| 2 +-
 gcc/rust/backend/rust-mangle-v0.cc| 2 +-
 gcc/rust/backend/rust-mangle.cc   | 2 +-
 gcc/rust/checks/errors/borrowck/rust-bir-builder-expr-stmt.cc | 2 +-
 gcc/rust/checks/errors/borrowck/rust-bir-builder-expr-stmt.h  | 2 +-
 gcc/rust/checks/errors/borrowck/rust-bir-builder-internal.h   | 2 +-
 .../checks/errors/borrowck/rust-bir-builder-lazyboolexpr.h| 2 +-
 gcc/rust/checks/errors/borrowck/rust-bir-builder-pattern.h| 2 +-
 gcc/rust/checks/errors/borrowck/rust-bir-builder-struct.h | 2 +-
 gcc/rust/checks/errors/borrowck/rust-bir-builder.h| 2 +-
 gcc/rust/checks/errors/borrowck/rust-bir-dump.h   | 2 +-
 gcc/rust/checks/errors/borrowck/rust-bir-place.h  | 2 +-
 gcc/rust/checks/errors/borrowck/rust-bir-visitor.h| 2 +-
 gcc/rust/checks/errors/borrowck/rust-bir.h| 2 +-
 gcc/rust/checks/errors/borrowck/rust-borrow-checker.cc| 2 +-
 gcc/rust/checks/errors/borrowck/rust-borrow-checker.h | 2 +-
 gcc/rust/checks/errors/borrowck/rust-function-collector.h | 2 +-
 gcc/rust/checks/errors/rust-ast-validation.cc | 2 +-
 gcc/rust/checks/errors/rust-ast-validation.h  | 2 +-
 gcc/rust/checks/errors/rust-readonly-check.cc | 2 +-
 gcc/rust/checks/errors/rust-readonly-check.h  | 2 +-
 gcc/rust/expand/rust-derive-clone.cc  | 2 +-
 gcc/rust/expand/rust-derive-clone.h   | 2 +-
 gcc/rust/expand/rust-derive-copy.cc   | 2 +-
 gcc/rust/expand/rust-derive-copy.h| 2 +-
 gcc/rust/expand/rust-derive.cc| 2 +-
 gcc/rust/expand/rust-derive.h | 2 +-
 gcc/rust/expand/rust-expand-visitor.cc| 2 +-
 gcc/rust/expand/rust-expand-visitor.h | 2 +-
 gcc/rust/expand/rust-macro-invoc-lexer.cc | 2 +-
 gcc/rust/expand/rust-macro-substitute-ctx.cc  | 2 +-
 gcc/rust/expand/rust-proc-macro-invoc-lexer.cc| 2 +-
 gcc/rust/expand/rust-proc-macro-invoc-lexer.h | 2 +-
 gcc/rust/hir/rust-ast-lower-implitem.cc   | 2 +-
 gcc/rust/hir/rust-ast-lower-stmt.cc   | 2 +-
 gcc/rust/lex/rust-input-source.h  | 2 +-
 gcc/rust/resolve/rust-default-resolver.cc | 2 +-
 gcc/rust/resolve/rust-default-resolver.h  | 2 +-
 gcc/rust/resolve/rust-early-name-resolver-2.0.cc  | 2 +-
 gcc/rust/resolve/rust-early-name-resolver-2.0.h   | 2 +-
 gcc/rust/resolve/rust-forever-stack.h | 2 +-
 gcc/rust/resolve/rust-forever-stack.hxx   | 2 +-
 gcc/rust/resolve/rust-late-name-resolver-2.0.cc   | 2 +-
 gcc/rust/resolve/rust-late-name-resolver-2.0.h| 2 +-
 gcc/rust/resolve/rust-name-resolution-context.cc  | 2 +-
 gcc/rust/resolve/rust-name-resolution-context.h   | 2 +-
 gcc/rust/resolve/rust-rib.cc  | 2 +-
 gcc/rust/resolve/rust-rib.h   | 2 +-
 gcc/rust/resolve/rust-toplevel-name-resolver-2.0.cc   | 2 +-
 gcc/rust/resolve/rust-toplevel-name-resolver-2.0.h| 2 +-
 gcc/rust/rust-attribs.cc  | 2 +-
 gcc/rust/rust-error-codes.def | 2 +-
 gcc/rust/util/bi-map.h| 2 +-
 gcc/rust/util/make-rust-unicode.py| 4 ++--
 gcc/rust/util/rust-attribute-values.h | 2 +-
 gcc/rust/util/rust-dir-owner.cc   | 2 +-
 gcc/rust/util/rust-dir-owner.h| 2 +-
 gcc/rust/util/rust-dump.h | 2 +-
 gcc/rust/util/rust-keyword-values.cc  | 2 +-
 gcc/rust/util/rust-keyword-values.h   | 2 +-
 gcc/rust/util/rust-punycode.cc| 2 +-
 gcc/rust/util/rust-punycode.h   

[PATCHSET] Update Rust frontend 21/02/2024

2024-02-21 Thread arthur . cohen
Hey everyone,

Here is the latest patchset of the Rust frontend, taken directly from our 
development branch.

The patches have been built, tested and bootstrapped on x86-64.

[COMMITTED 1/9] gccrs: Fix typo in RegionConstraints instance
[COMMITTED 2/9] gccrs: Add testcase for matches!() macro
[COMMITTED 3/9] gccrs: Fix rebinding imports
[COMMITTED 4/9] gccrs: expand: Fix formatting for "macro not found"
[COMMITTED 5/9] gccrs: Add testcase for #[rustc_const_stable]
[COMMITTED 6/9] gccrs: add powi intrinsics
[COMMITTED 7/9] gccrs: Fix lookup of TuplePattern sub-pattern types
[COMMITTED 8/9] gccrs: Add variadic check on function params
[COMMITTED 9/9] Update copyright years.

Best,

Arthur



[COMMITTED 7/9] gccrs: Fix lookup of TuplePattern sub-pattern types

2024-02-21 Thread arthur . cohen
From: Owen Avery 

gcc/rust/ChangeLog:

* backend/rust-compile-pattern.cc
(CompilePatternLet::visit):
Lookup type of sub-pattern, not tuple pattern itself.

gcc/testsuite/ChangeLog:

* rust/compile/issue-2847-b.rs: New test.

Signed-off-by: Owen Avery 
---
 gcc/rust/backend/rust-compile-pattern.cc   | 12 ++--
 gcc/testsuite/rust/compile/issue-2847-b.rs |  4 
 2 files changed, 10 insertions(+), 6 deletions(-)
 create mode 100644 gcc/testsuite/rust/compile/issue-2847-b.rs

diff --git a/gcc/rust/backend/rust-compile-pattern.cc 
b/gcc/rust/backend/rust-compile-pattern.cc
index 4fa611f5383..1a32f02c3ea 100644
--- a/gcc/rust/backend/rust-compile-pattern.cc
+++ b/gcc/rust/backend/rust-compile-pattern.cc
@@ -678,8 +678,8 @@ CompilePatternLet::visit (HIR::TuplePattern &pattern)
for (auto &sub : items_lower)
  {
TyTy::BaseType *ty_sub = nullptr;
-   HirId pattern_id = pattern.get_mappings ().get_hirid ();
-   bool ok = ctx->get_tyctx ()->lookup_type (pattern_id, &ty_sub);
+   HirId sub_id = sub->get_mappings ().get_hirid ();
+   bool ok = ctx->get_tyctx ()->lookup_type (sub_id, &ty_sub);
rust_assert (ok);
 
tree sub_init
@@ -697,8 +697,8 @@ CompilePatternLet::visit (HIR::TuplePattern &pattern)
for (auto &sub : items_upper)
  {
TyTy::BaseType *ty_sub = nullptr;
-   HirId pattern_id = pattern.get_mappings ().get_hirid ();
-   bool ok = ctx->get_tyctx ()->lookup_type (pattern_id, &ty_sub);
+   HirId sub_id = sub->get_mappings ().get_hirid ();
+   bool ok = ctx->get_tyctx ()->lookup_type (sub_id, &ty_sub);
rust_assert (ok);
 
tree sub_init
@@ -719,8 +719,8 @@ CompilePatternLet::visit (HIR::TuplePattern &pattern)
for (auto &sub : items.get_patterns ())
  {
TyTy::BaseType *ty_sub = nullptr;
-   HirId pattern_id = pattern.get_mappings ().get_hirid ();
-   bool ok = ctx->get_tyctx ()->lookup_type (pattern_id, &ty_sub);
+   HirId sub_id = sub->get_mappings ().get_hirid ();
+   bool ok = ctx->get_tyctx ()->lookup_type (sub_id, &ty_sub);
rust_assert (ok);
 
tree sub_init
diff --git a/gcc/testsuite/rust/compile/issue-2847-b.rs 
b/gcc/testsuite/rust/compile/issue-2847-b.rs
new file mode 100644
index 000..ab2614210fc
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-2847-b.rs
@@ -0,0 +1,4 @@
+pub fn test() -> i32 {
+let (a, _) = (1, 2);
+a
+}
-- 
2.42.1



[COMMITTED 6/9] gccrs: add powi intrinsics

2024-02-21 Thread arthur . cohen
From: Marc Poulhiès 

gcc/rust/ChangeLog:

* backend/rust-builtins.cc
(BuiltinsContext::register_rust_mappings): Add powi and reformat.
* backend/rust-builtins.h: Add missing copyright header.

gcc/testsuite/ChangeLog:

* rust/compile/torture/intrinsics-math.rs: Adjust pow test, add
test for powi.

Signed-off-by: Marc Poulhiès 
---
 gcc/rust/backend/rust-builtins.cc | 30 +--
 gcc/rust/backend/rust-builtins.h  |  2 ++
 .../rust/compile/torture/intrinsics-math.rs   | 12 ++--
 3 files changed, 39 insertions(+), 5 deletions(-)

diff --git a/gcc/rust/backend/rust-builtins.cc 
b/gcc/rust/backend/rust-builtins.cc
index 1a87f869206..282ecba70cb 100644
--- a/gcc/rust/backend/rust-builtins.cc
+++ b/gcc/rust/backend/rust-builtins.cc
@@ -285,46 +285,70 @@ void
 BuiltinsContext::register_rust_mappings ()
 {
   rust_intrinsic_to_gcc_builtin = {
-{"sinf32", "__builtin_sinf"},
-{"sqrtf32", "__builtin_sqrtf"},
-{"sqrtf64", "__builtin_sqrt"},
 {"unreachable", "__builtin_unreachable"},
 {"abort", "__builtin_abort"},
+
+// Math intrinsics
+{"sqrtf32", "__builtin_sqrtf"},
+{"sqrtf64", "__builtin_sqrt"},
+
+{"sinf32", "__builtin_sinf"},
 {"sinf64", "__builtin_sin"},
+
 {"cosf32", "__builtin_cosf"},
 {"cosf64", "__builtin_cos"},
+
 {"powf32", "__builtin_powf"},
 {"powf64", "__builtin_pow"},
+
+{"powif32", "__builtin_powif"},
+{"powif64", "__builtin_powi"},
+
 {"expf32", "__builtin_expf"},
 {"expf64", "__builtin_exp"},
+
 {"exp2f32", "__builtin_exp2f"},
 {"exp2f64", "__builtin_exp2"},
+
 {"logf32", "__builtin_logf"},
 {"logf64", "__builtin_log"},
+
 {"log10f32", "__builtin_log10f"},
 {"log10f64", "__builtin_log10"},
+
 {"log2f32", "__builtin_log2f"},
 {"log2f64", "__builtin_log2"},
+
 {"fmaf32", "__builtin_fmaf"},
 {"fmaf64", "__builtin_fma"},
+
 {"fabsf32", "__builtin_fabsf"},
 {"fabsf64", "__builtin_fabs"},
+
 {"minnumf32", "__builtin_fminf"},
 {"minnumf64", "__builtin_fmin"},
+
 {"maxnumf32", "__builtin_fmaxf"},
 {"maxnumf64", "__builtin_fmax"},
+
 {"copysignf32", "__builtin_copysignf"},
 {"copysignf64", "__builtin_copysign"},
+
 {"floorf32", "__builtin_floorf"},
 {"floorf64", "__builtin_floor"},
+
 {"ceilf32", "__builtin_ceilf"},
 {"ceilf64", "__builtin_ceil"},
+
 {"truncf32", "__builtin_truncf"},
 {"truncf64", "__builtin_trunc"},
+
 {"rintf32", "__builtin_rintf"},
 {"rintf64", "__builtin_rint"},
+
 {"nearbyintf32", "__builtin_nearbyintf"},
 {"nearbyintf64", "__builtin_nearbyint"},
+
 {"roundf32", "__builtin_roundf"},
 {"roundf64", "__builtin_round"},
   };
diff --git a/gcc/rust/backend/rust-builtins.h b/gcc/rust/backend/rust-builtins.h
index 5052edad51e..65dd850e3c6 100644
--- a/gcc/rust/backend/rust-builtins.h
+++ b/gcc/rust/backend/rust-builtins.h
@@ -1,3 +1,5 @@
+// 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
diff --git a/gcc/testsuite/rust/compile/torture/intrinsics-math.rs 
b/gcc/testsuite/rust/compile/torture/intrinsics-math.rs
index 42acdde1494..e0d15f99d48 100644
--- a/gcc/testsuite/rust/compile/torture/intrinsics-math.rs
+++ b/gcc/testsuite/rust/compile/torture/intrinsics-math.rs
@@ -14,6 +14,9 @@ extern "rust-intrinsic" {
 pub fn powf32(a: f32, x: f32) -> f32;
 pub fn powf64(a: f64, x: f64) -> f64;
 
+pub fn powif32(a: f32, x: i32) -> f32;
+pub fn powif64(a: f64, x: i32) -> f64;
+
 pub fn expf32(x: f32) -> f32;
 pub fn expf64(x: f64) -> f64;
 
@@ -84,9 +87,14 @@ fn main() {
 // { dg-final { scan-tree-dump-times {(?n)f64 .* __builtin_cos.? 
\(.*6\.0e\+0\);$} 1 original } }
 
 f32 = powf32(7f32, 8f32);
-// { dg-final { scan-tree-dump-times {(?n)f32 .* __builtin_pow. 
\(.*7\.0e\+0, .*8\.0e\+0\);$} 1 original } }
+// { dg-final { scan-tree-dump-times {(?n)f32 .* __builtin_pow[^i] 
\(.*7\.0e\+0, .*8\.0e\+0\);$} 1 original } }
 f64 = powf64(9f64, 10f64);
-// { dg-final { scan-tree-dump-times {(?n)f64 .* __builtin_pow.? 
\(.*9\.0e\+0, .*1\.0e\+1\);$} 1 original } }
+// { dg-final { scan-tree-dump-times {(?n)f64 .* __builtin_pow[^i]? 
\(.*9\.0e\+0, .*1\.0e\+1\);$} 1 original } }
+
+f32 = powif32(7f32, 8i32);
+// { dg-final { scan-tree-dump-times {(?n)f32 .* __builtin_powi. 
\(.*7\.0e\+0, .*8\);$} 1 original } }
+f64 = powif64(9f64, 10i32);
+// { dg-final { scan-tree-dump-times {(?n)f64 .* __builtin_powi.? 
\(.*9\.0e\+0, .*10\);$} 1 original } }
 
 f32 = expf32(11f32);
 // { dg-final { scan-tree-dump-times {(?n)f32 .* __builtin_exp. 
\(.*1\.1e\+1\);$} 1 original } }
-- 
2.42.1



[COMMITTED 3/9] gccrs: Fix rebinding imports

2024-02-21 Thread arthur . cohen
From: Owen Avery 

gcc/rust/ChangeLog:

* resolve/rust-ast-resolve-item.cc
(flatten_glob): Use Import class.
(flatten_rebind): Likewise.
(flatten_list): Likewise.
(flatten): Likewise.
(flatten_use_dec_to_paths): Likewise.
(flatten_use_dec_to_imports): Likewise.
(ResolveItem::visit): Likewise.
(Import::add_prefix): New.
(rust_flatten_nested_glob): Adjust test.
(rust_flatten_glob): Likewise.
(rust_flatten_rebind_none): Likewise.
(rust_flatten_rebind): Likewise.
(rust_flatten_rebind_nested): Likewise.
(rust_flatten_list): Likewise.
* resolve/rust-ast-resolve-item.h
(class Import): New.

gcc/testsuite/ChangeLog:

* rust/compile/use_2.rs: New test.

Signed-off-by: Owen Avery 
---
 gcc/rust/resolve/rust-ast-resolve-item.cc | 179 +++---
 gcc/rust/resolve/rust-ast-resolve-item.h  |  23 +++
 gcc/testsuite/rust/compile/use_2.rs   |   7 +
 3 files changed, 116 insertions(+), 93 deletions(-)
 create mode 100644 gcc/testsuite/rust/compile/use_2.rs

diff --git a/gcc/rust/resolve/rust-ast-resolve-item.cc 
b/gcc/rust/resolve/rust-ast-resolve-item.cc
index e69b945407c..743657bc421 100644
--- a/gcc/rust/resolve/rust-ast-resolve-item.cc
+++ b/gcc/rust/resolve/rust-ast-resolve-item.cc
@@ -824,33 +824,30 @@ ResolveItem::resolve_extern_item (AST::ExternalItem *item)
 }
 
 static void
-flatten_glob (const AST::UseTreeGlob &glob,
- std::vector &paths);
+flatten_glob (const AST::UseTreeGlob &glob, std::vector &imports);
 static void
-flatten_rebind (const AST::UseTreeRebind &glob,
-   std::vector &paths);
+flatten_rebind (const AST::UseTreeRebind &glob, std::vector &imports);
 static void
-flatten_list (const AST::UseTreeList &glob,
- std::vector &paths);
+flatten_list (const AST::UseTreeList &glob, std::vector &imports);
 
 static void
-flatten (const AST::UseTree *tree, std::vector &paths)
+flatten (const AST::UseTree *tree, std::vector &imports)
 {
   switch (tree->get_kind ())
 {
   case AST::UseTree::Glob: {
auto glob = static_cast (tree);
-   flatten_glob (*glob, paths);
+   flatten_glob (*glob, imports);
break;
   }
   case AST::UseTree::Rebind: {
auto rebind = static_cast (tree);
-   flatten_rebind (*rebind, paths);
+   flatten_rebind (*rebind, imports);
break;
   }
   case AST::UseTree::List: {
auto list = static_cast (tree);
-   flatten_list (*list, paths);
+   flatten_list (*list, imports);
break;
   }
   break;
@@ -858,36 +855,28 @@ flatten (const AST::UseTree *tree, 
std::vector &paths)
 }
 
 static void
-flatten_glob (const AST::UseTreeGlob &glob, std::vector 
&paths)
+flatten_glob (const AST::UseTreeGlob &glob, std::vector &imports)
 {
   if (glob.has_path ())
-paths.emplace_back (glob.get_path ());
+imports.emplace_back (glob.get_path (), true, std::string ());
 }
 
 static void
-flatten_rebind (const AST::UseTreeRebind &rebind,
-   std::vector &paths)
+flatten_rebind (const AST::UseTreeRebind &rebind, std::vector &imports)
 {
   auto path = rebind.get_path ();
-  if (rebind.has_path ())
-paths.emplace_back (path);
 
-  // FIXME: Do we want to emplace the rebind here as well?
+  std::string label;
   if (rebind.has_identifier ())
-{
-  auto rebind_path = path;
-  auto new_seg = rebind.get_identifier ();
-
-  // Add the identifier as a new path
-  rebind_path.get_segments ().back ()
-   = AST::SimplePathSegment (new_seg.as_string (), UNDEF_LOCATION);
+label = rebind.get_identifier ().as_string ();
+  else
+label = path.get_final_segment ().as_string ();
 
-  paths.emplace_back (rebind_path);
-}
+  imports.emplace_back (path, false, label);
 }
 
 static void
-flatten_list (const AST::UseTreeList &list, std::vector 
&paths)
+flatten_list (const AST::UseTreeList &list, std::vector &imports)
 {
   auto prefix = AST::SimplePath::create_empty ();
   if (list.has_path ())
@@ -895,21 +884,25 @@ flatten_list (const AST::UseTreeList &list, 
std::vector &paths)
 
   for (const auto &tree : list.get_trees ())
 {
-  auto sub_paths = std::vector ();
-  flatten (tree.get (), sub_paths);
+  // append imports to the main list, then modify them in-place
+  auto start_idx = imports.size ();
+  flatten (tree.get (), imports);
 
-  for (auto &sub_path : sub_paths)
-   {
- auto new_path = prefix;
- std::copy (sub_path.get_segments ().begin (),
-sub_path.get_segments ().end (),
-std::back_inserter (new_path.get_segments ()));
-
- paths.emplace_back (new_path);
-   }
+  for (auto import = imports.begin () + start_idx; import != imports.end 
();
+  import++)
+   import->add_prefix (prefix);
 }
 }
 
+void
+Import::add_prefix (AST::SimplePath prefix)
+{
+  AST::Si

[COMMITTED 4/9] gccrs: expand: Fix formatting for "macro not found" error

2024-02-21 Thread arthur . cohen
From: Arthur Cohen 

gcc/rust/ChangeLog:

* expand/rust-macro-expand.h (struct MacroExpander): Nitpick: fix
formatting of emitted error.
---
 gcc/rust/expand/rust-macro-expand.h | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/gcc/rust/expand/rust-macro-expand.h 
b/gcc/rust/expand/rust-macro-expand.h
index f18e8e24a1d..896cdc6dcc8 100644
--- a/gcc/rust/expand/rust-macro-expand.h
+++ b/gcc/rust/expand/rust-macro-expand.h
@@ -414,7 +414,7 @@ struct MacroExpander
   = mappings->lookup_derive_proc_macro_invocation (path);
 if (!macro.has_value ())
   {
-   rust_error_at (path.get_locus (), "Macro not found");
+   rust_error_at (path.get_locus (), "macro not found");
return AST::Fragment::create_error ();
   }
 
@@ -437,7 +437,7 @@ struct MacroExpander
   = mappings->lookup_bang_proc_macro_invocation (invocation);
 if (!macro.has_value ())
   {
-   rust_error_at (invocation.get_locus (), "Macro not found");
+   rust_error_at (invocation.get_locus (), "macro not found");
return AST::Fragment::create_error ();
   }
 
@@ -459,7 +459,7 @@ struct MacroExpander
   = mappings->lookup_attribute_proc_macro_invocation (path);
 if (!macro.has_value ())
   {
-   rust_error_at (path.get_locus (), "Macro not found");
+   rust_error_at (path.get_locus (), "macro not found");
return AST::Fragment::create_error ();
   }
 
-- 
2.42.1