]> git.ipfire.org Git - thirdparty/gcc.git/log
thirdparty/gcc.git
6 days agogccrs: Separate strip information from internal state
Pierre-Emmanuel Patry [Mon, 25 Aug 2025 15:16:24 +0000 (17:16 +0200)] 
gccrs: Separate strip information from internal state

Marking a TupleIndexExpr for strip makes it invalid for a generic visitor

gcc/rust/ChangeLog:

* ast/rust-expr.h (class TupleIndexExpr): Store strip information.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
6 days agogccrs: nr1.0: Remove support in borrow checker
Owen Avery [Sat, 23 Aug 2025 02:26:05 +0000 (22:26 -0400)] 
gccrs: nr1.0: Remove support in borrow checker

gcc/rust/ChangeLog:

* checks/errors/borrowck/rust-bir-builder-internal.h: Remove
inclusion of "rust-name-resolver.h".
(BuilderContext::resolver): Change type to nr2.0 resolver.
(BuilderContext::BuilderContext): Change initialization of
resolver reference.
(AbstractBuilder::resolve_label): Assume name resolution 2.0 is
enabled.
(AbstractBuilder::resolve_variable): Likewise.
(AbstractBuilder::resolve_variable_or_fn): Likewise.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
6 days agogccrs: nr1.0: Remove support in pattern checker
Owen Avery [Sat, 23 Aug 2025 02:57:05 +0000 (22:57 -0400)] 
gccrs: nr1.0: Remove support in pattern checker

gcc/rust/ChangeLog:

* checks/errors/rust-hir-pattern-analysis.cc: Remove inclusion
of "options.h".
(PatternChecker::PatternChecker): Change initialization of
resolver reference.
(PatternChecker::visit): Assume name resolution 2.0 is enabled.
* checks/errors/rust-hir-pattern-analysis.h: Include nr2.0
header instead of nr1.0 header.
(PatternChecker::resolver): Change type to nr2.0 resolver.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
6 days agogccrs: nr1.0: Remove support in rust-session-manager.cc
Owen Avery [Sat, 23 Aug 2025 02:12:35 +0000 (22:12 -0400)] 
gccrs: nr1.0: Remove support in rust-session-manager.cc

gcc/rust/ChangeLog:

* rust-session-manager.cc: Remove inclusion of name resolution
1.0 headers.
(Session::compile_crate): Assume name resolution 2.0 is enabled.
(Session::expansion): Likewise.
(Session::load_extern_crate): Likewise.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
6 days agogccrs: nr1.0: Remove support in privacy checker
Owen Avery [Sat, 23 Aug 2025 17:29:54 +0000 (13:29 -0400)] 
gccrs: nr1.0: Remove support in privacy checker

gcc/rust/ChangeLog:

* checks/errors/privacy/rust-privacy-check.cc: Adjust includes.
(Resolver::resolve): Pass 2.0 name resolution context to
VisibilityResolver and PrivacyReporter.
* checks/errors/privacy/rust-privacy-reporter.cc
(PrivacyReporter::PrivacyReporter): Change type of resolver
parameter.
(is_child_module): Remove static function.
(PrivacyReporter::check_for_privacy_violation): Assume nr2.0 is
enabled and handle removal of is_child_module.
* checks/errors/privacy/rust-privacy-reporter.h: Adjust
includes.
(PrivacyReporter::PrivacyReporter): Change type of resolver
parameter.
(PrivacyReporter::resolver): Change member variable type.
* checks/errors/privacy/rust-visibility-resolver.cc: Adjust
includes.
(VisibilityResolver::VisibilityResolver): Change type of
resolver parameter.
(VisibilityResolver::resolve_module_path): Assume nr2.0 is
enabled.
* checks/errors/privacy/rust-visibility-resolver.h: Adjust
includes.
(VisibilityResolver::VisibilityResolver): Change type of
resolver parameter.
(VisibilityResolver::resolver): Change member variable type.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
6 days agogccrs: Refactor AST Patterns that hold multiple pattern items
Yap Zhi Heng [Sun, 24 Aug 2025 13:18:12 +0000 (21:18 +0800)] 
gccrs: Refactor AST Patterns that hold multiple pattern items

Patterns include TuplePattern, TupleStructPattern & SlicePattern. Besides making their pattern
items container class inherit from a common `PatternItems` base class just like in HIR for
better standardization, mentions of `Range` are also changed to `HasRest` or `NoRest`.

gcc/rust/ChangeLog:

* ast/rust-pattern.h:
- Add a new base abstract class `PatternItems` which are used by pattern items class
class derivatives for `TuplePattern`, `TupleStructPattern` & `SlicePattern`.
- Standardized the derived class names to have `HasRest` or `NoRest` as suffixes.
 - Values for the common `ItemType` enum is updated to `HAS_REST` or `NO_REST`.
* ast/rust-pattern.cc: Renamed the classes accordingly.
* ast/rust-ast-collector.cc: Renamed the classes accordingly.
* ast/rust-ast-collector.h: Renamed the classes accordingly.
* ast/rust-ast-full-decls.h: Renamed the classes accordingly.
* ast/rust-ast-visitor.cc: Renamed the classes accordingly.
* ast/rust-ast-visitor.h: Renamed the classes accordingly.
* ast/rust-desugar-for-loops.cc: Renamed the classes accordingly.
* ast/rust-desugar-question-mark.cc: Renamed the classes accordingly.
* expand/rust-cfg-strip.cc: Renamed the classes accordingly.
* expand/rust-cfg-strip.h: Renamed the classes accordingly.
* expand/rust-derive-clone.cc: Renamed the classes accordingly.
* expand/rust-derive-cmp-common.cc: Renamed the classes accordingly.
* expand/rust-derive-hash.cc: Renamed the classes accordingly.
* expand/rust-derive-ord.cc: Renamed the classes accordingly.
* expand/rust-derive-partial-eq.cc: Renamed the classes accordingly.
* expand/rust-derive.h: Renamed the classes accordingly.
* expand/rust-expand-visitor.cc: Renamed the classes accordingly.
* expand/rust-expand-visitor.h: Renamed the classes accordingly.
* hir/rust-ast-lower-base.cc: Renamed the classes accordingly.
* hir/rust-ast-lower-base.h: Renamed the classes accordingly.
* hir/rust-ast-lower-pattern.cc: Renamed the classes accordingly.
* hir/tree/rust-hir-pattern.h: Renamed the classes accordingly.
* parse/rust-parse-impl.h: Renamed the classes accordingly.
* resolve/rust-ast-resolve-base.cc: Renamed the classes accordingly.
* resolve/rust-ast-resolve-base.h: Renamed the classes accordingly.
* resolve/rust-ast-resolve-pattern.cc: Renamed the classes accordingly.
* util/rust-attributes.cc: Renamed the classes accordingly.
* util/rust-attributes.h: Renamed the classes accordingly.

Signed-off-by: Yap Zhi Heng <yapzhhg@gmail.com>
6 days agogccrs: Avoid std::unique_ptr<std::string> in Token
Owen Avery [Sun, 24 Aug 2025 23:37:45 +0000 (19:37 -0400)] 
gccrs: Avoid std::unique_ptr<std::string> in Token

gcc/rust/ChangeLog:

* ast/rust-ast-collector.cc (TokenCollector::visit): Use
should_have_str instead of has_str.
* ast/rust-ast.cc (Token::as_string): Likewise.
* expand/rust-macro-builtins-offset-of.cc
(MacroBuiltin::offset_of_handler): Likewise.
* lex/rust-lex.cc (Lexer::dump_and_skip): Likewise.
* ast/rust-ast.h (class Token): Remove dead code.
(Token::has_str): Remove function.
(Token::should_have_str): New function.
* lex/rust-token.cc (Token::get_str): Remove function
definition.
* lex/rust-token.h: Include "rust-diagnostics.h".
(Token::str): Change type from std::unique_ptr<std::string> to
std::string.
(Token::Token): Adjust initialization of str member variable and
the type of the parameter used to initialize it.
(Token::make_identifier): Accept std::string instead of rvalue
reference to std::string.
(Token::make_int): Likewise.
(Token::make_float): Likewise.
(Token::make_string): Likewise.
(Token::make_byte_string): Likewise.
(Token::make_raw_string): Likewise.
(Token::make_inner_doc_comment): Likewise.
(Token::make_outer_doc_comment): Likewise.
(Token::make_lifetime): Likewise.
(Token::get_str): Add definition to function declaration.
(Token::has_str): Remove member function.
(Token::should_have_str): Handle INNER_DOC_COMMENT and
OUTER_DOC_COMMENT.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
6 days agogccrs: Eagerly expand format_args macro
Owen Avery [Fri, 22 Aug 2025 02:22:36 +0000 (22:22 -0400)] 
gccrs: Eagerly expand format_args macro

This allows format_args!(some_macro!(...), ...) to compile.

gcc/rust/ChangeLog:

* expand/rust-macro-builtins-format-args.cc
(format_args_parse_arguments): Split format expression parsing
into...
(format_args_parse_expr): ...a new function here, while handling
eager expansion.
(MacroBuiltin::format_args_handler): Use format_args_parse_expr.

gcc/testsuite/ChangeLog:

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

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
6 days agogccrs: Remove Parser::parse_path_in_expression_pratt
Owen Avery [Thu, 21 Aug 2025 04:05:06 +0000 (00:05 -0400)] 
gccrs: Remove Parser::parse_path_in_expression_pratt

This improves our handling of PathInExpression and fixes
https://github.com/Rust-GCC/gccrs/issues/4056.

gcc/rust/ChangeLog:

* parse/rust-parse-impl.h (Parser::parse_expr): Avoid skipping
or splitting tokens.
(Parser::null_denotation): Assume initial token was not skipped
and adjust function signature to match. Use
parse_path_in_expression instead of
parse_path_in_expression_pratt and handle SCOPE_RESOLUTION.
(Parser::parse_path_in_expression_pratt): Remove function.
* parse/rust-parse.h (null_denotation): Remove initial token
parameter.
(parse_path_in_expression_pratt): Remove function.

gcc/testsuite/ChangeLog:

* rust/compile/global-path-array.rs: New test.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
6 days agogccrs: Add fn pointer implementation test
Pierre-Emmanuel Patry [Fri, 22 Aug 2025 10:35:58 +0000 (12:35 +0200)] 
gccrs: Add fn pointer implementation test

gcc/testsuite/ChangeLog:

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

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
6 days agogccrs: Use as member function instead of static cast
Pierre-Emmanuel Patry [Fri, 22 Aug 2025 10:28:08 +0000 (12:28 +0200)] 
gccrs: Use as member function instead of static cast

gcc/rust/ChangeLog:

* typecheck/rust-coercion.cc (TypeCoercionRules::do_coercion): Use as
member function.
(TypeCoercionRules::coerce_borrowed_pointer): Likewise.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
6 days agogccrs: Put nevertype cercion into it's own function
Pierre-Emmanuel Patry [Thu, 21 Aug 2025 14:09:28 +0000 (16:09 +0200)] 
gccrs: Put nevertype cercion into it's own function

gcc/rust/ChangeLog:

* typecheck/rust-coercion.cc (TypeCoercionRules::do_coercion):
Move nevertype coercion from here...
(TypeCoercionRules::coerce_never): ... to here.
* typecheck/rust-coercion.h: Add function prototype.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
6 days agogccrs: Change coerce_unsize error handling
Pierre-Emmanuel Patry [Thu, 21 Aug 2025 13:00:02 +0000 (15:00 +0200)] 
gccrs: Change coerce_unsize error handling

Error kind were split between error state and out bool parameter.

gcc/rust/ChangeLog:

* typecheck/rust-coercion.cc (TypeCoercionRules::do_coercion): Adapt
call to new return type.
(TypeCoercionRules::coerce_unsized): Change error handling.
* typecheck/rust-coercion.h: Update function prototype and add new
CoerceUnsizedError error type.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
6 days agogccrs: Refactor return statements
Pierre-Emmanuel Patry [Thu, 21 Aug 2025 12:58:25 +0000 (14:58 +0200)] 
gccrs: Refactor return statements

gcc/rust/ChangeLog:

* typecheck/rust-coercion.cc (TypeCoercionRules::do_coercion): Refactor
common return statement.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
6 days agogccrs: Remove unused variable assignments
Pierre-Emmanuel Patry [Thu, 21 Aug 2025 11:15:39 +0000 (13:15 +0200)] 
gccrs: Remove unused variable assignments

Multiple local variables were not read beyond their assignments.

gcc/rust/ChangeLog:

* typecheck/rust-hir-type-check-expr.cc (TypeCheckExpr::visit): Remove
unused assignment.
* typecheck/rust-hir-type-check-path.cc (TypeCheckExpr::resolve_segments):
Likewise.
* typecheck/rust-tyty.cc (ParamType::handle_substitions): Likewise.
* typecheck/rust-unify.cc (UnifyRules::go): Likewise.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
6 days agogccrs: Avoid copy when constructing TypeBoundPredicate
Pierre-Emmanuel Patry [Thu, 21 Aug 2025 10:59:19 +0000 (12:59 +0200)] 
gccrs: Avoid copy when constructing TypeBoundPredicate

Construct the TypeBoundPredicate in the vector instead of copying it.

gcc/rust/ChangeLog:

* typecheck/rust-hir-trait-resolve.cc (TraitResolver::resolve_trait):
Construct value in place.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
6 days agogccrs: Remove unused copy
Pierre-Emmanuel Patry [Thu, 21 Aug 2025 10:47:05 +0000 (12:47 +0200)] 
gccrs: Remove unused copy

Variable path was copying the path but not using one of the copies.

gcc/rust/ChangeLog:

* resolve/rust-ast-resolve-stmt.cc (ResolveStmt::visit): Remove
unused copy.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
6 days agogccrs: Convert lookup return type to optional
Pierre-Emmanuel Patry [Tue, 19 Aug 2025 15:06:38 +0000 (17:06 +0200)] 
gccrs: Convert lookup return type to optional

Remove usage of error state (but not error state itelf) and use an
optional to convey the missing value meaning instead.

gcc/rust/ChangeLog:

* backend/rust-compile-expr.cc (CompileExpr::generate_closure_fntype):
Unwrap the optional.
* backend/rust-compile.cc: Change return type container. Adapt code to
new return type.
* typecheck/rust-hir-dot-operator.cc: Likewise.
* typecheck/rust-hir-path-probe.cc: Likewise.
* typecheck/rust-hir-type-check-implitem.cc (TypeCheckImplItemWithTrait::visit):
Likewise.
* typecheck/rust-hir-type-check-type.cc (TypeCheckType::visit):
Likewise.
* typecheck/rust-tyty-bounds.cc (TypeBoundPredicate::contains_item):
Likewise.
(TypeBoundPredicate::lookup_associated_item): Likewise.
(TypeBoundPredicateItem::get_parent): Likewise.
(TypeBoundPredicate::lookup_associated_type): Likewise.
* typecheck/rust-tyty.cc (BaseType::satisfies_bound): Likewise.
* typecheck/rust-hir-type-check-path.cc (TypeCheckExpr::visit): Change
return type.
* typecheck/rust-tyty.h: Likewise.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
6 days agogccrs: Treat function pointers like pointers for cast
Pierre-Emmanuel Patry [Tue, 19 Aug 2025 13:18:27 +0000 (15:18 +0200)] 
gccrs: Treat function pointers like pointers for cast

Function pointers were not allowed to be cast to any integer like type
just like regular pointers were.

gcc/rust/ChangeLog:

* typecheck/rust-casts.cc (TypeCastRules::cast_rules): Authorize
cast from function pointer to integer like type.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
6 days agogccrs: Fix generic type constraints
Pierre-Emmanuel Patry [Tue, 19 Aug 2025 12:29:25 +0000 (14:29 +0200)] 
gccrs: Fix generic type constraints

Constrained symbols were not properly identified, this lead to erroneous
errors with generics.

gcc/rust/ChangeLog:

* typecheck/rust-hir-type-check-base.cc (walk_type_to_constrain): Walk
through all kind of type to collect ty leaves.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
6 days agogccrs: Add null check to reconstruct
Pierre-Emmanuel Patry [Mon, 18 Aug 2025 08:47:56 +0000 (10:47 +0200)] 
gccrs: Add null check to reconstruct

gcc/rust/ChangeLog:

* ast/rust-type.h: Prevent reconstruction on null pointers.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
6 days agogccrs: Remove #[simd_test] support
Owen Avery [Sat, 12 Jul 2025 03:41:53 +0000 (23:41 -0400)] 
gccrs: Remove #[simd_test] support

This attribute is a procedural macro defined by the crate
simd-test-macro, not a built-in macro.

gcc/rust/ChangeLog:

* util/rust-attribute-values.h (Attributes::SIMD_TEST): Remove
static constexpr member variable.
* util/rust-attributes.cc (__definitions): Remove entry for
SIMD_TEST.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
6 days agogccrs: Expect identifier subpatterns to be non-alt
Owen Avery [Mon, 18 Aug 2025 23:03:11 +0000 (19:03 -0400)] 
gccrs: Expect identifier subpatterns to be non-alt

Fixes https://github.com/Rust-GCC/gccrs/issues/4071.

gcc/rust/ChangeLog:

* parse/rust-parse-impl.h (Parser::parse_identifier_pattern):
Use parse_pattern_no_alt to parse identifier pattern
subpatterns.
(Parser::parse_ident_leading_pattern): Likewise.

gcc/testsuite/ChangeLog:

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

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
6 days agogccrs: Improve libformat_parser FFI
Owen Avery [Wed, 13 Aug 2025 00:02:55 +0000 (20:02 -0400)] 
gccrs: Improve libformat_parser FFI

This should remove a use-after-free as well as simplify the FFI
interface.

gcc/rust/ChangeLog:

* ast/rust-fmt.cc (Pieces::collect): Handle changes to ffi
interface.
(Pieces::~Pieces): Remove function definition.
(Pieces::Pieces): Likewise.
(Pieces::operator=): Likewise.
* ast/rust-fmt.h: Include "optional.h".
(rust_ffi_alloc): New extern "C" function declaration.
(rust_ffi_dealloc): Likewise.
(class FFIVec): New class.
(class FFIOpt): Likewise.
(RustHamster::RustHamster): New constructor accepting const
std::string reference.
(struct FormatSpec): Use FFIOpt.
(struct PieceSlice): Remove struct.
(struct RustString): Likewise.
(struct FormatArgsHandle): Likewise.
(collect_pieces): Change function signature.
(clone_pieces): Likewise.
(destroy_pieces): Remove extern "C" function declaration.
(Pieces::~Pieces): Remove function declaration.
(Pieces::operator=): Likewise.
(Pieces::get_pieces): Handle changes to class fields.
(Pieces::Pieces): Remove copy and move constructor declarations,
adjust signature of remaining constructor declaration.
(Pieces::pieces_vector): Remove member variable.
(Pieces::handle): Likewise.
(Pieces::data): Add member variable.
* expand/rust-macro-builtins-asm.cc (expand_inline_asm_strings):
Use references to avoid copying.

libgrust/ChangeLog:

* libformat_parser/src/lib.rs (struct FFIVec): New.
(trait StringLeakExt): Remove.
(struct FFIOpt): New.
(trait IntoFFI): Adjust implementation for Option.
(struct RustHamster): Add lifetime and adjust conversion to and
from &str.
(enum Piece): Adjust definition to handle changes to
RustHamster.
(struct Argument): Likewise.
(struct FormatSpec): Use FFIOpt and RustHamster.
(enum Position): Use RustHamster.
(enum Count): Likewise.
(struct PieceSlice): Replace with...
(typedef PieceVec): ...this.
(struct RustString): Remove.
(struct FormatArgsHandle): Likewise.
(fn collect_pieces): Adjust signature, greatly simplifying
implementation.
(fn clone_pieces): Likewise.
(fn destroy_pieces): Remove.
(trait LayoutExt): New.
(fn rust_ffi_alloc): New.
(fn rust_ffi_dealloc): New.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
6 days agogccrs: fix ICE in convert_tree for tuple destructuring with ref
lishin [Sun, 10 Aug 2025 21:21:59 +0000 (22:21 +0100)] 
gccrs: fix ICE in convert_tree for tuple destructuring with ref

gcc/rust/ChangeLog:

* backend/rust-compile-pattern.cc (CompilePatternLet::visit):
Handle tuple destructuring containing by-ref.

gcc/testsuite/ChangeLog:

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

Signed-off-by: lishin <lishin1008@gmail.com>
6 days agogccrs: Implement rest pattern support for slice patterns
Yap Zhi Heng [Mon, 11 Aug 2025 13:51:11 +0000 (21:51 +0800)] 
gccrs: Implement rest pattern support for slice patterns

This patch adds support for compiling rest patterns present in slice patterns
(e.g. `[1, .., 2]`). 006t.original output from compiling match-slicepattern-slice-2.rs
for first 2 match arms:

...
  if (RUSTTMP.3.len > 1 && *NON_LVALUE_EXPR <RUSTTMP.3.data> == 1)
    {
      {
                struct () RUSTTMP.4;
        {
                    struct () RUSTTMP.5;
          {
           ..
          }
        }
        goto <D.139>;
      }
    }
  if ((RUSTTMP.3.len > 1 && *NON_LVALUE_EXPR <RUSTTMP.3.data> == 0) && *(RUSTTMP.3.data + (sizetype) (RUSTTMP.3.len + 18446744073709551615) * 4) == 0)
    {
      {
                struct () RUSTTMP.6;
        {
                    struct () RUSTTMP.7;
          {
          }
        }
        goto <D.139>;
      }
    }
...

gcc/rust/ChangeLog:

* hir/tree/rust-hir-pattern.h: Add SlicePatternItems base class and
SlicePatternItemsNoRest/SlicePatternItemsHasRest derived classes.
Update SlicePattern to hold patterns using the new classes.
* hir/tree/rust-hir-full-decls.h: Declare new classes.
* hir/tree/rust-hir.cc: Add visits for new classes.
* hir/tree/rust-hir-visitor.h: Add visits for new classes.
* hir/tree/rust-hir-visitor.cc: Implement visits for new classes.
* hir/rust-hir-dump.h: Add visits for new classes.
* hir/rust-hir-dump.cc: Implement Dump::visit for new classes.
* hir/rust-ast-lower-base.h: Declare new lower_slice_pattern_no_rest/has_rest
methods.
* hir/rust-ast-lower-base.cc: Implement lower_slice_pattern_no_rest/has_rest
to lower AST slice pattern items to HIR.
* hir/rust-ast-lower-pattern.cc: Update ASTLoweringPattern::visit for
SlicePattern to use new lowering methods.
* backend/rust-compile-pattern.cc: Update CompilePatternCheckExpr::visit
and CompilePatternBindings::visit for SlicePattern to handle
SlicePatternItemsNoRest/HasRest.
* checks/errors/borrowck/rust-bir-builder-pattern.cc: Update
PatternBindingBuilder::visit for SlicePattern to iterate members correctly.
* checks/errors/borrowck/rust-bir-builder-struct.h: Add visits for new
classes.
* checks/errors/borrowck/rust-function-collector.h: Add visits for new
classes.
* checks/errors/rust-const-checker.h: Add visits for new classes.
* checks/errors/rust-const-checker.cc: Implement empty visits for new classes.
* checks/errors/rust-hir-pattern-analysis.h: Add visits for new classes.
* checks/errors/rust-hir-pattern-analysis.cc: Implement empty visits for new
classes.
* checks/errors/rust-unsafe-checker.h: Add visits for new classes.
* checks/errors/rust-unsafe-checker.cc: Implement empty visits for new
classes.
* typecheck/rust-hir-type-check-pattern.cc: Update TypeCheckPattern::visit
for SlicePattern to handle SlicePatternItemsNoRest/HasRest.

gcc/testsuite/ChangeLog:

* rust/compile/slice_rest_pattern.rs: Removed -fsyntax-only.

Signed-off-by: Yap Zhi Heng <yapzhhg@gmail.com>
6 days agogccrs: Collect lang items after expansion
Owen Avery [Thu, 10 Jul 2025 22:57:12 +0000 (18:57 -0400)] 
gccrs: Collect lang items after expansion

This allows macros to create lang items.

gcc/rust/ChangeLog:

* rust-session-manager.cc (Session::compile_crate): Collect lang
items after expansion.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
6 days agogccrs: Replace old read-only checker with new implementation.
Ryutaro Okada [Tue, 12 Aug 2025 05:17:09 +0000 (22:17 -0700)] 
gccrs: Replace old read-only checker with new implementation.

gcc/rust/ChangeLog:

* Make-lang.in: Replace old read-only checker with new implementation.
* checks/errors/rust-readonly-check.cc (ReadonlyChecker::ReadonlyChecker):
Replace old read-only checker with new implementation.
* checks/errors/rust-readonly-check.h:
Replace old read-only checker with new implementation.
* rust-session-manager.cc (Session::compile_crate):
Switch to new read-only checker.
* checks/errors/rust-readonly-check2.cc: Removed.
* checks/errors/rust-readonly-check2.h: Removed.

Signed-off-by: Ryutaro Okada <1015ryu88@gmail.com>
6 days agogccrs: Read-only check if the variable is mutable type.
Ryutaro Okada [Tue, 12 Aug 2025 05:01:08 +0000 (22:01 -0700)] 
gccrs: Read-only check if the variable is mutable type.

gcc/rust/ChangeLog:

* checks/errors/rust-readonly-check2.cc (ReadonlyChecker::check_variable):
Read-only check if the variable is mutable type.
(ReadonlyChecker::is_mutable_type): Read-only check if the variable is mutable type.
* checks/errors/rust-readonly-check2.h: Read-only check if the variable is mutable type.

Signed-off-by: Ryutaro Okada <1015ryu88@gmail.com>
6 days agogccrs: Add IdentifierPattern subpattern support for ClosureParamInfer
Yap Zhi Heng [Tue, 12 Aug 2025 14:02:08 +0000 (22:02 +0800)] 
gccrs: Add IdentifierPattern subpattern support for ClosureParamInfer

gcc/rust/ChangeLog:

* typecheck/rust-hir-type-check-pattern.cc(ClosureParamInfer(IdentifierPattern)):
Resolve subpattern types for IdentifierPattern.

Signed-off-by: Yap Zhi Heng <yapzhhg@gmail.com>
6 days agogccrs: Implement let statement support for IdentifierPattern's subpatterns
Yap Zhi Heng [Tue, 12 Aug 2025 13:58:18 +0000 (21:58 +0800)] 
gccrs: Implement let statement support for IdentifierPattern's subpatterns

Trimmed GIMPLE code gen for let-identifierpattern-subpattern.rs

...
      RUSTTMP.1.__0 = 0;
      RUSTTMP.1.__1 = 2;
      RUSTTMP.1.__2 = 3;
      bar = RUSTTMP.1.__0;
      RUSTTMP.2 = RUSTTMP.1.__1;
      RUSTTMP.3 = RUSTTMP.1.__2;
      foo.__0 = 0;
      foo.__1 = 2;
      foo.__2 = 3;
      ret = 1;
      RUSTTMP.5 = foo;
      _1 = RUSTTMP.5.__0;
      _2 = _1 == 0;
      _3 = RUSTTMP.5.__1;
      _4 = _3 == 2;
      _5 = _2 & _4;
      _6 = RUSTTMP.5.__2;
      _7 = _6 == 3;
      _8 = _5 & _7;
      if (_8 != 0) goto <D.143>; else goto <D.144>;
      <D.143>:
      {
        {
          ret = bar;
        }
        goto <D.137>;
      }
...

gcc/rust/ChangeLog:

* backend/rust-compile-pattern.cc(CompilePatternLet::visit(IdentifierPattern)):
Add support for subpatterns.
* backend/rust-compile-var-decl.h(CompileVarDecl::visit(IdentifierPattern)):
Implement compilation for subpatterns.

Signed-off-by: Yap Zhi Heng <yapzhhg@gmail.com>
6 days agogccrs: fix ICE by skipping invalid (non-FNDEF) candidates
lishin [Wed, 13 Aug 2025 18:16:52 +0000 (19:16 +0100)] 
gccrs: fix ICE by skipping invalid (non-FNDEF) candidates

gcc/rust/ChangeLog:

* typecheck/rust-hir-dot-operator.cc (MethodResolver::Select):
Skip asserts by checking candidate type and using early-continue.
(MethodResolver::try_select_predicate_candidates):
Skip invalid candidates.

gcc/testsuite/ChangeLog:

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

Signed-off-by: lishin <lishin1008@gmail.com>
6 days agogccrs: fix ICE for empty enum variant
lishin [Thu, 14 Aug 2025 15:23:50 +0000 (16:23 +0100)] 
gccrs: fix ICE for empty enum variant

gcc/rust/ChangeLog:

* rust-gcc.cc (constructor_expression):
Ensure vec_alloc reserves at least one element.

gcc/testsuite/ChangeLog:

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

Signed-off-by: lishin <lishin1008@gmail.com>
6 days agogccrs: Reject empty cfg_attr
Pierre-Emmanuel Patry [Wed, 13 Aug 2025 15:20:40 +0000 (17:20 +0200)] 
gccrs: Reject empty cfg_attr

gcc/rust/ChangeLog:

* ast/rust-ast.cc (Attribute::check_cfg_predicate): Emit an error with
empty cfg_attr input.

gcc/testsuite/ChangeLog:

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

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
6 days agogccrs: Improve handling of non-final path segments
Owen Avery [Mon, 11 Aug 2025 17:44:25 +0000 (13:44 -0400)] 
gccrs: Improve handling of non-final path segments

gcc/rust/ChangeLog:

* resolve/rust-forever-stack.hxx
(ForeverStack::resolve_segments): Remove usage of optional
reference, allow non-final path segments to resolve to types
even outside the type namespace, and allow resolution to
progress past non-final path segments which resolve to modules.

gcc/testsuite/ChangeLog:

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

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
6 days agogccrs: nr2.0: Fix ChangeLog entry
Owen Avery [Thu, 31 Jul 2025 21:23:52 +0000 (17:23 -0400)] 
gccrs: nr2.0: Fix ChangeLog entry

"options.txt" was supposed to be "options.h".

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
6 days agogccrs: Fix Self macro invocation parsing failure
Pierre-Emmanuel Patry [Tue, 12 Aug 2025 15:40:27 +0000 (17:40 +0200)] 
gccrs: Fix Self macro invocation parsing failure

No check was performed and the value was assumed non null.
Path conversion returned an empty path for "Self" due to a hack in
generics Self injection that prevented any "Self!" macro from beeing
recognized correctly.

gcc/rust/ChangeLog:

* parse/rust-parse-impl.h (Parser::parse_stmt_or_expr): Add null check
on parse_macro_invocation_partial call.
* ast/rust-path.cc (Path::convert_to_simple_path): Do not exclude
capitalized "Self".

gcc/testsuite/ChangeLog:

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

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
6 days agogccrs: expand: Add handling for macro expansion in pattern context
Arthur Cohen [Wed, 13 Aug 2025 09:39:58 +0000 (11:39 +0200)] 
gccrs: expand: Add handling for macro expansion in pattern context

gcc/rust/ChangeLog:

* ast/rust-ast-fragment.cc (Fragment::is_pattern_fragment): New function.
(Fragment::take_pattern_fragment): Likewise.
(Fragment::assert_single_fragment): Likewise.
* ast/rust-ast-fragment.h: Declare them.
* ast/rust-ast.cc (SingleASTNode::SingleASTNode): Add new constructor for pattern
single AST nodes.
(SingleASTNode::operator=): Handle patterns.
(SingleASTNode::accept_vis): Likewise.
(SingleASTNode::is_error): Likewise.
(SingleASTNode::as_string): Likewise.
* ast/rust-ast.h: Add get_pattern_ptr() functions.
* ast/rust-expr.h: Likewise.
* ast/rust-item.h: Likewise.
* ast/rust-pattern.h: Likewise.
* ast/rust-stmt.h: Likewise.
* expand/rust-expand-visitor.cc (derive_item): Use new API enum values.
(expand_item_attribute): Likewise.
(expand_stmt_attribute): Likewise.
(ExpandVisitor::maybe_expand_pattern): New function.
(ExpandVisitor::expand_closure_params): Handle patterns.
(ExpandVisitor::visit): Add new visitors for patterns and missed exprs.
* expand/rust-expand-visitor.h: Declare them.
* expand/rust-macro-expand.cc (transcribe_pattern): New function.
(transcribe_context): Call it.
* expand/rust-macro-expand.h (struct MacroExpander): New Context type.

gcc/testsuite/ChangeLog:

* rust/compile/issue-3726.rs: New test.
* rust/compile/issue-3898.rs: New test.

6 days agogccrs: ast: Cleanup SingleASTNode::NodeType
Arthur Cohen [Tue, 12 Aug 2025 15:04:03 +0000 (17:04 +0200)] 
gccrs: ast: Cleanup SingleASTNode::NodeType

gcc/rust/ChangeLog:

* ast/rust-ast.h: Change NodeType to enum class Kind.
* ast/rust-ast-fragment.cc: Use new names.
* ast/rust-ast-fragment.h: Likewise.
* ast/rust-ast.cc (SingleASTNode::SingleASTNode): Likewise.

6 days agogccrs: Detect failure to match an ident metavariable
Owen Avery [Sun, 10 Aug 2025 15:56:54 +0000 (11:56 -0400)] 
gccrs: Detect failure to match an ident metavariable

Fixes https://github.com/Rust-GCC/gccrs/issues/4054

gcc/rust/ChangeLog:

* parse/rust-parse-impl.h
(Parser::parse_identifier_or_keyword_token): Record error on
failure.

gcc/testsuite/ChangeLog:

* rust/compile/macros/mbe/macro-issue4054.rs: New test.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
6 days agogccrs: Add name resolution processing for discriminant values
Ryutaro Okada [Fri, 8 Aug 2025 05:51:00 +0000 (22:51 -0700)] 
gccrs: Add name resolution processing for discriminant values

gcc/rust/ChangeLog:

* resolve/rust-ast-resolve-stmt.h:
Add name resolution processing for discriminant values.
gcc/testsuite/ChangeLog:

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

Signed-off-by: Ryutaro Okada <1015ryu88@gmail.com>
6 days agogccrs: fix error number
Ryutaro Okada [Tue, 11 Mar 2025 10:59:17 +0000 (19:59 +0900)] 
gccrs: fix error number

gcc/rust/ChangeLog:

* typecheck/rust-tyty-call.cc (TypeCheckCallExpr::visit): fix error code

Signed-off-by: Ryutaro Okada <1015ryu88@gmail.com>
6 days agogccrs: CfgStrip AST nodes marked with #[test]
Owen Avery [Tue, 12 Aug 2025 02:06:02 +0000 (22:06 -0400)] 
gccrs: CfgStrip AST nodes marked with #[test]

gcc/rust/ChangeLog:

* expand/rust-cfg-strip.cc: Include "rust-macro-expand.h".
(fails_cfg): Rename to...
(CfgStrip::fails_cfg): ...here and handle test attributes.
(fails_cfg_with_expand): Rename to...
(CfgStrip::fails_cfg_with_expand): ...here and handle test
attributes.
* expand/rust-cfg-strip.h (struct ExpansionCfg): Forward
declare.
(CfgStrip::fails_cfg): New member function.
(CfgStrip::fails_cfg_with_expand): Likewise.
(CfgStrip::CfgStrip): Accept reference to ExpansionCfg.
(CfgStrip::expansion_cfg): New member variable.
* rust-session-manager.cc (Session::expansion): Pass
ExpansionCfg instance to CfgStrip constructor.

gcc/testsuite/ChangeLog:

* rust/compile/cfg-test.rs: New test.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
6 days agogccrs: Add test for multiple wildcard use declaration.
Pierre-Emmanuel Patry [Tue, 12 Aug 2025 11:53:13 +0000 (13:53 +0200)] 
gccrs: Add test for multiple wildcard use declaration.

gcc/testsuite/ChangeLog:

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

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
6 days agogccrs: Remove abort on wildcard patterns
Pierre-Emmanuel Patry [Mon, 11 Aug 2025 21:06:12 +0000 (23:06 +0200)] 
gccrs: Remove abort on wildcard patterns

gcc/rust/ChangeLog:

* resolve/rust-early-name-resolver-2.0.cc (Early::finalize_rebind_import):
Do not abort on wildcard patterns.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
6 days agogccrs: Emit an error message on unsupported llvm_asm
Pierre-Emmanuel Patry [Mon, 11 Aug 2025 14:52:32 +0000 (16:52 +0200)] 
gccrs: Emit an error message on unsupported llvm_asm

llvm_asm was never meant to be completely supported since it has been
replaced with the asm macro but we still need it to compile some parts
of libcore, previously the compiler was aborting when an unsupported
llvm_asm construct was found.

gcc/rust/ChangeLog:

* ast/rust-expr.h: Add const getters to llvm members.
* hir/rust-ast-lower-expr.cc (check_llvm_asm_support): Check llvm_asm
usage validity.
(ASTLoweringExpr::visit): Emit an error message instead of aborting.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
6 days agogccrs: Fix infinite loop on inline assembly clobbers
Pierre-Emmanuel Patry [Mon, 11 Aug 2025 14:22:32 +0000 (16:22 +0200)] 
gccrs: Fix infinite loop on inline assembly clobbers

Fix Rust-GCC/gccrs#4046 where the inline llvm_asm macro parser did not
expect a comma.

gcc/rust/ChangeLog:

* expand/rust-macro-builtins-asm.cc (parse_llvm_clobbers): Expect a
comma between clobbers.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
6 days agogccrs: Refactor inline assembly constructor
Pierre-Emmanuel Patry [Mon, 11 Aug 2025 13:58:53 +0000 (15:58 +0200)] 
gccrs: Refactor inline assembly constructor

gcc/rust/ChangeLog:

* expand/rust-macro-builtins-asm.cc (parse_asm): Simplify expression.
(parse_llvm_asm): Likewise.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
6 days agogccrs: Add checks to ExpandVisitor
Owen Avery [Sat, 9 Aug 2025 22:33:58 +0000 (18:33 -0400)] 
gccrs: Add checks to ExpandVisitor

This should help detect issues like
https://github.com/Rust-GCC/gccrs/issues/3444.

gcc/rust/ChangeLog:

* ast/rust-ast.h (Stmt::get_node_id): Make virtual.
(Type::get_node_id): Likewise.
(AssociatedItem::get_node_id): New virtual member function.
* ast/rust-expr.h (TypeCastExpr::get_casted_expr_ptr): New
member function.
(TypeCastExpr::get_type_to_cast_to_ptr): Likewise.
(ClosureExprInner::get_definition_expr_ptr): Likewise.
* ast/rust-item.h (TypeAlias::get_node_id): New member function
to override AssociatedItem::get_node_id.
(ConstantItem::get_node_id): Likewise.
* expand/rust-expand-visitor.cc
(ExpandVisitor::maybe_expand_expr): Adjust
macro_invoc_expect_id.
(ExpandVisitor::maybe_expand_type): Likewise and add an overload
for std::unique_ptr<TypeNoBounds>.
(ExpandVisitor::visit): Check macro_invoc_expect_id and
generally improve visitors so that the testsuite will still
pass.
* expand/rust-expand-visitor.h (ExpandVisitor::ExpandVisitor):
Initialize member variable macro_invoc_expect_id.
(ExpandVisitor::maybe_expand_type): Add an overload for
std::unique_ptr<TypeNoBounds>.
(ExpandVisitor::expand_macro_children): Adjust
macro_invoc_expect_id.
(ExpandVisitor::visit): Add an overload for TypeCastExpr.
(ExpandVisitor::macro_invoc_expect_id): New member variable.

gcc/testsuite/ChangeLog:

* rust/compile/macros/mbe/macro49.rs: Add missing lang items.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
6 days agogccrs: Fix ICE on exclusive_range_pattern lowering
lishin [Fri, 8 Aug 2025 21:35:20 +0000 (22:35 +0100)] 
gccrs: Fix ICE on exclusive_range_pattern lowering

gcc/rust/ChangeLog:

* backend/rust-compile-pattern.cc (CompilePatternCheckExpr::visit):
Check upper compare operator.
* hir/rust-ast-lower-pattern.cc (ASTLoweringPattern::visit):
Handle lowering of exclusive range pattern.
* hir/tree/rust-hir-pattern.h (class RangePattern):
Add support for exclusive ranges in HIR representation.

gcc/testsuite/ChangeLog:

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

Signed-off-by: lishin <lishin1008@gmail.com>
6 days agogccrs: Exclude some inline assembly test
Pierre-Emmanuel Patry [Fri, 8 Aug 2025 16:50:58 +0000 (18:50 +0200)] 
gccrs: Exclude some inline assembly test

Those tests contains inline assembly which is architecture dependent.

gcc/testsuite/ChangeLog:

* rust/execute/inline_asm_inout_ident.rs: Add arch filter on test.
* rust/execute/inline_asm_inout_var.rs: Likewise.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
6 days agogccrs: Handle attributes in expression macros
Owen Avery [Sat, 12 Jul 2025 03:35:53 +0000 (23:35 -0400)] 
gccrs: Handle attributes in expression macros

gcc/rust/ChangeLog:

* expand/rust-macro-expand.cc (transcribe_expression): Parse any
outer attributes before parsing an expression.
* parse/rust-parse.h (Parser::parse_outer_attributes): Make
public.

gcc/testsuite/ChangeLog:

* rust/compile/attr-macro.rs: New test.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
6 days agogccrs: Improve vector usages and avoid copies.
Pierre-Emmanuel Patry [Wed, 6 Aug 2025 15:35:03 +0000 (17:35 +0200)] 
gccrs: Improve vector usages and avoid copies.

Several place built an object before copying it in a vector. This commit
favorise in place construction and use readily available vector size to
reserve memory beforehand.

gcc/rust/ChangeLog:

* ast/rust-expr.h (struct TupleClobber): Add constructor.
* backend/rust-compile-context.h (struct fncontext): Likewise.
* typecheck/rust-hir-dot-operator.h: Likewise.
* typecheck/rust-tyty-variance-analysis-private.h (struct Constraint):
Likewise.
* typecheck/rust-unify.h: Likewise.
* ast/rust-ast-builder.cc (Builder::new_lifetime_param): Add memory
reservation and construct in place.
(Builder::new_generic_args): Likewise.
* ast/rust-ast-collector.cc (TokenCollector::newline): Likewise.
(TokenCollector::indentation): Likewise.
(TokenCollector::comment): Likewise.
* ast/rust-desugar-apit.cc: Likewise.
* ast/rust-path.cc (Path::convert_to_simple_path): Likewise.
(TypePath::as_simple_path): Likewise.
* ast/rust-path.h: Likewise.
* backend/rust-compile-type.cc (TyTyResolveCompile::visit): Likewise.
(TyTyResolveCompile::create_dyn_obj_record): Likewise.
* checks/errors/rust-hir-pattern-analysis.cc (Matrix::specialize):
Likewise.
(WitnessMatrix::apply_constructor): Likewise.
(check_match_usefulness): Likewise.
* expand/rust-derive-clone.cc (DeriveClone::clone_fn): Likewise.
* expand/rust-macro-builtins-asm.cc (parse_clobber_abi): Likewise.
* expand/rust-macro-expand.cc (MacroExpander::parse_proc_macro_output):
Likewise.
* hir/rust-ast-lower-base.cc (ASTLoweringBase::lower_generic_args):
Likewise.
(ASTLoweringBase::lower_extern_block): Likewise.
* hir/rust-ast-lower-enumitem.h: Likewise.
* hir/rust-ast-lower-expr.cc (ASTLoweringExpr::visit): Likewise.
* hir/rust-ast-lower-extern.h: Likewise.
* hir/rust-ast-lower-implitem.cc (ASTLowerImplItem::visit): Likewise.
(ASTLowerTraitItem::visit): Likewise.
* hir/rust-ast-lower-item.cc (ASTLoweringItem::visit): Likewise.
* hir/rust-ast-lower-pattern.cc (ASTLoweringPattern::visit): Likewise.
* hir/rust-ast-lower.cc (ASTLowering::go): Likewise.
(ASTLoweringBlock::visit): Likewise.
(ASTLoweringIfLetBlock::desugar_iflet): Likewise.
(ASTLoweringExprWithBlock::visit): Likewise.
(ASTLowerPathInExpression::visit): Likewise.
(ASTLowerQualPathInExpression::visit): Likewise.
* hir/tree/rust-hir.cc (PathPattern::convert_to_simple_path): Likewise.
(TypePath::as_simple_path): Likewise.
* metadata/rust-export-metadata.cc (ExportContext::emit_function):
Likewise.
* parse/rust-parse-impl.h (Parser::parse_decl_macro_def): Likewise.
(Parser::parse_lifetime_params): Likewise.
* resolve/rust-ast-resolve-item.cc (ResolveTraitItems::visit):
Likewise.
(ResolveItem::visit): Likewise.
(flatten_list): Likewise.
* resolve/rust-ast-resolve-pattern.cc (PatternDeclaration::visit):
Likewise.
* typecheck/rust-autoderef.cc (AutoderefCycle::try_autoderefed):
Likewise.
* typecheck/rust-coercion.cc (TypeCoercionRules::coerce_unsized):
Likewise.
* typecheck/rust-hir-dot-operator.cc: Likewise.
* typecheck/rust-hir-path-probe.cc: Likewise.
* typecheck/rust-hir-trait-resolve.cc (TraitResolver::resolve_trait):
Likewise.
* typecheck/rust-hir-type-check-expr.cc (TypeCheckExpr::visit):
Likewise.
(TypeCheckExpr::resolve_fn_trait_call): Likewise.
* typecheck/rust-hir-type-check-implitem.cc (TypeCheckTopLevelExternItem::visit):
Likewise.
(TypeCheckImplItem::visit): Likewise.
* typecheck/rust-hir-type-check-item.cc (TypeCheckItem::visit):
Likewise.
* typecheck/rust-hir-type-check-pattern.cc (TypeCheckPattern::visit):
Likewise.
* typecheck/rust-hir-type-check-struct.cc (TypeCheckStructExpr::resolve):
Likewise.
* typecheck/rust-hir-type-check-type.cc (TypeCheckType::visit):
Likewise.
* typecheck/rust-hir-type-check.cc (TraitItemReference::get_type_from_fn):
Likewise.
* typecheck/rust-typecheck-context.cc (TypeCheckContext::push_return_type):
Likewise.
(TypeCheckContext::insert_associated_impl_mapping): Likewise.
* typecheck/rust-tyty-bounds.cc (TypeBoundsProbe::scan): Likewise.
(TypeBoundsProbe::add_trait_bound): Likewise.
(TypeBoundPredicate::operator=): Likewise.
(TypeBoundPredicateItem::get_tyty_for_receiver): Likewise.
(TypeBoundPredicate::get_associated_type_items): Likewise.
* typecheck/rust-tyty-call.cc (TypeCheckMethodCallExpr::go): Likewise.
* typecheck/rust-tyty-subst.cc (SubstitutionRef::clone_substs):
Likewise.
(SubstitutionRef::infer_substitions): Likewise.
(SubstitutionRef::are_mappings_bound): Likewise.
* typecheck/rust-tyty-variance-analysis.cc (GenericTyPerCrateCtx::query_generic_variance):
Likewise.
(GenericTyVisitorCtx::add_constraint): Likewise.
* typecheck/rust-tyty.cc (FnPtr::clone): Likewise.
(DynamicObjectType::get_object_items): Likewise.
* typecheck/rust-unify.cc (UnifyRules::Resolve): Likewise.
(UnifyRules::go): Likewise.
(UnifyRules::expect_tuple): Likewise.
* util/rust-canonical-path.h: Likewise.
* util/rust-token-converter.cc (convert): Likewise.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
6 days agogccrs: Add missing direct include
Pierre-Emmanuel Patry [Wed, 6 Aug 2025 08:35:06 +0000 (10:35 +0200)] 
gccrs: Add missing direct include

gcc/rust/ChangeLog:

* util/bi-map.h: Add include directive for required declarations.
* util/fnv-hash.h: Likewise.
* util/rust-dump.h: Likewise.
* util/rust-inline-visitor.h: Likewise.
* util/rust-unwrap-segment.h: Likewise.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
6 days agogccrs: Add header guards
Pierre-Emmanuel Patry [Wed, 6 Aug 2025 09:17:21 +0000 (11:17 +0200)] 
gccrs: Add header guards

gcc/rust/ChangeLog:

* util/rust-lang-item.h (RUST_LANG_ITEM_H): Add header guards.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
6 days agogccrs: Fix friendly class to friendly struct qualification
Pierre-Emmanuel Patry [Wed, 6 Aug 2025 08:18:56 +0000 (10:18 +0200)] 
gccrs: Fix friendly class to friendly struct qualification

gcc/rust/ChangeLog:

* parse/rust-parse.h: Change class to struct for friend qualification.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
6 days agogccrs: Remove cyclic inclusion and unused headers.
Pierre-Emmanuel Patry [Tue, 5 Aug 2025 16:41:18 +0000 (18:41 +0200)] 
gccrs: Remove cyclic inclusion and unused headers.

gcc/rust/ChangeLog:

* checks/lints/rust-lint-marklive-base.h (RUST_HIR_LIVENESS_BASE):
Remove header includes.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
6 days agogccrs: Prevent copy from vector implementation
Pierre-Emmanuel Patry [Tue, 5 Aug 2025 15:58:26 +0000 (17:58 +0200)] 
gccrs: Prevent copy from vector implementation

gcc/rust/ChangeLog:

* ast/rust-cond-compilation.h: Delete copy constructor for
ConfigurationAll and ConfigurationAny.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
6 days agogccrs: Fix variadic member flag value in constructor
Pierre-Emmanuel Patry [Tue, 5 Aug 2025 15:09:08 +0000 (17:09 +0200)] 
gccrs: Fix variadic member flag value in constructor

gcc/rust/ChangeLog:

* ast/rust-type.h: Update member instead of parameter

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
6 days agogccrs: Move vector of unique_ptr
Pierre-Emmanuel Patry [Tue, 5 Aug 2025 13:19:32 +0000 (15:19 +0200)] 
gccrs: Move vector of unique_ptr

gcc/rust/ChangeLog:

* ast/rust-cond-compilation.h: Move vector instead of passing it by
value.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
6 days agogccrs: Avoid transitive declaration
Pierre-Emmanuel Patry [Tue, 5 Aug 2025 09:49:21 +0000 (11:49 +0200)] 
gccrs: Avoid transitive declaration

gcc/rust/ChangeLog:

* ast/rust-pattern.h: Include header directly.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
6 days agogccrs: Copy cfg_attrs instead setting it to itself
Pierre-Emmanuel Patry [Tue, 5 Aug 2025 09:45:00 +0000 (11:45 +0200)] 
gccrs: Copy cfg_attrs instead setting it to itself

CfgAttribute copy constructor did not copy cfg_attrs properly.

gcc/rust/ChangeLog:

* ast/rust-cond-compilation.h: Copy cfg_attrs

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
6 days agogccrs: Add missing header inclusion
Pierre-Emmanuel Patry [Tue, 5 Aug 2025 09:43:25 +0000 (11:43 +0200)] 
gccrs: Add missing header inclusion

Header relied on transitive header inclusion.

gcc/rust/ChangeLog:

* ast/rust-ast-formatting.h (RUST_AST_FORMATTING_H): Include required
headers directly.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
6 days agogccrs: Improve handling of AttrInputLiteral
Owen Avery [Tue, 5 Aug 2025 20:44:02 +0000 (16:44 -0400)] 
gccrs: Improve handling of AttrInputLiteral

Also adjusts a few error messages to be more in line with rustc (and
more amenable to extract_string_literal usage).

gcc/rust/ChangeLog:

* util/rust-attributes.cc (Attributes::extract_string_literal):
New function definition.
* util/rust-attributes.h (Attributes::extract_string_literal):
New function declaration.
* ast/rust-collect-lang-items.cc (get_lang_item_attr): Use
extract_string_literal.
* backend/rust-compile-base.cc: Include "rust-attributes.h".
(HIRCompileBase::handle_link_section_attribute_on_fndecl):
Use extract_string_literal.
(HIRCompileBase::handle_must_use_attribute_on_fndecl): Likewise.
* hir/rust-ast-lower-base.cc
(ASTLoweringBase::handle_lang_item_attribute): Likewise.
* rust-session-manager.cc (Session::handle_crate_name):
Likewise.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
6 days agogccrs: Refactor HIR::PatternItem class and its derivatives
Yap Zhi Heng [Sat, 2 Aug 2025 09:03:53 +0000 (17:03 +0800)] 
gccrs: Refactor HIR::PatternItem class and its derivatives

Renames HIR::TupleItems to PatternItems for better generalization because it will be reused for
SlicePattern in the future. Enum values MULTIPLE/RANGED are renamed to NO_REST/HAS_REST
to reduce misleadingness as it is completely different and separate from the ranged values  `..`
representation. This results in renaming of all related classes and updates to all code that
references them.

gcc/rust/ChangeLog:

* hir/tree/rust-hir-pattern.h:
- Rename TupleItems to PatternItems.
- Rename TuplePatternItemsMultiple/Ranged & TupleStructItemsRange/NoRange to
TuplePatternItemsNoRest/HasRest and TupleStructItemsNoRest/HasRest.
- Update enum values to NO_REST/HAS_REST.
- Rename clone_tuple_items_impl to clone_pattern_items_impl.
* hir/tree/rust-hir-full-decls.h: Renamed the classes accordingly.
* hir/tree/rust-hir-visitor.h: Renamed the classes accordingly.
* hir/tree/rust-hir-visitor.cc: Renamed the classes accordingly.
* hir/rust-hir-dump.h: Renamed the classes accordingly.
* hir/rust-hir-dump.cc: Renamed the classes accordingly.
* hir/tree/rust-hir.cc: Renamed the classes accordingly.
* hir/rust-ast-lower-base.cc: Renamed the classes accordingly.
* hir/rust-ast-lower-pattern.cc: Renamed the classes accordingly.
* backend/rust-compile-pattern.cc: Renamed the classes accordingly.
* backend/rust-compile-var-decl.h: Renamed the classes accordingly.
* checks/errors/borrowck/rust-bir-builder-pattern.cc: Renamed the classes accordingly.
* checks/errors/borrowck/rust-bir-builder-struct.h: Renamed the classes accordingly.
* checks/errors/borrowck/rust-function-collector.h: Renamed the classes accordingly.
* checks/errors/rust-const-checker.cc: Renamed the classes accordingly.
* checks/errors/rust-const-checker.h: Renamed the classes accordingly.
* checks/errors/rust-hir-pattern-analysis.cc: Renamed the classes accordingly.
* checks/errors/rust-hir-pattern-analysis.h: Renamed the classes accordingly.
* checks/errors/rust-unsafe-checker.cc: Renamed the classes accordingly.
* checks/errors/rust-unsafe-checker.h: Renamed the classes accordingly.
* checks/errors/rust-readonly-check2.cc: Renamed the classes accordingly.
* typecheck/rust-hir-type-check-pattern.cc: Update references to renamed classes and enum
values.

Signed-off-by: Yap Zhi Heng <yapzhhg@gmail.com>
6 days agogccrs: Explicitly use an empty vector for structural eq
Pierre-Emmanuel Patry [Tue, 5 Aug 2025 08:55:33 +0000 (10:55 +0200)] 
gccrs: Explicitly use an empty vector for structural eq

Previous code was technically valid since the moved from vector was
empty but explicitly setting it empty with it's own name will help.

gcc/rust/ChangeLog:

* expand/rust-derive-eq.cc: Use empty vector explicitly.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
7 days agodwarf: handle repeated decl with different btf_decl_tags [PR122248]
David Faust [Tue, 28 Oct 2025 18:13:25 +0000 (11:13 -0700)] 
dwarf: handle repeated decl with different btf_decl_tags [PR122248]

The check in gen_btf_tag_dies which asserted that if the target DIE
already had an annotation then it must be the same as the one we are
attempting to add was too strict.  It is valid for multiple declarations
of the same object to appear with different decl_tags, in which case the
tags from each are accumulated in DECL_ATTRIBUTES.  The existing
annotation may not be the same as the one being added, since new tags
will be added to the head of the chain.

The proper behavior is to always replace any existing AT_GNU_annotation
to refer to the chain of annotations we have just constructed, whether
the head of that chain is the same or not.

PR debug/122248

gcc/

* dwarf2out.cc (gen_btf_tag_dies): Always replace an existing
AT_GNU_annotation on the target die.

gcc/testsuite/

* gcc.dg/debug/dwarf2/dwarf-btf-decl-tag-4.c: New.
* gcc.dg/debug/dwarf2/dwarf-btf-decl-tag-5.c: New.
* gcc.dg/debug/dwarf2/dwarf-btf-decl-tag-6.c: New.

7 days agobtf: do not prune at typedefs
David Faust [Wed, 29 Oct 2025 22:21:16 +0000 (15:21 -0700)] 
btf: do not prune at typedefs

The existing BTF pruning logic meant that an anonymous struct or
union type hidden behind a typedef, such as in the common construct:

  typedef struct { ... } my_struct_type;

could be pruned if 'my_struct_type' was only ever referenced via pointer
members in other structs/unions types used in the program.

The result of pruning is to skip emitting full type information for
a struct or union type by replacing it with a BTF_KIND_FWD, indicating
that it exists but its definition is omitted.  Any types used only by
pruned types are fully omitted from the generated BTF.

In cases like this where the struct/union type is anonymous, the result
is an anonymous BTF_KIND_FWD, which is useless.  The presence of such a
type record rightly causes complaints from BTF loaders.  Worse, since
the TYPEDEF for 'my_struct_type' itself may _not_ be pruned, its type
information will be incomplete.

Change the BTF pruner so that we never consider pruning at a typedef,
and always either keep or discard both the type and the typedef.

gcc/

* btfout.cc (btf_add_used_type_1): Do not consider creating
fixups at typedefs.

gcc/testsuite/

* gcc.dg/debug/btf/btf-prune-4.c: New.

7 days agoRemove parentheses in dg-scan directive
Eric Botcazou [Thu, 30 Oct 2025 15:59:27 +0000 (16:59 +0100)] 
Remove parentheses in dg-scan directive

gcc/testsuite/
* gcc.dg/cpp/escape-3.i: Remove parentheses in dg-scan directive.

7 days agolto: Stream out partitioned toplevel assembly
Michal Jires [Mon, 25 Aug 2025 16:30:07 +0000 (18:30 +0200)] 
lto: Stream out partitioned toplevel assembly

Toplevel assembly is now streamed as partitioned instead of into the
first partition.

gcc/ChangeLog:

* lto-cgraph.cc (output_symtab): Remove asm_nodes_out.
* lto-streamer-out.cc (lto_output_toplevel_asms): Use
partitioning.
(create_order_remap): Remove asm_nodes_out.
(lto_output): In LGEN add asm_nodes into partition.
* lto-streamer.h (lto_output_toplevel_asms): Add encoder.

gcc/lto/ChangeLog:

* lto.cc (stream_out_partitions): Remove asm_nodes_out.

7 days agolto: Partition toplevel assembly in 1to1
Michal Jires [Mon, 25 Aug 2025 16:23:24 +0000 (18:23 +0200)] 
lto: Partition toplevel assembly in 1to1

1to1 partitioning now also partitions toplevel assembly.
Other partitionings keep the old behavior of putting all
toplevel assembly into single partition.

gcc/ChangeLog:

* lto-cgraph.cc (compute_ltrans_boundary): Add asm_node.

gcc/lto/ChangeLog:

* lto-partition.cc (create_partition_if_empty): New.
(node_into_file_partition): Break out from ...
(lto_1_to_1_map): ... here. Partition toplevel assembly.
(create_asm_partition): New.
(lto_max_map): Use create_asm_partition.
(lto_balanced_map): Likewise.

7 days agolto: Use toplevel_node in lto_symtab_encoder
Michal Jires [Mon, 25 Aug 2025 16:07:29 +0000 (18:07 +0200)] 
lto: Use toplevel_node in lto_symtab_encoder

This patch replaces symtab_node with toplevel_node in lto_symtab_encoder
and modifies all places where lto_symtab_encoder is used to handle
(ignore) asm_node.

gcc/ChangeLog:

* ipa-icf.cc (sem_item_optimizer::write_summary): Use
toplevel_node.
(sem_item_optimizer::read_section): Likewise.
* ipa-modref.cc (modref_write): Likewise.
* ipa-prop.cc (ipa_write_return_summaries): Likewise.
(ipcp_write_transformation_summaries): Likewise.
* ipa-reference.cc (ipa_reference_write_optimization_summary):
Likewise.
* lto-cgraph.cc (lto_symtab_encoder_new): Likewise.
(lto_symtab_encoder_encode): Likewise.
(lto_symtab_encoder_delete_node): Likewise.
(lto_symtab_encoder_in_partition_p): Likewise.
(lto_set_symtab_encoder_in_partition): Likewise.
(output_refs): Likewise.
(compute_ltrans_boundary): Likewise.
(output_symtab): Likewise.
(output_cgraph_opt_summary): Likewise.
* lto-streamer-out.cc (lto_output): Likewise.
(produce_symtab): Likewise.
(produce_symtab_extension): Likewise.
* lto-streamer.h (struct lto_encoder_entry): Likewise.
(struct lto_symtab_encoder_d): Likewise.
(lto_symtab_encoder_encode): Likewise.
(lto_symtab_encoder_delete_node): Likewise.
(lto_symtab_encoder_in_partition_p): Likewise.
(lto_symtab_encoder_lookup): Likewise.
(lsei_next): Likewise.
(lsei_varpool_node): Likewise.

gcc/lto/ChangeLog:

* lto-partition.cc (add_symbol_to_partition): Use toplevel_node.
(undo_partition): Likewise.
(join_partitions): Likewise.
(split_partition_into_nodes): Likewise.
(is_partition_reorder): Likewise.
(lto_balanced_map): Likewise.
(lto_promote_cross_file_statics): Likewise.
* lto.cc (lto_wpa_write_files): Likewise.

7 days agolto: Simplify control variable in loop of balanced partitioning
Michal Jires [Mon, 25 Aug 2025 15:58:03 +0000 (17:58 +0200)] 
lto: Simplify control variable in loop of balanced partitioning

Minor simplification as preparation for next patch.

gcc/lto/ChangeLog:

* lto-partition.cc (lto_balanced_map): Simplify.

7 days agocgraph: Add toplevel_node
Michal Jires [Mon, 25 Aug 2025 15:37:19 +0000 (17:37 +0200)] 
cgraph: Add toplevel_node

asm_node and symbol_node will now inherit from toplevel_node.
This is now useful for lto partitioning, in future it should be also
useful for toplevel extended assembly.

gcc/ChangeLog:

* cgraph.h (enum symtab_type): Replace with toplevel_type.
(enum toplevel_type): New.
(struct toplevel_node): New.
(struct asm_node): Inherits from toplevel_node.
(test): New.
(symbol_table::finalize_toplevel_asm): Use constructor.
* coretypes.h (struct toplevel_node): New.
(struct asm_node): New.
* lto-streamer-in.cc (lto_input_toplevel_asms): Add
lto_file_data.

7 days agolto: Keep lto file data
Michal Jires [Mon, 25 Aug 2025 15:26:47 +0000 (17:26 +0200)] 
lto: Keep lto file data

We use lto_file_data in 1to1 partitioning, so we need to not zero it
out. Nothing depends on lto_file_data being NULL.

gcc/ChangeLog:

* cgraph.cc (cgraph_node::release_body): Keep lto_file_data.
(cgraph_node::remove): likewise.
* lto-section-in.cc (lto_free_function_in_decl_state_for_node):
likewise.
* varpool.cc (varpool_node::remove): likewise.

gcc/lto/ChangeLog:

* lto-symtab.cc (lto_symtab_merge_symbols_1): likewise.

7 days agolto: Fix reversed sorting of node order.
Michal Jires [Thu, 15 May 2025 14:37:12 +0000 (16:37 +0200)] 
lto: Fix reversed sorting of node order.

Sorting by node order in lto partitioning is incorrectly reversed.
For default balanced partitioning this caused all noreorder symbols
to be partitioned into a single partition where they were sorted again,
but correctly.

gcc/lto/ChangeLog:

* lto-partition.cc (cmp_partitions_order): Reverse sort.
(node_cmp): Reverse sort.

7 days agofortran: Cleanup obsolete comment
Mikael Morin [Thu, 30 Oct 2025 11:51:03 +0000 (12:51 +0100)] 
fortran: Cleanup obsolete comment

gcc/fortran/ChangeLog:

* trans-array.cc: Cleanup obsolete comment.

7 days agoExtend the attribute "counted_by" to support VOID pointer under GNU extension.
Qing Zhao [Fri, 24 Oct 2025 18:02:06 +0000 (18:02 +0000)] 
Extend the attribute "counted_by" to support VOID pointer under GNU extension.

This extension is requested by linux kernel to ease the adoption of counted_by
attribute into linux kernel.

Please refer to
https://lore.kernel.org/lkml/20251021095447.GL3245006@noisy.programming.kicks-ass.net/
for the initial request for this feature.

The attribute is allowed for a pointer to void, However,
Warnings will be issued for such cases when -Wpointer-arith is
specified. When this attribute is applied on a pointer to void, the
size of each element of this pointer array is treated as 1.

gcc/c-family/ChangeLog:

* c-attribs.cc (handle_counted_by_attribute): Allow counted_by for
void pointer. Issue warnings when -Wpointer-arith is present.

gcc/c/ChangeLog:

* c-typeck.cc (build_access_with_size_for_counted_by): When the element
type is void, assign size one as the element_size.

gcc/ChangeLog:

* doc/extend.texi: Clarification when the counted_by attribute is applied
on a void pointer.

gcc/testsuite/ChangeLog:

* gcc.dg/pointer-counted-by.c: Update for void pointers.
* gcc.dg/pointer-counted-by-10.c: New test.
* gcc.dg/pointer-counted-by-4-void.c: New test.

7 days agoMATCH: Optimize `VEC_SHL_INSERT (dup (A), A)` to just `dup (A) [PR116075]
Andrew Pinski [Wed, 29 Oct 2025 18:58:31 +0000 (11:58 -0700)] 
MATCH: Optimize `VEC_SHL_INSERT (dup (A), A)` to just `dup (A) [PR116075]

It was noticed if we have `.VEC_SHL_INSERT ({ 0, ... }, 0)` it was not being
simplified to just `{ 0, ... }`. This was generated from the autovectorizer
(maybe even on accident, see PR tree-optmization/116081).

This adds a few SVE testcases to see if this is optimized since the
auto-vectorizer or intrinsics are the only two ways of getting this
produced.

Changes since:
* v1: Move the constant case over to fold-const-call.cc.
      Simplify match pattern to use handle vec_duplicate.

Build and tested for aarch64-linux-gnu with no regressions.

PR target/116075

gcc/ChangeLog:

* fold-const-call.cc (fold_const_vec_shl_insert): New function.
(fold_const_call): Call fold_const_vec_shl_insert for CFN_VEC_SHL_INSERT.
* match.pd (`VEC_SHL_INSERT (dup (A), A)`): New pattern.

gcc/testsuite/ChangeLog:

* gcc.target/aarch64/sve/dup-insr-1.c: New test.
* gcc.target/aarch64/sve/dup-insr-2.c: New test.

Signed-off-by: Andrew Pinski <andrew.pinski@oss.qualcomm.com>
7 days agoforwprop: Improve simple dse slightly more for eh but multiple incoming edges (phi...
Andrew Pinski [Wed, 29 Oct 2025 03:29:45 +0000 (20:29 -0700)] 
forwprop: Improve simple dse slightly more for eh but multiple incoming edges (phi) [PR122247]

In this case we have a phi node for the use so we need to see if
the result of the phi is a single usage with the clobber.

That is the following IR:
```
  # .MEM_6 = VDEF <.MEM_5(D)>
  inner = outer;
  # .MEM_7 = VDEF <.MEM_6>
  p (outer);

  <bb 3> :
...
  # .MEM_8 = VDEF <.MEM_7>
  g (_3, _2, _1);

  <bb 4> :
  # .MEM_9 = VDEF <.MEM_8>
  inner ={v} {CLOBBER(eos)};
...

  <bb 5> :
  # .MEM_4 = PHI <.MEM_7(2), .MEM_8(3)>
<L0>:
  # .MEM_10 = VDEF <.MEM_4>
  inner ={v} {CLOBBER(eos)};
```

The two two clobber can be considered the same.
So starting at `bb 4`'s. Bofore we walk back to the call of g statement
and would notice that the use in the phi node of `bb5` and that would cause
the walk to stop. But in this case since he phi node has a single use of the
clobber and the clobber matches the original clobber it can be considered the
same "one". So with the patch now, we walk back one more statement and allow it.
Similar to the at the call to p statement.

Bootstrapped and tested on x86_64-linux-gnu.

PR tree-optimization/122247

gcc/ChangeLog:

* tree-ssa-forwprop.cc (do_simple_agr_dse): Allow phi node for the usage
if the usage of the phi result is just the "same" as the original clobber.

gcc/testsuite/ChangeLog:

* g++.dg/tree-ssa/copy-prop-aggregate-sra-2.C: New test.

Signed-off-by: Andrew Pinski <andrew.pinski@oss.qualcomm.com>
7 days agoforwprop: Improve simple dse for eh [PR122247]
Andrew Pinski [Wed, 29 Oct 2025 00:20:18 +0000 (17:20 -0700)] 
forwprop: Improve simple dse for eh [PR122247]

In the case with EH, we end up with the following IR:
```
  # .MEM_5 = VDEF <.MEM_4(D)>
  inner = outer;
  # .MEM_6 = VDEF <.MEM_5>
  p (outer);

  <bb 3> :
  # .MEM_7 = VDEF <.MEM_6>
  inner ={v} {CLOBBER(eos)};
...

  <bb 4> :
<L0>:
  # .MEM_9 = VDEF <.MEM_6>
  inner ={v} {CLOBBER(eos)};
```

So when the simple DSE looks at the clobber from `bb3`, we find the use of
MEM_6 is in a non dominating BB of BB3 so it gets rejected. But since this usage
is also a clobber which isthe same as the original clobber; it can be safely assumed
to do the same thing as the first clobber. So it can be safely ignored.

Bootstrapped and tested on x86_64-linux-gnu.

PR tree-optimization/122247

gcc/ChangeLog:

* tree-ssa-forwprop.cc (do_simple_agr_dse): Allow
use to be a clobber of the same kind to the same lhs.

gcc/testsuite/ChangeLog:

* g++.dg/tree-ssa/copy-prop-aggregate-sra-1.C: New test.

Signed-off-by: Andrew Pinski <andrew.pinski@oss.qualcomm.com>
7 days agoniter: Use ranger to query ctz range.
Robin Dapp [Fri, 17 Oct 2025 09:07:17 +0000 (11:07 +0200)] 
niter: Use ranger to query ctz range.

When niter runs after the copy-header pass it sometimes fails to
simplify assumptions in a ctz loop.
As the assumption is a simple nonzero test here we can have
ranger get us the range of the shifted expression, then verify that
this range is nonzero.

This helps recognize a ctz loop in 502.gcc's compute_transp.

PR/tree-optimization 122207

gcc/ChangeLog:

* tree-ssa-loop-niter.cc (shifted_range_nonzero_p): New
function.
(number_of_iterations_cltz): Call new function.
* tree-ssa-loop.cc (pass_scev_cprop::execute): Enable ranger.

gcc/testsuite/ChangeLog:

* gcc.dg/tree-ssa/ctz-char.c: Remove -fno-tree-ch.
* gcc.dg/tree-ssa/ctz-complement-char.c: Ditto.
* gcc.dg/tree-ssa/ctz-complement-int.c: Ditto.
* gcc.dg/tree-ssa/ctz-complement-long-long.c: Ditto.
* gcc.dg/tree-ssa/ctz-complement-long.c: Ditto.
* gcc.dg/tree-ssa/ctz-int.c: Ditto.
* gcc.dg/tree-ssa/ctz-long-long.c: Ditto.
* gcc.dg/tree-ssa/ctz-long.c: Ditto.
* gcc.dg/tree-ssa/ctz-ch.c: New test.
* gcc.dg/pr41488.c: Add -fno-tree-scev-cprop.

7 days agoMAINTAINERS: Add myself to reviewers/maintainers.
Robin Dapp [Mon, 20 Oct 2025 13:24:16 +0000 (15:24 +0200)] 
MAINTAINERS: Add myself to reviewers/maintainers.

ChangeLog:

* MAINTAINERS: Add myself to reviewers/maintainers.

7 days ago[Ada] Fix formal parameter incorrectly visible from outside of instance
Eric Botcazou [Thu, 30 Oct 2025 14:41:09 +0000 (15:41 +0100)] 
[Ada] Fix formal parameter incorrectly visible from outside of instance

The problem had been partially fixed two decades ago and the original
testcase correctly rejected, but almost 4 years later the submitter
made a small tweak to it which exposed the issue again...

The original fix was a change to Find_Expanded_Name, this additional fix
is to make exactly the same change to the processing of Collect_Interps
for expanded names.

gcc/ada/
PR ada/15610
* sem_type.adb (Collect_Interps): Apply the same visibility
criterion to expanded names as Find_Expanded_Name.

gcc/testsuite/
* gnat.dg/specs/generic_inst7.ads: New test.
* gnat.dg/specs/generic_inst8.ads: New test.

7 days ago[PATCH v2] RISC-V: avlprop: Scale AVL by subreg ratio [PR122445].
Robin Dapp [Thu, 30 Oct 2025 13:48:07 +0000 (07:48 -0600)] 
[PATCH v2] RISC-V: avlprop: Scale AVL by subreg ratio [PR122445].

Hi,

Since r16-4391-g85ab3a22ed11c9 we can use a punned type/mode for grouped
loads and stores.  Vineet reported an x264 wrong-code bug since that
commit.  The crux of the issue is that in avlprop we back-propagate
the AVL from consumers (like stores) to producers.
When e.g. a V4QI vector is type-punned by a V1SI vector
  (subreg:V1SI (reg:V4QI ...)
the AVL of that instruction refers to the outer subreg mode, i.e. for an
AVL of 1 in a store we store one SImode element.  The producer of the
store data is not type punned and still uses V4QI and we produce 4
QImode elements.  Due to this mismatch we back-propagate the consumer
AVL of 1 to the producers, causing wrong code.

This patch looks if the use is inside a subreg and scales the immediate
AVL by the ratio of inner and outer mode.

Changes from v1:
 - Move NULL check into loop.
 - Add REG_P check.

Regtested on rv64gcv_zvl512b.

Regards
 Robin

PR target/122445

gcc/ChangeLog:

* config/riscv/riscv-avlprop.cc (pass_avlprop::get_vlmax_ta_preferred_avl):
Scale AVL of subreg uses.

gcc/testsuite/ChangeLog:

* gcc.target/riscv/rvv/autovec/pr122445.c: New test.

7 days ago[PATCH][PR tree-optimization/122478] match.pd: fix simplify pattern for view_convert...
Artemiy Volkov [Thu, 30 Oct 2025 13:42:03 +0000 (07:42 -0600)] 
[PATCH][PR tree-optimization/122478] match.pd: fix simplify pattern for view_convert (BIT_FIELD_REF)

The pattern introduced in r16-4682-g5eafa8d16be873 couldn't handle
conversion from <unnamed-unsigned:1> to unsigned char, which ended up
causing a gimple checking failure reported in PR122478.  This patch fixes
the pattern by prohibiting widening integral conversions in addition to
the narrowing ones, or equivalently, requiring that the converted-to and
converted-from types of the VCE both have precision equal to their size.
Since type_has_mode_precision_p () does not apply to vector types, filter
them out by adding a !INTEGRAL_TYPE_P () check on TREE_TYPE (@0).

Bootstrapped and regtested on aarch64 and x86_64, regtested on i386 and
riscv64, one GIMPLE test added.

PR tree-optimization/122478

gcc/ChangeLog:

* match.pd: Fix the view_convert (BIT_FIELD_REF) pattern.

gcc/testsuite/ChangeLog:

* gcc.dg/tree-ssa/pr122478.c: New test.

7 days agoAdjust gcc.dg/tree-ssa/pr92834.c
Richard Biener [Thu, 30 Oct 2025 13:24:46 +0000 (14:24 +0100)] 
Adjust gcc.dg/tree-ssa/pr92834.c

Scanning the optimized dump is fragile due to vectorization.  The
following instead scans after early phiopt1, adjusting for not
yet eliminated static functions.

* gcc.dg/tree-ssa/pr92834.c: Scan phiopt1 instead of optimized.

7 days ago[i386] Fix type in ix86_move_max setup
Richard Biener [Thu, 30 Oct 2025 12:30:21 +0000 (13:30 +0100)] 
[i386] Fix type in ix86_move_max setup

There's a typo in the way we compute opts->x_ix86_move_max:

  if (opts_set->x_ix86_move_max == PVW_NONE)
    {
      /* Set the maximum number of bits can be moved from memory to
         memory efficiently.  */
      if (opts_set->x_prefer_vector_width_type != PVW_NONE)
        opts->x_ix86_move_max = opts->x_prefer_vector_width_type;
      else if (ix86_tune_features[X86_TUNE_AVX512_MOVE_BY_PIECES])
        opts->x_ix86_move_max = PVW_AVX512;
      else if (ix86_tune_features[X86_TUNE_AVX256_MOVE_BY_PIECES])
        opts->x_ix86_move_max = PVW_AVX256;
      else
        {
          opts->x_ix86_move_max = opts->x_prefer_vector_width_type;
 /* */    if (opts_set->x_ix86_move_max == PVW_NONE)
            {
              if (TARGET_AVX512F_P (opts->x_ix86_isa_flags))
                opts->x_ix86_move_max = PVW_AVX512;
              /* Align with vectorizer to avoid potential STLF issue.  */
              else if (TARGET_AVX_P (opts->x_ix86_isa_flags))
                opts->x_ix86_move_max = PVW_AVX256;
              else
                opts->x_ix86_move_max = PVW_AVX128;
            }
        }
    }

as written the /* */ condition is redundant with the outermost one.
But intended is (IMO) that the earlier set opts->x_prefer_vector_width_type
via X86_TUNE_{AVX128,AVX256}_OPTIMAL takes precedence over the ISA
based setup that follows.  So instead of checking opts_set we want
to check whether the previous assignment left us with still PVW_NONE.
The issue makes us ignore X86_TUNE_AVX128_OPTIMAL/X86_TUNE_AVX256_OPTIMAL
when determining opts->x_ix86_move_max.

* config/i386/i386-options.cc (ix86_option_override_internal):
Fix check during opts->x_ix86_move_max initialization.

7 days agolra: Fix computing reg class for hard register constraints [PR121198]
Stefan Schulze Frielinghaus [Thu, 30 Oct 2025 12:50:46 +0000 (13:50 +0100)] 
lra: Fix computing reg class for hard register constraints [PR121198]

Currently the register class derived from a hard register constraint is
solely determined from a single register.  This even works for register
pairs if all the required registers are contained in this very register
class and falls apart if not.  For example:

long
test (void)
{
  long x;
  __asm__ ("..." : "={r22}" (x));
  return x;
}

For AVR -mmcu=atmega8, variable `x` requires a register quadruple and
the minimal class for single register r22 is SIMPLE_LD_REGS which itself
entails registers r16 up to r23.  However, variable `x` is bound to
registers r22 up to r25.  Thus, the minimal class containing those is
LD_REGS.  Therefore, compute the least upper bound of all register
classes over all required registers.

PR rtl-optimization/121198

gcc/ChangeLog:

* lra-constraints.cc (process_alt_operands): Compute least upper
bound of all register classes over all required registers in
order to determine register class for a hard register constraint.

gcc/testsuite/ChangeLog:

* gcc.target/avr/pr121198.c: New test.

7 days agoPR modula2/122485: add spell checking to module names
Gaius Mulley [Thu, 30 Oct 2025 11:19:08 +0000 (11:19 +0000)] 
PR modula2/122485: add spell checking to module names

This patch introduces spell checking during module imports.
If the correct module name has been seen prior to the incorrect import
then it will attempt to provide a hint during the error message.

gcc/m2/ChangeLog:

PR modula2/122485
* gm2-compiler/M2Comp.mod (Pass0CheckDef): Add spell check
format specifier filtering on module names.
* gm2-compiler/M2MetaError.mod (errorBlock): New field
filterDef.
(initErrorBlock): Initialize filterDef.
(continuation): Add 'D' filter on definition module specifier.
(SpellHint): Rewrite to check for filterDef and defimp symbols.
(FilterOnDefinitionModule): New procedure.
* gm2-compiler/M2Quads.mod (BuildSizeFunction): Rewrite to
ensure variables are initialized.
* gm2-compiler/M2StackSpell.def (GetDefModuleSpellHint): New
procedure function.
* gm2-compiler/M2StackSpell.mod (GetDefModuleSpellHint): New
procedure function.
(CandidatePushName): New procedure.
(BuildHintStr): New procedure.
(CheckForHintStr): Rewrite.

gcc/testsuite/ChangeLog:

PR modula2/122485
* gm2.dg/spell/iso/fail/badimport.mod: New test.

Signed-off-by: Gaius Mulley <gaiusmod2@gmail.com>
7 days agoSwap operands during SLP discovery for mismatching STMT_VINFO_REDUC_IDX
Richard Biener [Thu, 30 Oct 2025 09:38:13 +0000 (10:38 +0100)] 
Swap operands during SLP discovery for mismatching STMT_VINFO_REDUC_IDX

When we are unlucky operand canonicalization can end up presenting
us with different order, making a possible SLP reduction group
not match up.  The following allows swapping operands in this case.

* tree-vect-slp.cc (vect_get_operand_map): Handle commutative
operands when swapping is requested.
(vect_build_slp_tree_1): Allow STMT_VINFO_REDUC_IDX differences
when operand swapping makes them match and request swapping.
(vect_build_slp_instance): Indicate we have successfully
discovered a SLP reduction group.

* gcc.dg/vect/slp-reduc-13.c: New testcase.

Co-authored-by: Eric Botcazou <ebotcazou@adacore.com>
7 days ago386: Make better use of overflow flags in codegen of min/max(a,add/sub(a, b)) [PR116815]
Uros Bizjak [Thu, 30 Oct 2025 07:59:32 +0000 (08:59 +0100)] 
386: Make better use of overflow flags in codegen of min/max(a,add/sub(a, b)) [PR116815]

Fold the following patterns:
- umax (a, add (a, b)) -> [sum,  ovf] = add (a, b); ovf ? a : sum
- umin (a, add (a, b)) -> [sum,  ovf] = add (a, b); ovf ? sum : a
- umax (a, sub (a, b)) -> [diff, udf] = sub (a, b); udf ? diff : a
- umin (a, sub (a, b)) -> [diff, udf] = sub (a, b); udf ? a : diff

Where ovf/udf is the carry flag that represents overflow in case of
add and underflow in case of sub.

Co-developed-by: Dhruv Chawla <dhruvc@nvidia.com>
PR target/116815

gcc/ChangeLog:

* config/i386/i386.md (ovf_add_cmp): New code attribute.
(udf_sub_cmp): Ditto.
(ovf_comm): New int iterator.
(*plus_within_<code><mode>3_<ovf_comm>): New insn and split pattern.
(*minus_within_<code><mode>3): Ditto.

gcc/testsuite/ChangeLog:

* gcc.dg/pr116815.c: New test.
* gcc.target/i386/pr116815.c: New test.

7 days agogimple-fold: Remove assume_aligned folding
Andrew Pinski [Wed, 29 Oct 2025 23:30:50 +0000 (16:30 -0700)] 
gimple-fold: Remove assume_aligned folding

So in the end I agree with Richi's comment at
https://gcc.gnu.org/pipermail/gcc-patches/2025-October/698856.html:
> I see.  I wonder whether it would be better to leave __builtin_assume_aligned
> around then, because that inherently introduces the copy and it would show why.
> TER / SSA coalescing might make a mess our of the copies you leave in place
> anyway, no?

This leaves __builtin_assume_aligned around.
Will also push the revert of r16-4637-g8590b32deac05e along side this.

gcc/ChangeLog:

* gimple-fold.cc (gimple_fold_builtin_assume_aligned): Remove.
(gimple_fold_builtin): Don't fold __builtin_assume_aligned

gcc/testsuite/ChangeLog:

* c-c++-common/ubsan/align-5.c: Xfail.
* gcc.dg/pr107389.c: Move to...
* gcc.dg/torture/pr107389.c: ...here. Skip for lto.
* gcc.dg/builtin-assume-aligned-1.c: Instead of
testing for deleting of assume-align, test for
the alignment/misalignment. Also disable the
vectorizer.

Signed-off-by: Andrew Pinski <andrew.pinski@oss.qualcomm.com>
7 days agoRevert "forwprop: Fix copy prop for alignment after the final folding [PR122086]"
Andrew Pinski [Thu, 30 Oct 2025 00:16:14 +0000 (17:16 -0700)] 
Revert "forwprop: Fix copy prop for alignment after the final folding [PR122086]"

This reverts commit 8590b32deac05e6eb368b72bd353749134120a1f.

7 days agotree-optimization/120687 - legitimise some permutes before optimizing
Richard Biener [Fri, 24 Oct 2025 10:31:54 +0000 (12:31 +0200)] 
tree-optimization/120687 - legitimise some permutes before optimizing

The following does a simple legitimising attempt on the SLP graph
permutations before trying to optimize them.  For the case we have
a single non-zero layout we can force that to all partitions if
it is compatible.  This way we end up with the most canonical
(and possibly no-op) load permutations and permutes.

I have refrained from trying to use internal_node_cost to actually
check if the result is legitimate (it would need at least the
change to anticipate redundant load permute eliding).  This relies
on start_choosing_layouts chosing layout zero for everything we
cannot handle (like non-bijective permutes).

What's still missing is to try to process disconnected parts of the
SLP graph separately.  We should possibly try to handle those
separately through all of the SLP optimize process for simplicity.

This also includes a fix for a dumping ICE when we permute the
root node of a reduction chain that was associated.

PR tree-optimization/120687
* tree-vect-slp.cc (vect_optimize_slp_pass::is_compatible_layout):
New overload for checking a whole partition.
(vect_optimize_slp_pass::legitimize): New function trying
a single layout for all partitions for now.
(vect_optimize_slp_pass::run): Try legitimizing to a single
layout before propagating.
(vect_slp_analyze_operations): For dumping deal with
SLP_TREE_SCALAR_STMTS being empty or element zero being NULL.

7 days agolibstd++: Implement C++23 P2674R1 - A trait for implicit lifetime types
Jakub Jelinek [Thu, 30 Oct 2025 07:43:18 +0000 (08:43 +0100)] 
libstd++: Implement C++23 P2674R1 - A trait for implicit lifetime types

The following patch attempts to implement the library side of the
C++23 P2674R1 paper.  As mentioned in the paper, since CWG2605
the trait isn't really implementable purely on the library side.

The compiler side has been committed earlier, so this just uses
the new builtin trait on the library side.

2025-10-30  Jakub Jelinek  <jakub@redhat.com>

* include/bits/version.def (is_implicit_lifetime): New.
* include/bits/version.h: Regenerate.
* include/std/type_traits (std::is_implicit_lifetime,
std::is_implicit_lifetime_v): New trait.
* src/c++23/std.cc.in (std::is_implicit_lifetime,
std::is_implicit_lifetime_v): Export.
* testsuite/20_util/is_implicit_lifetime/version.cc: New test.
* testsuite/20_util/is_implicit_lifetime/value.cc: New test.

7 days agoFix unrecognizable insn of vpdpwuud.
liuhongt [Wed, 29 Oct 2025 06:32:06 +0000 (23:32 -0700)] 
Fix unrecognizable insn of vpdpwuud.

Tighten the dot_prod expander.

gcc/ChangeLog:

PR target/122457
* config/i386/sse.md (VI2_AVX10_2): New mode iterator.
(usdot_prod<sseunpackmodelower><mode>): Use VI2_AVX10_2
instead of VI2_AVX512F.
(udot_prod<sseunpackmodelower><mode>): Ditto.

gcc/testsuite/ChangeLog:

* gcc.target/i386/pr122457.c: New test.

7 days agoLoongArch: Standard instruction template fnmam4 correction
Guo Jie [Wed, 29 Oct 2025 08:38:54 +0000 (16:38 +0800)] 
LoongArch: Standard instruction template fnmam4 correction

The current implementation of the fnmam4 instruction template requires
the third source operand to be assigned the same hard register as the
target operand, but the constraint is not documented in the instruction
manual or standard template definitions. The current constraint will
generate additional data dependencies and extra instructions.

gcc/ChangeLog:

* config/loongarch/lasx.md (fnma<mode>4): Remove.
* config/loongarch/lsx.md (fnma<mode>4): Remove.
* config/loongarch/simd.md (fnma<mode>4): Simplify and correct.

gcc/testsuite/ChangeLog:

* gcc.target/loongarch/fnmam4-vec.c: New test.

7 days agoLoongArch: Only allow valid binary op when optimize conditional move
Jinyang He [Wed, 29 Oct 2025 08:07:35 +0000 (16:07 +0800)] 
LoongArch: Only allow valid binary op when optimize conditional move

It is wrong that optimize from `if (cond) dest op= 1 << shift` to
`dest op= (cond ? 1 : 0) << shift` when `dest op 0 != dest`.
Like `and`, `mul` or `div`.
And in this optimization `mul` and `div` is optimized to shift.

gcc/ChangeLog:

* config/loongarch/loongarch.cc
(loongarch_expand_conditional_move): Only allow valid binary
op when optimize conditional move.

gcc/testsuite/ChangeLog:

* gcc.target/loongarch/conditional-move-opt-1.c: Remove mul.
* gcc.target/loongarch/conditional-move-opt-2.c: Remove and.
* gcc.target/loongarch/conditional-move-opt-3.c: New test.

Co-Authored-By: Peng Fan <fanpeng@loongson.cn>
7 days agoAda: Fix spurious visibility issue with qualified aggregate in instantiation
Eric Botcazou [Wed, 29 Oct 2025 23:33:36 +0000 (00:33 +0100)] 
Ada: Fix spurious visibility issue with qualified aggregate in instantiation

Aggregates used as actuals of formal object parameters are handled specially
by Instantiate_Object in Sem_Ch12 and qualifying them is sufficient to block
this special processing.

gcc/ada/
PR ada/54178
* sem_ch12.adb (Instantiate_Object): Strip qualification to detect
aggregates used as actuals.

gcc/testsuite/
* gnat.dg/aggr32.adb: New test.
* gnat.dg/aggr32_pkg.ads: New helper.
* gnat.dg/aggr32_pkg-child.ads: Likewise.