Skip to content

Conversation

dkm
Copy link
Owner

@dkm dkm commented Jul 30, 2025

Hey there! I'm gerris 🦀

CohenArthur and others added 30 commits July 30, 2025 12:40
gcc/rust/ChangeLog:

	* resolve/rust-late-name-resolver-2.0.cc (Late::Late): False initialize the
	funny_error field.
gcc/rust/ChangeLog:

	* backend/rust-compile-pattern.h: Split struct pattern compilation into three functions.
	* backend/rust-compile-pattern.cc: Implement them.
Allow matching on a struct instance and rebinding its fields to new names:

match X {
	Foo {
		field0: new_name0,
		field1: new_name1,
	} => {
		do_something(new_name0, new_name1);
	},
}

This will enable us to finish derives for PartialEq and PartialOrd but
isn't a complete implementation of these patterns yet.

gcc/rust/ChangeLog:

	* backend/rust-compile-pattern.cc (CompilePatternBindings::make_struct_access):
	New function.
	(CompilePatternBindings::visit): Properly implement patterns mentioned above
	and call make_struct_accesss.
	* backend/rust-compile-pattern.h: New declaration.

gcc/testsuite/ChangeLog:

	* rust/execute/torture/struct_pattern1.rs: New test.
gcc/rust/ChangeLog:

	* ast/rust-ast-builder.cc (Builder::struct_pattern_ident_pattern): New.
	* ast/rust-ast-builder.h: New declaration.
gcc/rust/ChangeLog:

	* expand/rust-derive-partial-eq.cc (DerivePartialEq::match_enum_tuple): Remove debug call.
	(DerivePartialEq::match_enum_struct): Add proper implementation.
	(DerivePartialEq::visit_enum): Call it.

gcc/testsuite/ChangeLog:

	* rust/execute/torture/derive-partialeq2.rs: New test.
gcc/testsuite/ChangeLog:

	* rust/execute/torture/derive-partialeq2.rs: Add missing terminating nul char.

Co-authored-by: Pierre-Emmanuel Patry <[email protected]>
Rust only allows impl traits to be used in the return position of
functions.

Fixes Rust-GCC#1485

gcc/rust/ChangeLog:

	* hir/rust-ast-lower-implitem.cc (ASTLowerImplItem::visit): allow impl type
	* hir/rust-ast-lower-item.cc (ASTLoweringItem::visit): likewise
	* hir/rust-ast-lower-type.cc (ASTLoweringType::ASTLoweringType): new flag for impl trait
	(ASTLoweringType::translate): pass flag
	(ASTLoweringType::visit): track impl trait tag
	(ASTLoweringType::emit_impl_trait_error): new diagnostic
	* hir/rust-ast-lower-type.h: add new field

gcc/testsuite/ChangeLog:

	* rust/compile/impl_trait_diag.rs: New test.
	* rust/compile/issue-1485.rs: New test.

Signed-off-by: Philip Herron <[email protected]>
Argument position impl traits are simply syntatic sugar for generics. This
adds a new desugar pass to do this. So for example:

    fn foo(a: impl Value, b: impl Value) -> i32

Is desugared into:

    fn foo<T: Value, U: Value> (a: T, b: U) -> i32

So it just works like any normal generic function. There are more complex cases such as:

    fn foo(_value: impl Bar<Baz = impl Foo>) -> i32

Which has a generic argument binding which needs to be turned into a where constraint:

    fn foo<T, U>(_value: T) -> i32
        where
            T: Bar<Baz = U>,
            U: Foo,

Fixes Rust-GCC#2015
Fixes Rust-GCC#1487
Fixes Rust-GCC#3454
Fixes Rust-GCC#1482

gcc/rust/ChangeLog:

	* Make-lang.in: new desugar file
	* ast/rust-ast.cc (ImplTraitTypeOneBound::as_string): its a unique_ptr now
	(FormatArgs::set_outer_attrs): reformat
	* ast/rust-path.h: remove has_generic_args assertion (can be empty because of desugar)
	* ast/rust-type.h (class ImplTraitTypeOneBound): add copy ctor and use unique_ptr
	* hir/rust-ast-lower-type.cc (ASTLoweringType::visit): update to use unique_ptr
	* parse/rust-parse-impl.h (Parser::parse_type): reuse the existing unique_ptr instead
	(Parser::parse_type_no_bounds): likewise
	(Parser::parse_pattern): likewise
	* resolve/rust-ast-resolve-type.cc (ResolveType::visit): its a unique_ptr now
	* rust-session-manager.cc (Session::compile_crate): call desugar
	* ast/rust-desugar-apit.cc: New file.
	* ast/rust-desugar-apit.h: New file.

gcc/testsuite/ChangeLog:

	* rust/compile/issue-2015.rs: fully supported now
	* rust/compile/nr2/exclude: nr2 cant handle some of these
	* rust/compile/issue-1487.rs: New test.
	* rust/compile/issue-3454.rs: New test.
	* rust/execute/torture/impl_desugar-2.rs: New test.
	* rust/execute/torture/impl_desugar.rs: New test.
	* rust/execute/torture/impl_trait1.rs: New test.
	* rust/execute/torture/impl_trait2.rs: New test.
	* rust/execute/torture/impl_trait3.rs: New test.
	* rust/execute/torture/impl_trait4.rs: New test.
	* rust/execute/torture/issue-1482.rs: New test.

Signed-off-by: Philip Herron <[email protected]>
gcc/rust/ChangeLog:

	* resolve/rust-ast-resolve-item.cc
	(ResolveItem::visit): Use the return values of
	CanonicalPath::inherent_impl_seg and
	CanonicalPath::trait_impl_projection_seg more directly.
	* util/rust-canonical-path.h
	(CanonicalPath::trait_impl_projection_seg): Append "<impl "
	instead of "<" to the beginning of the returned path segment.
	(CanonicalPath::inherent_impl_seg): Likewise.

Signed-off-by: Owen Avery <[email protected]>
gcc/rust/ChangeLog:

	* backend/rust-compile-pattern.cc
	(CompilePatternCheckExpr::visit): Fix GENERIC generation in
	light of enum layout changes since this code was written.
	(CompilePatternBindings::handle_struct_pattern_ident_pat):
	Delegate handling of child patterns to another
	CompilePatternBindings::Compile call.
	(CompilePatternBindings::make_struct_access): Make field name
	parameter const qualified.
	* backend/rust-compile-pattern.h
	(CompilePatternBindings::make_struct_access): Likewise.

gcc/testsuite/ChangeLog:

	* rust/execute/torture/struct-pattern-match.rs: New test.

Signed-off-by: Owen Avery <[email protected]>
gcc/rust/ChangeLog:

	* ast/rust-ast-visitor.cc
	(DefaultASTVisitor::visit): Make call to EnumItem visitor from
	EnumItem derived class visitors non-virtual.
	* ast/rust-collect-lang-items.cc
	(CollectLangItems::visit): Handle visitation of classes derived
	from EnumItem.
	* ast/rust-collect-lang-items.h
	(CollectLangItems::visit): Likewise.
	* resolve/rust-toplevel-name-resolver-2.0.cc
	(TopLevel::visit): Call DefaultResolver::visit on EnumItem
	instances.

Signed-off-by: Owen Avery <[email protected]>
…osition

When using impl traits in argument position (APIT), they are desugared into generics,
and supplying explicit generic arguments is not allowed. This commit adds the error
diagnostic E0632 for attempting to pass generic arguments to impl traits, completing
the implementation of the APIT feature.

gcc/rust/ChangeLog:

	* ast/rust-desugar-apit.cc: track if this is a impl-trait generic
	* ast/rust-item.h (class TypeParam): add field to track if from impl trait
	* hir/rust-ast-lower-type.cc (ASTLowerGenericParam::visit): likewise
	* hir/tree/rust-hir-item.cc (TypeParam::TypeParam): upate hir as well
	(TypeParam::operator=): likewise
	* hir/tree/rust-hir-item.h (class TypeParam): likewise
	* typecheck/rust-tyty-subst.cc (SubstitutionParamMapping::get_generic_param): add error
	* typecheck/rust-tyty-subst.h: add const getter for the associated TypeParm

gcc/testsuite/ChangeLog:

	* rust/compile/nr2/exclude: nr2 cant handle this
	* rust/compile/impl_trait_generic_arg.rs: New test.

Signed-off-by: Philip Herron <[email protected]>
Empty loops have no body which means this is a NULL_TREE during const
evaluation which needs a check. Fixes Rust-GCC Rust-GCC#3618.

gcc/rust/ChangeLog:

	* backend/rust-constexpr.cc (eval_constant_expression):  Check if t is a NULL_TREE

gcc/testsuite/ChangeLog:

	* rust/compile/issue-3618.rs: Test empty loops error properly.

Signed-off-by: Tom Schollenberger <[email protected]>
gcc/rust/ChangeLog:

	* ast/rust-ast-collector.cc (TokenCollector::visit): Implement for InlineAsm.
	* ast/rust-ast-full-decls.h (enum class): Move InlineAsmOption enum inside InlineAsm.
	* ast/rust-expr.h (enum class): Likewise.
	(class InlineAsm): Likewise.
	* expand/rust-macro-builtins-asm.cc (check_and_set): Likewise.
	(parse_options): Likewise.
	* expand/rust-macro-builtins-asm.h (check_and_set): Likewise.
	* hir/tree/rust-hir-expr.cc (InlineAsm::InlineAsm): Likewise.
	* hir/tree/rust-hir-expr.h: Likewise.
	* typecheck/rust-hir-type-check-expr.cc (TypeCheckExpr::visit): Likewise.
gcc/rust/ChangeLog:

	* ast/rust-path.cc
	(TypePath::make_debug_string): Add definition.
	* ast/rust-path.h
	(TypePath::make_debug_string): Add declaration.
	* resolve/rust-default-resolver.cc
	(DefaultResolver::visit): Adjust InherentImpl and TraitImpl
	visitors to better handle associated item scope.
	* resolve/rust-default-resolver.h
	(DefaultResolver::maybe_insert_big_self): Add.
	* resolve/rust-late-name-resolver-2.0.cc
	(Late::visit): Adjust type path resolution errors.
	* resolve/rust-rib.h
	(Rib::Kind): Add Generics kind.
	* resolve/rust-toplevel-name-resolver-2.0.cc
	(TopLevel::visit): Remove InherentImpl and TraitImpl visitor
	overrides.
	(TopLevel::maybe_insert_big_self): Add override in order to add
	a definition of 'Self'.
	* resolve/rust-toplevel-name-resolver-2.0.h
	(TopLevel::visit): Remove InherentImpl and TraitImpl visitor
	overrides.
	(TopLevel::maybe_insert_big_self): Add override.

gcc/testsuite/ChangeLog:

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

Signed-off-by: Owen Avery <[email protected]>
Since r14-6076, the LANG_HOOKS_COMMON_ATTRIBUTE_TABLE should not be used and
LANG_HOOKS_ATTRIBUTE_TABLE replaces it.

Add the "cold" attribute to fix PR120018 (and the matching "hot" attribute).

Replace some gcc_assert() by explicit warnings (same as D frontend).

Add some clang-format off/on comment around code that's not correctly
formatted.

gcc/rust/ChangeLog:
	PR rust/120018

	* rust-attribs.cc (handle_noreturn_attribute): Reindent declaration.
	(handle_leaf_attribute): Likewise.
	(handle_const_attribute): Likewise.
	(handle_malloc_attribute): Likewise.
	(handle_pure_attribute): Likewise.
	(handle_novops_attribute): Likewise.
	(handle_nonnull_attribute): Likewise.
	(handle_nothrow_attribute): Likewise.
	(handle_type_generic_attribute): Likewise.
	(handle_transaction_pure_attribute): Likewise.
	(handle_returns_twice_attribute): Likewise.
	(handle_fnspec_attribute): Likewise.
	(handle_omp_declare_simd_attribute): Likewise.
	(handle_cold_attribute): New.
	(handle_hot_attribute): New.
	(attribute_spec::exclusions attr_cold_hot_exclusions): New.
	(grs_langhook_common_attributes): Make it static.
	(grs_langhook_common_attribute_table): New.
	(grs_langhook_gnu_attributes): New.
	(grs_langhook_gnu_attribute_table): New.
	(handle_malloc_attribute): Make it static.
	(handle_fnspec_attribute): Likewise.
	(handle_pure_attribute): Replace gcc_assert by explicit warning.
	(handle_novops_attribute): Likewise.
	(handle_nothrow_attribute): Likewise.
	(handle_returns_twice_attribute): Likewise.
	(handle_omp_declare_simd_attribute): Likewise and make it static.
	* rust-lang.cc (grs_langhook_gnu_attribute_table): New.
	(grs_langhook_common_attribute_table): Adjust type to new hook.
	(LANG_HOOKS_COMMON_ATTRIBUTE_TABLE): Remove.
	(LANG_HOOKS_ATTRIBUTE_TABLE): New.

Signed-off-by: Marc Poulhiès <[email protected]>
This patch ensuers we reuse the Builder for new type to
ensure we create a new type from scratch ensuring consistent
new node-ids.

gcc/rust/ChangeLog:

	* expand/rust-derive-default.cc (DeriveDefault::visit_struct): use builder
	(DeriveDefault::visit_tuple): likewise
	* expand/rust-derive-eq.cc (DeriveEq::visit_tuple): likewise
	(DeriveEq::visit_struct): likewise
	(DeriveEq::visit_enum): likewise
	(DeriveEq::visit_union): likewise

gcc/testsuite/ChangeLog:

	* rust/compile/nr2/exclude: these are fixed now

Signed-off-by: Philip Herron <[email protected]>
gcc/rust/ChangeLog:

	* checks/errors/borrowck/rust-bir-builder-internal.h: Include
	"rust-immutable-name-resolution-context.h" and "options.h".
	(AbstractBuilder::resolve_label): Use the 2.0 name resolver when
	it's enabled.
	(AbstractBuilder::resolve_variable): Likewise.
	(AbstractBuilder::resolve_variable_or_fn): Likewise.

Signed-off-by: Owen Avery <[email protected]>
gcc/rust/ChangeLog:

	* hir/rust-ast-lower-item.cc
	(ASTLoweringItem::visit): Keep going after a duplicate field is
	found.

gcc/testsuite/ChangeLog:

	* rust/execute/same_field_name.rs: Move to...
	* rust/compile/same_field_name.rs: ...here and adjust expected
	errors.

Signed-off-by: Owen Avery <[email protected]>
gcc/rust/ChangeLog:

	* parse/rust-parse-impl.h
	(Parser::parse_attr_input): Handle more delimeter tokens and the
	END_OF_FILE token.
	(Parser::skip_after_end_attribute): Handle the END_OF_FILE
	token.

gcc/testsuite/ChangeLog:

	* rust/compile/macros/mbe/meta-param.rs: New test.

Signed-off-by: Owen Avery <[email protected]>
gcc/rust/ChangeLog:

	* Make-lang.in (GRS_OBJS): Remove rust-macro.o.
	* ast/rust-macro.cc: Removed.

Signed-off-by: Marc Poulhiès <[email protected]>
It changes declaration and switch case indentation to follow GNU coding
style.

gcc/rust/ChangeLog:

	* ast/rust-ast-builder-type.cc (ASTTypeBuilder::visit): Reindent.
	* ast/rust-ast-builder.cc (Builder::new_generic_args): Likewise.
	* ast/rust-ast-collector.cc (TokenCollector::visit): Likewise.
	* ast/rust-ast-dump.h (debug): Likewise.
	* ast/rust-ast-formatting.h (indent_spaces): Likewise.
	(get_string_in_delims): Likewise.
	(get_mode_dump_desc): Likewise.
	(append_attributes): Likewise.
	(unquote_string): Likewise.
	* ast/rust-ast-visitor.cc (DefaultASTVisitor::visit): Likewise.
	* ast/rust-ast.cc (Attribute::get_traits_to_derive): Likewise.
	(UseTreeGlob::as_string): Likewise.
	(UseTreeList::as_string): Likewise.
	(AttributeParser::parse_path_meta_item): Likewise.
	(FormatArgs::set_outer_attrs): Likewise.
	* ast/rust-ast.h (operator<<): Likewise.
	* ast/rust-cond-compilation.h: Likewise.
	* ast/rust-desugar-apit.cc: Likewise.
	* ast/rust-fmt.h (collect_pieces): Likewise.
	(clone_pieces): Likewise.
	* ast/rust-pattern.h (tokenid_to_rangekind): Likewise.
	* backend/rust-compile-context.cc (Context::type_hasher): Likewise.
	* backend/rust-compile-expr.cc (CompileExpr::visit): Likewise.
	* backend/rust-compile-intrinsic.cc (get_identifier): Likewise.
	(offset_handler): Likewise.
	(sizeof_handler): Likewise.
	(transmute_handler): Likewise.
	(rotate_handler): Likewise.
	(wrapping_op_handler_inner): Likewise.
	(op_with_overflow_inner): Likewise.
	(uninit_handler): Likewise.
	(move_val_init_handler): Likewise.
	(assume_handler): Likewise.
	(discriminant_value_handler): Likewise.
	(variant_count_handler): Likewise.
	(prefetch_data_handler): Likewise.
	(atomic_store_handler_inner): Likewise.
	(atomic_load_handler_inner): Likewise.
	(unchecked_op_inner): Likewise.
	(copy_handler_inner): Likewise.
	(expect_handler_inner): Likewise.
	(try_handler_inner): Likewise.
	* backend/rust-compile-pattern.cc (compile_range_pattern_bound): Likewise.
	(CompilePatternCheckExpr::visit): Likewise.
	(CompilePatternBindings::visit): Likewise.
	(CompilePatternLet::visit): Likewise.
	* backend/rust-compile-var-decl.h: Likewise.
	* backend/rust-constexpr.cc (verify_constant): Likewise.
	(find_array_ctor_elt): Likewise.
	(array_index_cmp): Likewise.
	(potential_constant_expression_1): Likewise.
	(unshare_constructor): Likewise.
	(maybe_save_constexpr_fundef): Likewise.
	(returns): Likewise.
	(breaks): Likewise.
	(continues): Likewise.
	(switches): Likewise.
	(constant_value_1): Likewise.
	(decl_constant_value): Likewise.
	(non_const_var_error): Likewise.
	(eval_constant_expression): Likewise.
	(constexpr_fn_retval): Likewise.
	(eval_store_expression): Likewise.
	(eval_call_expression): Likewise.
	(eval_binary_expression): Likewise.
	(get_function_named_in_call): Likewise.
	(eval_statement_list): Likewise.
	(extract_string_elt): Likewise.
	(eval_conditional_expression): Likewise.
	(eval_bit_field_ref): Likewise.
	(eval_loop_expr): Likewise.
	(eval_switch_expr): Likewise.
	(eval_unary_expression): Likewise.
	(get_or_insert_ctor_field): Likewise.
	(eval_and_check_array_index): Likewise.
	* backend/rust-constexpr.h (maybe_save_constexpr_fundef): Likewise.
	* backend/rust-mangle-v0.cc (v0_path): Likewise.
	(v0_complex_type_prefix): Likewise.
	* backend/rust-mangle.h (legacy_mangle_item): Likewise.
	(v0_mangle_item): Likewise.
	* backend/rust-tree.cc (convert_to_void): Likewise.
	(find_parameter_packs_r): Likewise.
	(rs_tree_equal): Likewise.
	(publicly_uniquely_derived_p): Likewise.
	(instantiation_dependent_expression_p): Likewise.
	(type_has_nontrivial_copy_init): Likewise.
	(is_normal_capture_proxy): Likewise.
	(is_bitfield_expr_with_lowered_type): Likewise.
	(undeduced_auto_decl): Likewise.
	(require_deduced_type): Likewise.
	(gt_pch_nx): Likewise.
	(lvalue_kind): Likewise.
	* backend/rust-tree.h (LANG_DECL_MIN_CHECK): Likewise.
	(LANG_DECL_FN_CHECK): Likewise.
	(LANG_DECL_NS_CHECK): Likewise.
	(LANG_DECL_PARM_CHECK): Likewise.
	(LANG_DECL_DECOMP_CHECK): Likewise.
	(resort_type_member_vec): Likewise.
	(convert_to_void): Likewise.
	(mark_discarded_use): Likewise.
	(mark_exp_read): Likewise.
	(mark_use): Likewise.
	(mark_rvalue_use): Likewise.
	(mark_lvalue_use): Likewise.
	(mark_lvalue_use_nonread): Likewise.
	(convert_from_reference): Likewise.
	(maybe_warn_nodiscard): Likewise.
	(expr_loc_or_loc): Likewise.
	(expr_loc_or_input_loc): Likewise.
	(get_fndecl_from_callee): Likewise.
	(pointer_offset_expression): Likewise.
	(is_empty_class): Likewise.
	(is_really_empty_class): Likewise.
	(rs_type_quals): Likewise.
	(init_modules): Likewise.
	(lookup_add): Likewise.
	(ovl_make): Likewise.
	(struct c_fileinfo): Likewise.
	(get_fileinfo): Likewise.
	(cxx_make_type): Likewise.
	(build_cplus_array_type): Likewise.
	(comptypes): Likewise.
	(rs_build_qualified_type_real): Likewise.
	(vector_targets_convertible_p): Likewise.
	(get_class_binding_direct): Likewise.
	(lang_check_failed): Likewise.
	(check_for_uninitialized_const_var): Likewise.
	(cp_fold_maybe_rvalue): Likewise.
	(fold_offsetof): Likewise.
	(fold_non_dependent_expr): Likewise.
	(in_immediate_context): Likewise.
	(cxx_mark_addressable): Likewise.
	(decl_constant_value): Likewise.
	(is_class_type): Likewise.
	(fold_builtin_is_pointer_inverconvertible_with_class): Likewise.
	(c_common_type_for_mode): Likewise.
	(next_common_initial_seqence): Likewise.
	(fold_builtin_is_corresponding_member): Likewise.
	(maybe_constant_value): Likewise.
	(rs_walk_subtrees): Likewise.
	(make_tree_vector): Likewise.
	(release_tree_vector): Likewise.
	(location_of): Likewise.
	(maybe_constant_init): Likewise.
	(explain_invalid_constexpr_fn): Likewise.
	(literal_type_p): Likewise.
	(maybe_constexpr_fn): Likewise.
	(fold_non_dependent_init): Likewise.
	* checks/errors/borrowck/polonius/rust-polonius.h (polonius_run): Likewise.
	(FFIVector__new): Likewise.
	(FFIVector__new_vec_pair): Likewise.
	(FFIVector__new_vec_triple): Likewise.
	(FFIVector__push): Likewise.
	(FFIVector__push_vec_triple): Likewise.
	* checks/errors/borrowck/rust-bir-builder-expr-stmt.cc
	(ExprStmtBuilder::visit): Likewise.
	* checks/errors/borrowck/rust-bir-builder-pattern.cc
	(PatternBindingBuilder::visit): Likewise.
	* checks/errors/borrowck/rust-bir-dump.cc (Dump::visit): Likewise.
	* checks/errors/borrowck/rust-bir-fact-collector.h (points): Likewise.
	* checks/errors/borrowck/rust-bir-place.h: Likewise.
	* checks/errors/borrowck/rust-bir-visitor.h: Likewise.
	* checks/errors/privacy/rust-privacy-check.cc (saw_errors): Likewise.
	* checks/errors/privacy/rust-privacy-ctx.h (rust_privacy_ctx_test): Likewise.
	* checks/errors/privacy/rust-privacy-reporter.cc
	(PrivacyReporter::check_for_privacy_violation): Likewise.
	(PrivacyReporter::check_base_type_privacy): Likewise.
	(PrivacyReporter::visit): Likewise.
	* checks/errors/privacy/rust-reachability.cc (ReachabilityVisitor::visit): Likewise.
	* checks/errors/privacy/rust-visibility-resolver.cc
	(VisibilityResolver::resolve_visibility): Likewise.
	* checks/errors/rust-hir-pattern-analysis.cc (Constructor::is_covered_by): Likewise.
	(PlaceInfo::specialize): Likewise.
	(WitnessPat::to_string): Likewise.
	(WitnessMatrix::apply_constructor): Likewise.
	(lower_pattern): Likewise.
	(lower_tuple_pattern): Likewise.
	(lower_struct_pattern): Likewise.
	* checks/errors/rust-hir-pattern-analysis.h (check_match_usefulness): Likewise.
	* expand/rust-cfg-strip.cc (CfgStrip::maybe_strip_generic_args): Likewise.
	* expand/rust-derive-eq.cc (DeriveEq::visit_enum): Likewise.
	* expand/rust-derive.cc: Likewise.
	* expand/rust-expand-format-args.cc (expand_format_args): Likewise.
	* expand/rust-expand-visitor.h (is_derive): Likewise.
	(is_builtin): Likewise.
	* expand/rust-macro-builtins-asm.cc (expand_inline_asm_strings): Likewise.
	* expand/rust-macro-builtins-asm.h (parse_asm): Likewise.
	(check_identifier): Likewise.
	(check_and_set): Likewise.
	(parse_label): Likewise.
	(parse_llvm_outputs): Likewise.
	(parse_llvm_inputs): Likewise.
	(parse_llvm_clobbers): Likewise.
	(parse_llvm_options): Likewise.
	* expand/rust-macro-builtins-helpers.h (make_macro_path_str): Likewise.
	(make_token): Likewise.
	(make_string): Likewise.
	(macro_end_token): Likewise.
	(parse_single_string_literal): Likewise.
	(source_relative_path): Likewise.
	(load_file_bytes): Likewise.
	* expand/rust-macro-expand.cc (MacroExpander::match_fragment): Likewise.
	(MacroExpander::match_matcher): Likewise.
	(MacroExpander::match_n_matches): Likewise.
	* expand/rust-macro-substitute-ctx.cc (SubstituteCtx::substitute_token): Likewise.
	* expand/rust-proc-macro.h (load_macros): Likewise.
	(generate_proc_macro_decls_symbol): Likewise.
	* hir/rust-ast-lower-base.cc (ASTLoweringBase::lower_generic_args): Likewise.
	(ASTLoweringBase::lower_range_pattern_bound): Likewise.
	* hir/rust-ast-lower-item.cc (ASTLoweringItem::visit): Likewise.
	* hir/rust-ast-lower-pattern.cc (ASTLoweringPattern::visit): Likewise.
	* hir/rust-ast-lower.h (struct_field_name_exists): Likewise.
	(translate_visibility): Likewise.
	* hir/rust-hir-dump.cc (Dump::visit): Likewise.
	* hir/rust-hir-dump.h (debug): Likewise.
	* hir/tree/rust-hir.cc (UseTreeGlob::as_string): Likewise.
	(UseTreeList::as_string): Likewise.
	* lex/rust-lex.cc (Lexer::parse_escape): Likewise.
	(Lexer::parse_utf8_escape): Likewise.
	* lex/rust-lex.h (rust_input_source_test): Likewise.
	* lex/rust-token.cc (RS_TOKEN_KEYWORD_2015): Likewise.
	* lex/rust-token.h (get_token_description): Likewise.
	(token_id_to_str): Likewise.
	(token_id_is_keyword): Likewise.
	(token_id_keyword_string): Likewise.
	(get_type_hint_string): Likewise.
	(nfc_normalize_token_string): Likewise.
	* metadata/rust-export-metadata.cc (PublicInterface::write_to_path): Likewise.
	* metadata/rust-import-archive.cc: Likewise.
	* metadata/rust-imports.h (add_search_path): Likewise.
	* parse/rust-cfg-parser.h (parse_cfg_option): Likewise.
	(rust_cfg_parser_test): Likewise.
	* parse/rust-parse-impl.h (Parser::skip_generics_right_angle): Likewise.
	(Parser::parse_attr_input): Likewise.
	(Parser::parse_macro_match): Likewise.
	(Parser::parse_visibility): Likewise.
	(Parser::parse_module): Likewise.
	(Parser::parse_use_tree): Likewise.
	(Parser::parse_generic_param): Likewise.
	(Parser::parse_struct): Likewise.
	(Parser::parse_enum_item): Likewise.
	(Parser::parse_inherent_impl_item): Likewise.
	(Parser::parse_external_item): Likewise.
	(Parser::parse_generic_arg): Likewise.
	(Parser::parse_type_path_segment): Likewise.
	(Parser::parse_expr_stmt): Likewise.
	(Parser::parse_if_expr): Likewise.
	(Parser::parse_if_let_expr): Likewise.
	(Parser::parse_type): Likewise.
	(Parser::parse_for_prefixed_type): Likewise.
	(Parser::parse_slice_or_array_type): Likewise.
	(Parser::parse_type_no_bounds): Likewise.
	(Parser::parse_range_pattern_bound): Likewise.
	(Parser::parse_pattern_no_alt): Likewise.
	(Parser::parse_grouped_or_tuple_pattern): Likewise.
	(Parser::parse_ident_leading_pattern): Likewise.
	(Parser::parse_tuple_struct_items): Likewise.
	(Parser::parse_stmt_or_expr): Likewise.
	(Parser::parse_struct_expr_field): Likewise.
	(Parser::null_denotation): Likewise.
	(Parser::left_denotation): Likewise.
	(Parser::parse_closure_expr_pratt): Likewise.
	* parse/rust-parse.cc (peculiar_fragment_match_compatible): Likewise.
	(is_match_compatible): Likewise.
	* parse/rust-parse.h (extract_module_path): Likewise.
	(is_match_compatible): Likewise.
	* resolve/rust-ast-resolve-expr.cc (translate_operand): Likewise.
	* resolve/rust-ast-resolve-item.cc (flatten_glob): Likewise.
	(flatten_rebind): Likewise.
	(flatten_list): Likewise.
	(flatten): Likewise.
	* resolve/rust-ast-resolve-item.h (rust_simple_path_resolve_test): Likewise.
	* resolve/rust-ast-resolve-pattern.cc (PatternDeclaration::visit): Likewise.
	(resolve_range_pattern_bound): Likewise.
	* resolve/rust-ast-resolve-type.cc (ResolveRelativeTypePath::go): Likewise.
	(ResolveTypeToCanonicalPath::visit): Likewise.
	* resolve/rust-ast-resolve.cc (saw_errors): Likewise.
	* resolve/rust-early-name-resolver-2.0.cc (Early::finalize_rebind_import): Likewise.
	* resolve/rust-ice-finalizer.h (funny_ice_text_finalizer): Likewise.
	* resolve/rust-late-name-resolver-2.0.cc (Late::visit): Likewise.
	* resolve/rust-toplevel-name-resolver-2.0.cc (flatten_glob): Likewise.
	* rust-backend.h (init): Likewise.
	(debug): Likewise.
	(get_identifier_node): Likewise.
	(wchar_type): Likewise.
	(get_pointer_size): Likewise.
	(raw_str_type): Likewise.
	(integer_type): Likewise.
	(float_type): Likewise.
	(pointer_type): Likewise.
	(reference_type): Likewise.
	(immutable_type): Likewise.
	(function_type): Likewise.
	(function_type_variadic): Likewise.
	(function_ptr_type): Likewise.
	(struct_type): Likewise.
	(union_type): Likewise.
	(array_type): Likewise.
	(named_type): Likewise.
	(type_field_offset): Likewise.
	(var_expression): Likewise.
	(float_constant_expression): Likewise.
	(string_constant_expression): Likewise.
	(char_constant_expression): Likewise.
	(wchar_constant_expression): Likewise.
	(boolean_constant_expression): Likewise.
	(convert_expression): Likewise.
	(struct_field_expression): Likewise.
	(compound_expression): Likewise.
	(conditional_expression): Likewise.
	(negation_expression): Likewise.
	(arithmetic_or_logical_expression): Likewise.
	(arithmetic_or_logical_expression_checked): Likewise.
	(comparison_expression): Likewise.
	(lazy_boolean_expression): Likewise.
	(constructor_expression): Likewise.
	(array_constructor_expression): Likewise.
	(array_initializer): Likewise.
	(array_index_expression): Likewise.
	(call_expression): Likewise.
	(init_statement): Likewise.
	(assignment_statement): Likewise.
	(return_statement): Likewise.
	(if_statement): Likewise.
	(loop_expression): Likewise.
	(exit_expression): Likewise.
	(statement_list): Likewise.
	(exception_handler_statement): Likewise.
	(block): Likewise.
	(block_add_statements): Likewise.
	(global_variable): Likewise.
	(global_variable_set_init): Likewise.
	(local_variable): Likewise.
	(parameter_variable): Likewise.
	(static_chain_variable): Likewise.
	(temporary_variable): Likewise.
	(label): Likewise.
	(function): Likewise.
	(function_defer_statement): Likewise.
	(function_set_parameters): Likewise.
	(write_global_definitions): Likewise.
	(fill_in_fields): Likewise.
	* rust-diagnostics.cc (expand_format): Likewise.
	(expand_message): Likewise.
	(va_constructor): Likewise.
	* rust-diagnostics.h (RUST_ATTRIBUTE_GCC_DIAG): Likewise.
	(rust_open_quote): Likewise.
	(rust_close_quote): Likewise.
	(rust_debug_loc): Likewise.
	* rust-gcc.cc (non_zero_size_type): Likewise.
	* rust-object-export.h (rust_field_alignment): Likewise.
	(rust_read_export_data): Likewise.
	(rust_write_export_data): Likewise.
	* rust-session-manager.cc (saw_errors): Likewise.
	(rust_get_linemap): Likewise.
	(validate_crate_name): Likewise.
	(Session::load_extern_crate): Likewise.
	* rust-session-manager.h (rust_crate_name_validation_test): Likewise.
	* rust-system.h (rust_preserve_from_gc): Likewise.
	(rust_localize_identifier): Likewise.
	* rust-target.h (rust_add_target_info): Likewise.
	* typecheck/rust-autoderef.cc:
	* typecheck/rust-casts.cc (TypeCastRules::cast_rules): Likewise.
	* typecheck/rust-coercion.cc (TypeCoercionRules::do_coercion): Likewise.
	(TypeCoercionRules::coerce_unsafe_ptr): Likewise.
	(TypeCoercionRules::coerce_borrowed_pointer): Likewise.
	* typecheck/rust-hir-trait-resolve.cc (TraitResolver::resolve_trait): Likewise.
	(TraitItemReference::is_object_safe): Likewise.
	* typecheck/rust-hir-type-check-base.cc (TypeCheckBase::resolve_literal): Likewise.
	* typecheck/rust-hir-type-check-expr.cc (TypeCheckExpr::visit): Likewise.
	(typecheck_inline_asm_operand): Likewise.
	* typecheck/rust-hir-type-check-implitem.cc (TypeCheckImplItem::visit): Likewise.
	(TypeCheckImplItemWithTrait::visit): Likewise.
	* typecheck/rust-hir-type-check-pattern.cc (TypeCheckPattern::visit): Likewise.
	* typecheck/rust-hir-type-check-struct.cc (TypeCheckStructExpr::visit): Likewise.
	* typecheck/rust-hir-type-check-type.cc
	(TypeResolveGenericParam::apply_trait_bounds): Likewise.
	(ResolveWhereClauseItem::visit): Likewise.
	* typecheck/rust-hir-type-check.cc (saw_errors): Likewise.
	(TraitItemReference::get_type_from_fn): Likewise.
	* typecheck/rust-type-util.h (query_type): Likewise.
	(types_compatable): Likewise.
	(unify_site): Likewise.
	(unify_site_and): Likewise.
	(coercion_site): Likewise.
	(try_coercion): Likewise.
	(cast_site): Likewise.
	* typecheck/rust-tyty-bounds.cc:
	* typecheck/rust-tyty-call.cc (TypeCheckCallExpr::visit): Likewise.
	* typecheck/rust-tyty-cmp.h:
	* typecheck/rust-tyty-variance-analysis.h (query_field_regions): Likewise.
	* typecheck/rust-tyty.cc (BaseType::is_unit): Likewise.
	(BaseType::has_substitutions_defined): Likewise.
	(BaseType::needs_generic_substitutions): Likewise.
	(BaseType::get_subst_argument_mappings): Likewise.
	(InferType::default_type): Likewise.
	(InferType::apply_primitive_type_hint): Likewise.
	* typecheck/rust-tyty.h (is_primitive_type_kind): Likewise.
	* typecheck/rust-unify.cc (UnifyRules::expect_inference_variable): Likewise.
	(UnifyRules::expect_adt): Likewise.
	(UnifyRules::expect_str): Likewise.
	(UnifyRules::expect_reference): Likewise.
	(UnifyRules::expect_pointer): Likewise.
	(UnifyRules::expect_param): Likewise.
	(UnifyRules::expect_array): Likewise.
	(UnifyRules::expect_slice): Likewise.
	(UnifyRules::expect_fndef): Likewise.
	(UnifyRules::expect_fnptr): Likewise.
	(UnifyRules::expect_tuple): Likewise.
	(UnifyRules::expect_bool): Likewise.
	(UnifyRules::expect_char): Likewise.
	(UnifyRules::expect_int): Likewise.
	(UnifyRules::expect_uint): Likewise.
	(UnifyRules::expect_float): Likewise.
	(UnifyRules::expect_isize): Likewise.
	(UnifyRules::expect_usize): Likewise.
	(UnifyRules::expect_never): Likewise.
	(UnifyRules::expect_placeholder): Likewise.
	(UnifyRules::expect_projection): Likewise.
	(UnifyRules::expect_dyn): Likewise.
	(UnifyRules::expect_closure): Likewise.
	(UnifyRules::expect_opaque): Likewise.
	* util/rust-abi.h (get_abi_from_string): Likewise.
	(get_string_from_abi): Likewise.
	* util/rust-attributes.cc (check_doc_attribute): Likewise.
	* util/rust-base62.h (base62_integer): Likewise.
	* util/rust-dir-owner.h (get_file_subdir): Likewise.
	* util/rust-edition.h (get_rust_edition): Likewise.
	* util/rust-punycode.h (encode_punycode): Likewise.
	(rust_punycode_encode_test): Likewise.
	* util/rust-token-converter.cc (convert): Likewise.
	(from_tokenstream): Likewise.
	* util/rust-token-converter.h (convert): Likewise.
	(convert_literal): Likewise.
	* util/rust-unicode.h (is_alphabetic): Likewise.
	(is_ascii_only): Likewise.
	(is_numeric): Likewise.
	(is_nfc_qc_no): Likewise.
	(is_nfc_qc_maybe): Likewise.
	(nfc_quick_check): Likewise.
	(rust_nfc_qc_test): Likewise.
	(rust_utf8_normalize_test): Likewise.
	(rust_utf8_property_test): Likewise.
	* util/rust-unwrap-segment.h (unwrap_segment_node_id): Likewise.

libgrust/ChangeLog:

	* libproc_macro_internal/ffistring.h (FFIString__new): Likewise.
	(FFIString__drop): Likewise.
	* libproc_macro_internal/ident.h (Ident__new): Likewise.
	(Ident__new_raw): Likewise.
	(Ident__drop): Likewise.
	(Ident__clone): Likewise.
	* libproc_macro_internal/literal.h (Literal__from_string): Likewise.
	* libproc_macro_internal/proc_macro.h (bridge_is_available): Likewise.
	* libproc_macro_internal/tokenstream.h (TokenStream__new): Likewise.
	(TokenStream__with_capacity): Likewise.
	(TokenSream__push): Likewise.
	(TokenStream__from_string): Likewise.
	(TokenStream__clone): Likewise.
	(TokenStream__drop): Likewise.

Signed-off-by: Marc Poulhiès <[email protected]>
Config has been updated upstream to correctly indent declaration.

gcc/rust/ChangeLog:

	* rust-attribs.cc (handle_hot_attribute): Remove clang-format comment.

Signed-off-by: Marc Poulhiès <[email protected]>
gcc/rust/ChangeLog:

	* ast/rust-ast-visitor.cc
	(DefaultASTVisitor::visit): Only visit the path of an instance
	of Visibility if the instance has a path.
	* ast/rust-ast.h
	(SimplePath::SimplePath): Make sure constructors are explicit.
	* resolve/rust-early-name-resolver-2.0.cc
	(Early::visit_attributes): Pass entire paths to
	NameResolutionContext::resolve_path.
	(Early::visit): Likewise and avoid copying a path.
	* resolve/rust-forever-stack.hxx
	(ForeverStack::resolve_path): Assert that at least one path
	segment has been passed in.

Signed-off-by: Owen Avery <[email protected]>
This should be unnecessary, since even C++11 has implicit move.

gcc/rust/ChangeLog:

	* parse/rust-parse-impl.h (Parser::parse_expr_stmt): Avoid
	reference binding and remove std::move in return statements.

Signed-off-by: Owen Avery <[email protected]>
Undefined attribute macros have no proc macro definition, which results
in a failing `rust_assert`. This changes that assert to an if statement,
that returns early if there is no proc macro definition. Fixes Rust-GCC#3661.

gcc/rust/ChangeLog:

	* resolve/rust-early-name-resolver-2.0.cc (Early::visit_attributes): rust_assert to if

gcc/testsuite/ChangeLog:

	* rust/compile/issue-3661.rs: Test NR2 has expected behavior

Signed-off-by: Tom Schollenberger <[email protected]>
gcc/testsuite/ChangeLog:

	* rust/execute/torture/builtin_abort.rs: Fix path to
	intrinsics::abort.

Signed-off-by: Owen Avery <[email protected]>
This is similar to 9faba02, but it
applies to execute tests.

gcc/testsuite/ChangeLog:

	* rust/execute/torture/for-loop1.rs: Adjust paths.
	* rust/execute/torture/for-loop2.rs: Likewise.
	* rust/execute/torture/iter1.rs: Likewise.

Signed-off-by: Owen Avery <[email protected]>
Polygonalr and others added 30 commits July 30, 2025 12:40
…ype scrutinee

Example GIMPLE output from compiling testsuite/rust/compile/match-pattern-array.rs:

  ...
  a[0] = 0;
  a[1] = 1;
  RUSTTMP.3 = a;
  _1 = RUSTTMP.3[0];
  _2 = _1 == 0;
  _3 = RUSTTMP.3[1];
  _4 = _3 == 1;
  _5 = _2 & _4;
  if (_5 != 0) goto <D.122>; else goto <D.123>;
  <D.122>:
  {
    {

		}
	}
  goto <D.117>;
  }
  <D.123>:
	...

gcc/rust/ChangeLog:

	* rust-backend.h: New size_constant_expression function.
	* rust-gcc.cc: Implementation of size_constant_expression function to generate tree node
		for array access.
	* backend/rust-compile-pattern.h: Remove empty visits for SlicePattern.
	* backend/rust-compile-pattern.cc: Implement SlicePattern check expression & binding
		compilation against ArrayType scrutinee.

Signed-off-by: Yap Zhi Heng <[email protected]>
gcc/rust/ChangeLog:

	* backend/rust-compile-expr.cc (CompileExpr::visit): Add a catch for const/static.

gcc/testsuite/ChangeLog:

	* rust/compile/loop_constant_context.rs: New test.
	* rust/compile/issue-3618.rs:

Signed-off-by: lishin <[email protected]>
Fixes Rust-GCC#3524

gcc/testsuite/ChangeLog:

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

Signed-off-by: Philip Herron <[email protected]>
gcc/rust/ChangeLog:

	* parse/rust-parse-impl.h (Parser::parse_simple_path): Be more
	careful about skipping SCOPE_RESOLUTION tokens.
	(Parser::parse_simple_path_segment): Allow parsing from a
	starting offset.
	(Parser::parse_use_tree): Handle a non-skipped SCOPE_RESOLUTION
	token.
	* parse/rust-parse.h (Parser::parse_simple_path_segment): Add
	parameter for parsing from a starting offset.

gcc/testsuite/ChangeLog:

	* rust/compile/parse_simple_path_fail_1.rs: New test.
	* rust/compile/parse_simple_path_fail_2.rs: New test.

Signed-off-by: Owen Avery <[email protected]>
Rust seems to allow duplicate HIR::Item 'main' functions but it needs
to be a root item to be the true main entry point. This means we can
use the canonical path to determine if this is a root one where
its CrateName::main or CrateName::Module::main.

Fixes Rust-GCC#3978

gcc/rust/ChangeLog:

	* backend/rust-compile-base.cc: check the canonical path

gcc/testsuite/ChangeLog:

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

Signed-off-by: Philip Herron <[email protected]>
In the test case:

  fn test (len: usize) -> u64 {
     let mut i = 0;
     let mut out = 0;
     if i + 3 < len {
        out = 123;
     }
     out
  }

The issue is to determine the correct type of 'i', out is simple because it hits a
coercion site in the resturn position for u64. But 'i + 3', 'i' is an integer infer
variable and the same for the literal '3'. So when it comes to resolving the type for
the Add expression we hit the resolve the operator overload code and because of this:

  macro_rules! add_impl {
      ($($t:ty)*) => ($(
          impl Add for $t {
              type Output = $t;

              #[inline]
              #[rustc_inherit_overflow_checks]
              fn add(self, other: $t) -> $t { self + other }
          }
      )*)
  }

  add_impl! { usize u8 u16 u32 u64 u128 isize i8 i16 i32 i64 i128 f32 f64 }

This means the resolution for 'i + 3' is ambigious because it could be any of these Add
implementations. But because we unify against the '< len' where len is defined as usize
later in the resolution we determine 'i' is actually a usize. Which means if we defer the
resolution of this operator overload in the ambigious case we can simply resolve it at the
end.

Fixes Rust-GCC#3916

gcc/rust/ChangeLog:

	* hir/tree/rust-hir-expr.cc (OperatorExprMeta::OperatorExprMeta): track the rhs
	* hir/tree/rust-hir-expr.h: likewise
	* hir/tree/rust-hir-path.h: get rid of old comments
	* typecheck/rust-hir-trait-reference.cc (TraitReference::get_trait_substs): return
	references instead of copy
	* typecheck/rust-hir-trait-reference.h: update header
	* typecheck/rust-hir-type-check-expr.cc (TypeCheckExpr::ResolveOpOverload): write ambigious
	operator overloads to a table and try to resolve it at the end
	* typecheck/rust-hir-type-check-expr.h: new static helper
	* typecheck/rust-hir-type-check.h (struct DeferredOpOverload): new model to defer resolution
	* typecheck/rust-typecheck-context.cc (TypeCheckContext::lookup_operator_overload): new
	(TypeCheckContext::compute_ambigious_op_overload): likewise
	(TypeCheckContext::compute_inference_variables): likewise

gcc/testsuite/ChangeLog:

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

Signed-off-by: Philip Herron <[email protected]>
Not adding the test case here we emit more errors than rustc for the error
type node so its just noisy and dejagnu is being a pain.

Fixes Rust-GCC#3933

gcc/rust/ChangeLog:

	* backend/rust-compile-resolve-path.cc (ResolvePathRef::resolve): return error_mark_node

Signed-off-by: Philip Herron <[email protected]>
This should make it easier for us to handle attribute meta items of the
form <SimplePath> '=' <Expression> where the expression isn't a literal.
Some low hanging fruit remains here, but I think I should keep this
patch small as I had some trouble debugging it as-is (see:
Rust::Token::as_string vs Rust::Token::get_str vs
Rust::AST::Token::as_string).

gcc/rust/ChangeLog:

	* ast/rust-ast.cc: Include "rust-macro-invoc-lexer.h".
	(AttributeParser::~AttributeParser): Move function definition
	here.
	(AttributeParser::AttributeParser): Likewise and adjust member
	initialization.
	(AttributeParser::parse_meta_item_inner): Handle changes to
	peek_token.
	(AttributeParser::parse_literal): Likewise.
	(AttributeParser::parse_simple_path_segment): Likewise.
	(AttributeParser::parse_meta_item_seq): Handle changes to
	AttributeParser fields.
	(AttributeParser::peek_token): Move function definition here and
	wrap MacroInvocLexer.
	(AttributeParser::skip_token): Likewise.
	* ast/rust-macro.h (class MacroInvocLexer): Forward declare.
	(class Parser): Likewise.
	(AttributeParser::token_stream): Remove field.
	(AttributeParser::stream_pos): Likewise.
	(AttributeParser::lexer): New field.
	(AttributeParser::parser): Likewise.
	(AttributeParser::AttributeParser): Move definition to
	"rust-ast.cc".
	(AttributeParser::~AttributeParser): Likewise.
	(AttributeParser::peek_token): Likewise.
	(AttributeParser::skip_token): Likewise.

Signed-off-by: Owen Avery <[email protected]>
When we have generic paths like T::foobar during codegen sometimes we need
to enforce an extra lookup for this generic parameter type to the mono
morphized underlying type.

Fixes Rust-GCC#3915
Fixes Rust-GCC#1247

gcc/rust/ChangeLog:

	* backend/rust-compile-resolve-path.cc (HIRCompileBase::query_compile): do another lookup

gcc/testsuite/ChangeLog:

	* rust/compile/issue-3915.rs: New test.
	* rust/execute/torture/sip-hasher.rs: New test.

Signed-off-by: Philip Herron <[email protected]>
gcc/rust/ChangeLog:

	* expand/rust-expand-visitor.cc
	(ExpandVisitor::expand_inner_items): Adjust call to
	expand_macro_children.
	(ExpandVisitor::expand_inner_stmts): Likewise.
	(ExpandVisitor::visit): Likewise.
	* expand/rust-expand-visitor.h
	(ExpandVisitor::expand_macro_children): Take a pointer to member
	function instead of a std::function.

Signed-off-by: Owen Avery <[email protected]>
TopLevel would ignore just-loaded modules but Early and ExpandVisitor
wouldn't. The latter would produce errors when it hit attributes which
should have been indirectly CfgStrip'd away.

gcc/rust/ChangeLog:

	* expand/rust-cfg-strip.cc (CfgStrip::visit): Load unloaded
	modules.
	* resolve/rust-toplevel-name-resolver-2.0.cc (TopLevel::visit):
	Assume modules have been loaded by CfgStrip.

Signed-off-by: Owen Avery <[email protected]>
This is important for importing enum variants as items.

gcc/rust/ChangeLog:

	* util/rust-hir-map.cc (Mappings::insert_ast_module): Rename to...
	(Mappings::insert_glob_container): ...this.
	(Mappings::lookup_ast_module): Rename to...
	(Mappings::lookup_glob_container): ...this.
	* util/rust-hir-map.h: Change declarations.
gcc/rust/ChangeLog:

	* resolve/rust-early-name-resolver-2.0.cc (Early::resolve_glob_import): Adapt for enums.
	(Early::finalize_glob_import): Likewise.
	* resolve/rust-early-name-resolver-2.0.h: Likewise.
	* resolve/rust-finalize-imports-2.0.cc (GlobbingVisitor::go): Likewise.
	(GlobbingVisitor::visit_module_container): New function.
	(GlobbingVisitor::visit_enum_container): New function.
	* resolve/rust-finalize-imports-2.0.h: Declare them.
	* resolve/rust-toplevel-name-resolver-2.0.cc (TopLevel::visit): Insert enums as potential
	containers.

gcc/testsuite/ChangeLog:

	* rust/compile/glob_import_enum.rs: New test.
gcc/rust/ChangeLog:

	* ast/rust-expr.h: Add handling for deferred consts.
	* ast/rust-ast-visitor.cc (DefaultASTVisitor::visit): Likewise.
	* ast/rust-ast.cc (AnonConst::as_string): Likewise.
	(ArrayType::as_string): Likewise.
	* ast/rust-type.h (class ArrayType): Use AnonConst for sizes.
	* parse/rust-parse-impl.h (Parser::parse_anon_const): New function.
	(Parser::parse_slice_or_array_type): Call it.
	* parse/rust-parse.h: Declare it.
gcc/rust/ChangeLog:

	* hir/rust-ast-lower-expr.cc (ASTLoweringExpr::visit): Handle defered consts.
	* hir/tree/rust-hir-expr.cc (AnonConst::AnonConst): Likewise.
	(AnonConst::operator=): Likewise.
	* hir/tree/rust-hir-expr.h: Likewise.
	* hir/tree/rust-hir-visitor.cc (DefaultHIRVisitor::walk): Likewise.
	* typecheck/rust-hir-type-check-expr.cc (TypeCheckExpr::visit): Likewise.

gcc/testsuite/ChangeLog:

	* rust/compile/deferred_const_inference.rs: New test.
gcc/rust/ChangeLog:

	* ast/rust-expr.h: Fix formatting.
Since we are doing more and more "external" desugars, as in desugars
that take a pointer and replace it with another one, rather than
modifying it from within, having an external visitor dispatch to the
proper desugar helps with code clarity.

gcc/rust/ChangeLog:

	* Make-lang.in: Compile it.
	* rust-session-manager.cc: Call the expression desugar dispatcher.
	* ast/rust-desugar-question-mark.cc: Rework class API.
	* ast/rust-desugar-question-mark.h: Likewise.
	* ast/rust-expression-yeast.cc: New file.
	* ast/rust-expression-yeast.h: New file.
gcc/rust/ChangeLog:

	* ast/rust-ast-visitor.cc (DefaultASTVisitor::visit): Visit a block's loop label if it
	exists.
This relies on the DefaultASTVisitor visitor for IfLetExprConseqElse
performing a virtual call of the visitor for IfLetExpr, which doesn't
hold when DefaultASTVisitor is generated by the X-macro-DSL-system I
have in another patch.

gcc/rust/ChangeLog:

	* resolve/rust-default-resolver.cc (DefaultResolver::visit): Add
	visitor for IfLetExprConseqElse.
	* resolve/rust-default-resolver.h (DefaultResolver::visit):
	Likewise.

Signed-off-by: Owen Avery <[email protected]>
gcc/rust/ChangeLog:

	* ast/rust-ast.h: Add the new variant.
	* ast/rust-expr.h: Use it for TryExpr class.
gcc/rust/ChangeLog:

	* Make-lang.in: Compile it.
	* ast/rust-expression-yeast.cc (ExpressionYeast::dispatch): Dispatch to try-block
	desugar.
	* ast/rust-desugar-try-block.cc: New file.
	* ast/rust-desugar-try-block.h: New file.

gcc/testsuite/ChangeLog:

	* rust/compile/try_block1.rs: New test.
gcc/rust/ChangeLog:

	* typecheck/rust-hir-type-check-pattern.cc (TypeCheckPattern::visit(SlicePattern)):
		Add new type check case for SliceType wrapped in ReferenceType.
	* backend/rust-compile-pattern.cc: Adjusted the asserts accordingly for
		CompilePatternCheckExpr(SlicePattern) & CompilePatternBindings(SlicePattern).

Signed-off-by: Yap Zhi Heng <[email protected]>
…inee

006t.original output from compiling testsuite/rust/compile/match-slicepattern-slice.rs:

...
  RUSTTMP.3 = slice;
  if (RUSTTMP.3.len == 1 && *(RUSTTMP.3.data + 0 * 4) == 1)
    {
      {
                struct () RUSTTMP.4;
        {

        }
        goto <D.129>;
      }
    }
  if (RUSTTMP.3.len == 2 && *(RUSTTMP.3.data + 1 * 4) == 2)
    {
      {
                struct () RUSTTMP.5;
        {

        }
        goto <D.129>;
      }
    }
  if (1)
    {
      {
                struct () RUSTTMP.6;
        {

        }
        goto <D.129>;
      }
    }
  <D.129>:;
...

gcc/rust/ChangeLog:

	* rust-backend.h: New slice_index_expression function.
	* rust-gcc.cc: Implementation of slice_index_expression to generate tree node for
		accessing slice elements.
	* backend/rust-compile-pattern.cc: Implement SlicePattern check expression & binding
		compilation against SliceType scrutinee.

Signed-off-by: Yap Zhi Heng <[email protected]>
gcc/rust/ChangeLog:

	* expand/rust-macro-builtins-asm.cc (expand_inline_asm_strings): Handle
	transformation for indexed positional arguments.

Signed-off-by: Pierre-Emmanuel Patry <[email protected]>
gcc/rust/ChangeLog:

	* hir/rust-hir-dump.cc (Dump::visit): Dump inline assembly fields
	* hir/tree/rust-hir-expr.h: Add non const getter and avoid operand copy
	from getters.
	* hir/tree/rust-hir-visitor.cc (DefaultHIRVisitor::walk): Use non const
	reference.

Signed-off-by: Pierre-Emmanuel Patry <[email protected]>
Previously inline assembly expected identifiers instead of expression.

gcc/rust/ChangeLog:

	* expand/rust-macro-builtins-asm.cc (parse_reg_operand_inout): Parse
	expressions and build split in out.

Signed-off-by: Pierre-Emmanuel Patry <[email protected]>
Inline assembly was incomplete and input/output from inout or split in
out were not handled.

gcc/rust/ChangeLog:

	* backend/rust-compile-asm.cc (get_out_expr): Return valid output from
	an operand.
	(CompileAsm::asm_construct_outputs): Handle every output
	(get_in_expr): Return valid input from an operand.
	(CompileAsm::asm_construct_inputs): Handle every input

Signed-off-by: Pierre-Emmanuel Patry <[email protected]>
gcc/testsuite/ChangeLog:

	* rust/execute/inline_asm_inout_ident.rs: New test.
	* rust/execute/inline_asm_inout_var.rs: New test.

Signed-off-by: Pierre-Emmanuel Patry <[email protected]>
gcc/rust/ChangeLog:

	* typecheck/rust-hir-type-check-base.cc
	(TypeCheckBase::TypeCheckBase): Remove initialization of
	resolver field.
	* typecheck/rust-hir-type-check-base.h
	(TypeCheckBase::resolver): Remove field.
	* typecheck/rust-hir-trait-resolve.cc: Remove "options.h"
	include.
	(TraitResolver::resolve_path_to_trait): Assume name resolution
	2.0 is always enabled.
	* typecheck/rust-hir-type-check-enumitem.cc: Remove "options.h"
	include.
	(TypeCheckEnumItem::visit): Assume name resolution 2.0 is always
	enabled.
	* typecheck/rust-hir-type-check-expr.cc: Remove "options.h"
	include.
	(TypeCheckExpr::visit): Assume name resolution 2.0 is always
	enabled.
	(TypeCheckExpr::resolve_operator_overload): Likewise.
	(TypeCheckExpr::resolve_fn_trait_call): Likewise.
	* typecheck/rust-hir-type-check-implitem.cc: Remove "options.h"
	include.
	(TypeCheckImplItem::visit): Assume name resolution 2.0 is always
	enabled.
	* typecheck/rust-hir-type-check-item.cc: Remove "options.h"
	include.
	(TypeCheckItem::visit): Assume name resolution 2.0 is always
	enabled.
	* typecheck/rust-hir-type-check-path.cc (TypeCheckExpr::visit):
	Likewise.
	(TypeCheckExpr::resolve_root_path): Likewise.
	(TypeCheckExpr::resolve_segments): Likewise.
	* typecheck/rust-hir-type-check-pattern.cc: Remove "options.h"
	include.
	(TypeCheckPattern::visit): Assume name resolution 2.0 is always
	enabled.
	* typecheck/rust-hir-type-check-type.cc
	(TypeCheckType::resolve_root_path): Likewise.
	(ResolveWhereClauseItem::visit): Likewise.
	* typecheck/rust-hir-type-check.cc: Remove "options.h" include.
	(TraitItemReference::get_type_from_fn): Assume name resolution
	2.0 is always enabled.
	* typecheck/rust-type-util.cc (query_type): Likewise.

Signed-off-by: Owen Avery <[email protected]>
Remove namespace comment after classes and structs.

gcc/rust/ChangeLog:

	* checks/errors/borrowck/rust-bir-fact-collector.h: Remove spurious
	comment.
	* checks/errors/rust-feature.cc: Likewise.
	* util/optional.h: Likewise.
	* expand/rust-token-tree-desugar.cc (TokenTreeDesugar::visit): Remove
	semicolons on namespace.
	* expand/rust-token-tree-desugar.h: Likewise.

Signed-off-by: Pierre-Emmanuel Patry <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.