Skip to content

Synchronize development branch with GCC's master branch #3761

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 10,000 commits into
base: master
Choose a base branch
from

Conversation

dkm
Copy link
Member

@dkm dkm commented Apr 22, 2025

This branch has a no-op merge as the last commit:

  • one arm is the "current" development branch from github
  • the other arm is a rebased version of the "current" master branch onto a recent GCC's master

The merge is obtained with "git merge --strategy=ours" to only keep the changes from second arm.

@dkm dkm self-assigned this Apr 22, 2025
@dkm dkm marked this pull request as draft April 22, 2025 19:39
@dkm dkm force-pushed the dkm/master-rebased branch 2 times, most recently from 135065f to 64035a8 Compare April 28, 2025 20:07
@powerboat9
Copy link
Collaborator

powerboat9 commented Apr 28, 2025

Wouldn't it be easier to put commits adjusting the expected warnings after the merge commit? Doesn't really matter either way, of course.

@dkm dkm force-pushed the dkm/master-rebased branch 5 times, most recently from ae5132f to e57faeb Compare May 5, 2025 20:09
@dkm dkm force-pushed the dkm/master-rebased branch 5 times, most recently from c10203f to 3f3712f Compare May 10, 2025 18:52
@dkm
Copy link
Member Author

dkm commented May 11, 2025

Wouldn't it be easier to put commits adjusting the expected warnings after the merge commit? Doesn't really matter either way, of course.

Not sure why you would want that? The goal is to have everything in one sequence between the upstream base and the merge commit. The regular sync will take the commits added after the merge by the pull request and move them between the base and the new merge.

@dkm dkm force-pushed the dkm/master-rebased branch 2 times, most recently from ad76a74 to 7808bcd Compare May 12, 2025 20:42
@powerboat9
Copy link
Collaborator

What should the .gitignore look like? Should we have every entry from both upstream and downstream, modify our downstream to match upstream exactly, keep only some entries from upstream and downstream, or something else?

@powerboat9
Copy link
Collaborator

It looks like the formatting for ast/rust-macro.cc is a bit odd, probably since it doesn't contain any function definitions. Should we just remove the file?

@powerboat9
Copy link
Collaborator

Are some of the clang-format-off sections added to rust-attribs.cc still relevant, with the clang-format upgrade?

@powerboat9
Copy link
Collaborator

powerboat9 commented May 13, 2025

Also, it looks like there are some non-trivial changes to the headers included by rust-lang.cc. Idk if the changes are good/bad though, would require further investigation.

@dkm
Copy link
Member Author

dkm commented May 13, 2025

It looks like the formatting for ast/rust-macro.cc is a bit odd, probably since it doesn't contain any function definitions. Should we just remove the file?

I guess we could yes, good catch.

Also, it looks like there are some non-trivial changes to the headers included by rust-lang.cc. Idk if the changes are good/bad though, would require further investigation.

Erm, you've already mentioned that on the Zulip, here's my copy of the answer for completeness :)

[snip snip 8<---8<----]

.... I think it has not been discarded, but more squashed with other changes with the initial upstreaming, and we may have introduced this small change in the process:

diff --git a/gcc/rust/rust-lang.cc b/gcc/rust/rust-lang.cc
index df06026387c..f3a155dbad1 100644
--- a/gcc/rust/rust-lang.cc
+++ b/gcc/rust/rust-lang.cc
@@ -1,4 +1,4 @@
-// Copyright (C) 2020-2024 Free Software Foundation, Inc.
+// Copyright (C) 2020-2025 Free Software Foundation, Inc.
 
 // This file is part of GCC.
 
@@ -16,9 +16,8 @@
 // along with GCC; see the file COPYING3.  If not see
 // <http://www.gnu.org/licenses/>.
 
+#include "rust-system.h"
 #include "rust-diagnostics.h"
-#include "config.h"
-#include "system.h"
 #include "coretypes.h"
 #include "target.h"
 #include "tree.h"
@@ -32,7 +31,6 @@
 #include "convert.h"
 #include "langhooks.h"
 #include "langhooks-def.h"
-
 #include "selftest.h"
 #include "rust-cfg-parser.h"
 #include "rust-privacy-ctx.h"
@@ -66,7 +64,6 @@
  * e.g. HIR conversion.
  */
 
-#include "rust-system.h"
 #include "rust-session-manager.h"
 #include "rust-tree.h"

I think it's OK.

@dkm
Copy link
Member Author

dkm commented May 13, 2025

What should the .gitignore look like? Should we have every entry from both upstream and downstream, modify our downstream to match upstream exactly, keep only some entries from upstream and downstream, or something else?

I think it's not very important, as long as we add stuff at the end. The vscode part could be dropped as it has been added upstream.

@dkm
Copy link
Member Author

dkm commented May 13, 2025

The gitignore change looks like:

 # ADDITIONS from GCCRS front-end
-.vscode/*
-test.code-workspace
-
-gcc/rust/test3-tiny/*
-.clang-format.swap

vscode has been moved up (upstream change).
The others entries are very old and probably not relevant anymore. So now we only have:

# ADDITIONS from GCCRS front-end
libgrust/*/target/

which can probably be removed as I don't think we are building rust crate in the source tree anymore (cc @P-E-P ?)

@dkm dkm force-pushed the dkm/master-rebased branch 2 times, most recently from 28d5521 to 9a8bf81 Compare May 14, 2025 17:29
@P-E-P
Copy link
Member

P-E-P commented May 15, 2025

vscode has been moved up (upstream change). The others entries are very old and probably not relevant anymore. So now we only have:

# ADDITIONS from GCCRS front-end
libgrust/*/target/

I agree we should remove those

which can probably be removed as I don't think we are building rust crate in the source tree anymore (cc @P-E-P ?)

Yeah we're not building it in tree anymore, libformat_parser is now built in $build/libformat_parser.

@dkm dkm force-pushed the dkm/master-rebased branch 2 times, most recently from aa8fa16 to 98aa652 Compare May 16, 2025 18:51
dkm and others added 11 commits June 2, 2025 21:37
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]>
Bump clang-format version to 16. This is needed as upstream has updated
the config and clang-format 10 doesn't support it.

ChangeLog:
	* .github/workflows/clang-format.yml: Bump clang-format version.

Signed-off-by: Marc Poulhiès <[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]>
Fixes #2883.

	* .gitignore: Remove 'libgrust/*/target/'.
@dkm dkm force-pushed the dkm/master-rebased branch from bb8c7d0 to 82b6b1e Compare June 2, 2025 20:55
powerboat9 and others added 17 commits June 2, 2025 23:58
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 #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]>
This is just a simple refactor to pull all the logic outside of the
closure which makes it more readable.

gcc/rust/ChangeLog:

	* typecheck/rust-hir-type-check.h: new function
	* typecheck/rust-typecheck-context.cc (TypeCheckContext::compute_inference_variables):
	call the new helper
	(TypeCheckContext::compute_infer_var): refactored code

Signed-off-by: Philip Herron <[email protected]>
…hese tmps

Cloning inference variables is very expensive because it means we are indirectly
creating an implicit new inference variable added to the reference chain.

gcc/rust/ChangeLog:

	* checks/errors/privacy/rust-privacy-reporter.cc (PrivacyReporter::check_base_type_privacy):
	no need for unreachable here
	* typecheck/rust-unify.cc (UnifyRules::commit): dont clone infer vars
	(UnifyRules::expect_inference_variable): likewise

Signed-off-by: Philip Herron <[email protected]>
When working on rpit we needed to change to use a monomorphized clone of
the result of function calls. This ended up causing a verify gimple issue
with tuples because:

  fn test<A, B>(a: A, b: B) -> (A, B)

When passing for example:

  let a = test::<i32, i32> (123, 456) -> (A=i32, B=i32)

The resulting gimple types became:

  const struct (A=i32, B=i32) vs struct (i32, i32)

We removed the VIEW_CONVERT_EXPR support to auto fix this stuff a good
while ago because it hides these kinds of issues because the type hasher
included the A=i32, B=i32 vs the i32, i32 name so updating this to use
get_name instead keeps the naming the same as well as the fields meaning
these types are 100% equivilant and therefore no conversion is required.
This only occurs because tuples are not named types we should really add
more rust specific info on our gimple TYPES.

gcc/rust/ChangeLog:

	* backend/rust-compile-type.cc (TyTyResolveCompile::visit): use get_name
	* typecheck/rust-tyty.cc (TupleType::get_name): likewise

Signed-off-by: Philip Herron <[email protected]>
This is the initial patch for RPIT, we can build on this to handle the
more complex cases but there are enough distinct changes going on here
that it should just get merged now.

RPIT is really a sneaky generic so for example:

  fn foo() -> impl Bar {
      Baz
  }

This is represented as: fn () -> OpaqueType Bar. But when we handle the
coercion site for Baz on impl Bar when we type resolve the function we
know that the underlying type  is Baz. Note this function is _not_ generic
so its using this special OpaqueType and keeping track of the underlying type
in its ty_ref reference hir-id which will resolve to Baz.

This also means if we have a case where maybe this was in an if statement:

  fn foo(a: i32) -> impl Bar {
      if a > 10 {
        Baz
      } else {
        Qux
      }
  }

The rules of impl Bar is that Baz is handled but Baz and Qux are different
underlying types so this is not allowed. The reason is impl traits are not
generic and although from a programmer perspective the callers dont know what
the underlying type is, the compiler _knows_ what it is. So really when
you call a function and get its return position impl trait the compiler knows
what to do and does all whats nessecary to handle calling functions using that
type etc.

gcc/rust/ChangeLog:

	* backend/rust-compile-type.cc (TyTyResolveCompile::visit): we need to resolve the
	underlying type
	* typecheck/rust-substitution-mapper.cc (SubstMapperInternal::visit): just clone
	* typecheck/rust-tyty-call.cc (TypeCheckCallExpr::visit):
	ensure we monomphize to get the underlying
	* typecheck/rust-tyty.cc (BaseType::destructure): handle opaque types
	(OpaqueType::resolve): this is much simpler now
	(OpaqueType::handle_substitions): no longer needed
	* typecheck/rust-tyty.h: update header
	* typecheck/rust-unify.cc (UnifyRules::expect_opaque): unify rules for opaque

gcc/testsuite/ChangeLog:

	* rust/compile/bad-rpit1.rs: New test.
	* rust/execute/torture/impl_rpit1.rs: New test.
	* rust/execute/torture/impl_rpit2.rs: New test.
	* rust/execute/torture/impl_rpit3.rs: New test.

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

	* resolve/rust-default-resolver.cc
	(DefaultResolver::visit_if_let_patterns): New function
	definition.
	(DefaultResolver::visit): New IfLetExpr visitor definition.
	* resolve/rust-default-resolver.h
	(DefaultResolver::visit_if_let_patterns): New function
	declaration.
	(DefaultResolver::visit): New IfLetExpr visitor declaration.
	* resolve/rust-late-name-resolver-2.0.cc (Late::visit): Remove
	IfLetExpr visitor definition.
	(Late::visit_if_let_patterns): New function definition.
	* resolve/rust-late-name-resolver-2.0.h (Late::visit): Remove
	IfLetExpr visitor declaration.
	(Late::visit_if_let_patterns): New function declaration.
	* resolve/rust-name-resolution-context.h (BindingSource::IfLet):
	New enumerator.

Signed-off-by: Owen Avery <[email protected]>
The unify code was a bit dumb here where we always set emit_error to false for any
subtypes for example in comparing tuples we always emitted the whole tuple didnt
match the other tuple but really its much better to say expected bool got i32 because
the element types didn't match.

gcc/rust/ChangeLog:

	* typecheck/rust-coercion.cc (TypeCoercionRules::coerce_unsized): dont emit error here
	* typecheck/rust-unify.cc (UnifyRules::resolve_subtype): new helper to handle emit error
	(UnifyRules::expect_adt): call resolve_subtype
	(UnifyRules::expect_reference): likewise
	(UnifyRules::expect_pointer): likewise
	(UnifyRules::expect_array): likewise
	(UnifyRules::expect_slice): likewise
	(UnifyRules::expect_fndef): likewise
	(UnifyRules::expect_fnptr): likewise
	(UnifyRules::expect_tuple): likewise
	(UnifyRules::expect_closure): likewise
	(UnifyRules::expect_opaque): likeiwse
	* typecheck/rust-unify.h: add new helper to header

gcc/testsuite/ChangeLog:

	* rust/compile/traits9.rs: update errors
	* rust/compile/unify-errors1.rs: New test.

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

	* ast/rust-expr.h: Declare AnonConst and ConstBlock and use them.
	* ast/rust-ast-full-decls.h: Likewise.
	* ast/rust-ast.cc: Add implementation for AnonConst and ConstBlock.
	* ast/rust-ast.h: Likewise.
	* ast/rust-ast-collector.cc (TokenCollector::visit): Likewise.
	* ast/rust-ast-collector.h: Likewise.
	* ast/rust-ast-visitor.cc (DefaultASTVisitor::visit): Likewise.
	* ast/rust-ast-visitor.h: Likewise.
	* expand/rust-derive.h: Likewise.
	* hir/rust-ast-lower-base.cc (ASTLoweringBase::visit): Likewise.
	* hir/rust-ast-lower-base.h: Likewise.
	* hir/rust-ast-lower-expr.cc (translate_operand_const): Likewise.
	* resolve/rust-ast-resolve-base.cc (ResolverBase::visit): Likewise.
	* resolve/rust-ast-resolve-base.h: Likewise.
	* resolve/rust-ast-resolve-expr.h: Likewise.
	* resolve/rust-ast-resolve-expr.cc: Likewise.
gcc/rust/ChangeLog:

	* parse/rust-parse-impl.h (Parser::parse_const_block_expr): New function.
	* parse/rust-parse.h: Declare it.
gcc/rust/ChangeLog:

	* hir/tree/rust-hir-expr.h: New classes.
	* hir/tree/rust-hir-full-decls.h: Likewise.
	* hir/tree/rust-hir.cc: Handle AnonConst and ConstBlock.
	* backend/rust-compile-block.cc: Likewise.
	* backend/rust-compile-block.h: Likewise.
	* backend/rust-compile-expr.cc (CompileExpr::visit): Likewise.
	* backend/rust-compile-expr.h: Likewise.
	* checks/errors/borrowck/rust-bir-builder-expr-stmt.cc (ExprStmtBuilder::visit): Likewise.
	* checks/errors/borrowck/rust-bir-builder-expr-stmt.h: Likewise.
	* checks/errors/borrowck/rust-bir-builder-lazyboolexpr.h: Likewise.
	* checks/errors/borrowck/rust-bir-builder-struct.h: Likewise.
	* checks/errors/borrowck/rust-function-collector.h: Likewise.
	* checks/errors/privacy/rust-privacy-reporter.cc (PrivacyReporter::visit): Likewise.
	* checks/errors/privacy/rust-privacy-reporter.h: Likewise.
	* checks/errors/rust-const-checker.cc (ConstChecker::visit): Likewise.
	* checks/errors/rust-const-checker.h: Likewise.
	* checks/errors/rust-hir-pattern-analysis.cc (PatternChecker::visit): Likewise.
	* checks/errors/rust-hir-pattern-analysis.h: Likewise.
	* checks/errors/rust-unsafe-checker.cc (UnsafeChecker::visit): Likewise.
	* checks/errors/rust-unsafe-checker.h: Likewise.
	* hir/rust-ast-lower-expr.cc (ASTLoweringExpr::visit): Likewise.
	(translate_operand_out): Likewise.
	(translate_operand_inout): Likewise.
	(translate_operand_const): Likewise.
	* hir/rust-ast-lower-expr.h: Likewise.
	* hir/rust-hir-dump.cc (Dump::visit): Likewise.
	* hir/rust-hir-dump.h: Likewise.
	* hir/tree/rust-hir-expr-abstract.h: Likewise.
	* hir/tree/rust-hir-expr.cc (AnonConst::AnonConst): Likewise.
	(AnonConst::operator=): Likewise.
	(ConstBlock::ConstBlock): Likewise.
	(ConstBlock::operator=): Likewise.
	* hir/tree/rust-hir-visitor.h:
	* typecheck/rust-hir-type-check-expr.cc (TypeCheckExpr::visit): Likewise.
	(typecheck_inline_asm_operand): Likewise.
	* typecheck/rust-hir-type-check-expr.h: Likewise.
gcc/testsuite/ChangeLog:

	* rust/execute/torture/const_block1.rs: New test.
ChangeLog:

	* .github/alpine_32bit_log_warnings: Adjust with latest warnings.
	* .github/glibcxx_ubuntu64b_log_expected_warnings: Likewise.
	* .github/log_expected_warnings: Likewise.

Signed-off-by: Marc Poulhiès <[email protected]>
…based

This branch has a no-op merge as the last commit:
 - one arm is the "current" development branch from github
 - the other arm is a rebased version of the "current" master branch onto a recent GCC's master

The merge is obtained with "git merge --strategy=ours" to only keep the changes from second arm.
@dkm dkm force-pushed the dkm/master-rebased branch from 82b6b1e to 1611ea0 Compare June 2, 2025 21:58
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.