[COMMITTED 2/9] gccrs: Add testcase for matches!() macro
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
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]
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
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.
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
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
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
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
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
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