Commit graph

207949 commits

Author SHA1 Message Date
Muhammad Mahad
718b65a93d gccrs: [E0617] attempt for invalid type variable in variadic function
There are some certain rust types must be cast before
passing them to a variadic function, because of arcane
ABI rules dictated by the C standard. To fix the error,
cast the value to the type specified by the error message.

gcc/rust/ChangeLog:

	* typecheck/rust-tyty-call.cc (TypeCheckCallExpr::visit):
	Added ErrorCode & more fixit hints.

gcc/testsuite/ChangeLog:

	* rust/compile/variadic.rs: Added new checks.

Signed-off-by: Muhammad Mahad <mahadtxt@gmail.com>
2024-01-16 19:04:37 +01:00
Philip Herron
95703bb75e gccrs: Remove HIR::ForLoopExpr
This will end up getting desugared into a LoopExpr with a MatchExpr body.

gcc/rust/ChangeLog:

	* backend/rust-compile-block.h: remove HIR::ForLoopExpr
	* backend/rust-compile-expr.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-unsafe-checker.cc (UnsafeChecker::visit): likewise
	* checks/errors/rust-unsafe-checker.h: likewise
	* checks/lints/rust-lint-marklive.h: likewise
	* hir/rust-ast-lower.cc (ASTLoweringExprWithBlock::visit): likewise
	* hir/rust-hir-dump.cc (Dump::visit): likewise
	* hir/rust-hir-dump.h: likewise
	* hir/tree/rust-hir-expr.h (class ForLoopExpr): likewise
	* hir/tree/rust-hir-full-decls.h (class ForLoopExpr): likewise
	* hir/tree/rust-hir-visitor.h: likewise
	* hir/tree/rust-hir.cc (ForLoopExpr::as_string): likewise
	(ForLoopExpr::accept_vis): likewise
	* typecheck/rust-hir-type-check-expr.h: likewise

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
2024-01-16 19:04:37 +01:00
Marc Poulhiès
0a99bfe15a gccrs: Minor typo fix
Fix varadic -> variadic

gcc/rust/ChangeLog:

	* backend/rust-compile-expr.cc (CompileExpr::visit): Fix typo in varIadic.
	* backend/rust-compile-type.cc (TyTyResolveCompile::visit): Likewise.
	* rust-backend.h (function_type_varadic): Rename into ...
	(function_type_variadic): ... this.
	* rust-gcc.cc (function_type_varadic): Rename into ...
	(function_type_variadic): ... this.
	* typecheck/rust-tyty-call.cc (TypeCheckCallExpr::visit): Likewise.
	* typecheck/rust-tyty.h (is_varadic): Renamed into ...
	(is_variadic): ... this.

Signed-off-by: Marc Poulhiès <dkm@kataplop.net>
2024-01-16 19:04:37 +01:00
Pierre-Emmanuel Patry
0a2219668d gccrs: Add license text to libproc_macro rust interface
The license text was missing in rust files producing the libproc_macro
interface to the libproc_macro_internal library.

libgrust/ChangeLog:

	* libproc_macro/bridge.rs: Add license text.
	* libproc_macro/bridge/ffistring.rs: Likewise.
	* libproc_macro/bridge/group.rs: Likewise.
	* libproc_macro/bridge/ident.rs: Likewise.
	* libproc_macro/bridge/literal.rs: Likewise.
	* libproc_macro/bridge/punct.rs: Likewise.
	* libproc_macro/bridge/span.rs: Likewise.
	* libproc_macro/bridge/token_stream.rs: Likewise.
	* libproc_macro/group.rs: Likewise.
	* libproc_macro/ident.rs: Likewise.
	* libproc_macro/lib.rs: Likewise.
	* libproc_macro/literal.rs: Likewise.
	* libproc_macro/punct.rs: Likewise.
	* libproc_macro/span.rs: Likewise.
	* libproc_macro/token_stream.rs: Likewise.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 19:04:36 +01:00
Marc Poulhiès
5a5c9f5221 gccrs: trivial typo fix.
Fix subsititions -> substitutions

gcc/rust/ChangeLog:

	* backend/rust-compile-base.cc (HIRCompileBase::compile_function):
	Fix typo in substitutions.
	(HIRCompileBase::resolve_method_address): Likewise.
	* backend/rust-compile-extern.h (CompileExternItem::visit):
	Likewise.
	* backend/rust-compile-implitem.cc (CompileTraitItem::visit):
	Likewise.
	* backend/rust-compile-intrinsic.cc (maybe_override_ctx):
	Likewise.
	* backend/rust-compile-item.cc (CompileItem::visit): Likewise.
	* backend/rust-compile-resolve-path.cc
	(HIRCompileBase::query_compile): Likewise.
	* typecheck/rust-coercion.cc (TypeCoercionRules::do_coercion):
	Likewise.
	* typecheck/rust-hir-type-check-item.cc
	(TypeCheckItem::ResolveImplBlockSelfWithInference): Likewise.
	* typecheck/rust-hir-type-check-path.cc (TypeCheckExpr::visit):
	Likewise.
	* typecheck/rust-hir-type-check-type.cc (TypeCheckType::visit):
	Likewise.
	* typecheck/rust-tyty.cc (BaseType::has_subsititions_defined):
	Renamed into ...
	(BaseType::has_substitutions_defined): ... this.
	(ADTType::is_equal): Fix typo in substitutions.
	(handle_substitions): Likewise.
	(FnType::is_equal): Likewise.
	(FnType::handle_substitions): Likewise.
	* typecheck/rust-tyty.h (has_subsititions_defined): Renamed into
	...
	(has_substitutions_defined): ... this.

Signed-off-by: Marc Poulhiès <dkm@kataplop.net>
2024-01-16 19:04:36 +01:00
Owen Avery
b786f697dd gccrs: Add intrinsics::assume
gcc/rust/ChangeLog:

	* backend/rust-compile-intrinsic.cc
	(get_identifier): Add declaration.
	(assume_handler): New.
	(generic_intrinsics): Add assume_handler entry.

gcc/testsuite/ChangeLog:

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

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
2024-01-16 19:04:36 +01:00
Owen Avery
a05079fa6c gccrs: Memoize Backend::wchar_type
gcc/rust/ChangeLog:

	* rust-gcc.cc
	(Backend::wchar_type): Store static wchar tree.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
2024-01-16 19:04:36 +01:00
Owen Avery
bf6fcd8790 gccrs: Remove unused complex number support
gcc/rust/ChangeLog:

	* rust-backend.h
	(complex_type): Remove.
	(complex_constant_expression): Remove.
	(real_part_expression): Remove.
	(imag_part_expression): Remove.
	(complex_expression): Remove.
	* rust-gcc.cc
	(complex_type): Remove.
	(complex_constant_expression): Remove.
	(real_part_expression): Remove.
	(imag_part_expression): Remove.
	(complex_expression): Remove.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
2024-01-16 19:04:36 +01:00
Owen Avery
879ba4e8ca gccrs: Use namespace definition to simplify function declarations
gcc/rust/ChangeLog:

	* rust-gcc.cc
	(namespace Backend):
	Use namespace definition instead of qualified names.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
2024-01-16 19:04:36 +01:00
liushuyu
9924c7485d gccrs: rust-compile-intrinsic: add copy intrinsics ...
... also made `copy_nonoverlapping` handler more generic

gcc/rust/ChangeLog:
	* backend/rust-compile-intrinsic.cc: add `copy`
	intrinsics and make `copy_nonoverlapping` handler more generic

Signed-off-by: Zixing Liu <liushuyu011@gmail.com>
2024-01-16 19:04:36 +01:00
liushuyu
4985bfcc6d gccrs: rust-builtins: add likely and unlikey intrinsics
gcc/rust/ChangeLog:
	* backend/rust-builtins.cc: add `expect` builtin definition.
	* backend/rust-compile-intrinsic.cc: add `likely` and `unlikely`
	intrinsics handler.

Signed-off-by: Zixing Liu <liushuyu011@gmail.com>
2024-01-16 19:04:36 +01:00
Owen Avery
b1b42beea3 gccrs: Rename "rust_error_codes.def" to "rust-error-codes.def"
gcc/rust/ChangeLog:

	* rust_error_codes.def: Moved to...
	* rust-error-codes.def: ...here...
	* rust-diagnostics.h: ...and update references.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
2024-01-16 19:04:36 +01:00
Guillaume Gomez
f538c29d78 gccrs: Shorten make_unsigned_long_tree code and remove Backend::integer_constant_expression
gcc/rust/ChangeLog:

	* backend/rust-compile-intrinsic.cc: Simplify `make_unsigned_long_tree`
	* rust-backend.h: Remove `integer_constant_expression`
	* rust-gcc.cc: Remove `integer_constant_expression`
2024-01-16 19:04:35 +01:00
Dave Evans
15648d5b8d gccrs: Fix typechecking (and compilation) error for alt patterns in match expressions.
gcc/rust/ChangeLog:

	* backend/rust-compile-pattern.cc (CompilePatternCaseLabelExpr::visit):
	Add AltPattern visitor function
	* backend/rust-compile-pattern.h:
	Update CompilePatternCaseLabelExpr::visit(AltPattern&).
	* typecheck/rust-hir-type-check-pattern.cc (TypeCheckPattern::visit):
	Update AltPattern visitor

gcc/testsuite/ChangeLog:

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

Signed-off-by: Dave Evans <dave@dmetwo.org>
2024-01-16 19:04:35 +01:00
Guillaume Gomez
bfc52efeac gccrs: Remove unused ctx argument in make_unsigned_long_tree function
gcc/rust/ChangeLog:

	* backend/rust-compile-intrinsic.cc: Remove unused argument
2024-01-16 19:04:35 +01:00
Arthur Cohen
9edb0bc9b8 gccrs: privacy: Uncomment test relying on #1257
gcc/testsuite/ChangeLog:

	* rust/compile/privacy6.rs: Uncomment commented out functions.
	* rust/compile/privacy9.rs: Fix unused variables.
2024-01-16 19:04:35 +01:00
Arthur Cohen
ae87a8ee08 gccrs: privacy: Add testcase for #1260
gcc/testsuite/ChangeLog:

	* rust/compile/privacy9.rs: New test.
2024-01-16 19:04:35 +01:00
Muhammad Mahad
2b560b964d gccrs: [E0599] Failed to resovle method implementation
gcc/rust/ChangeLog:

	* typecheck/rust-hir-type-check-expr.cc (TypeCheckExpr::visit):
	Added new error message, rich location and error code.

gcc/testsuite/ChangeLog:

	* rust/compile/cfg2.rs: Updated according to new message.
	* rust/compile/issue-2139.rs: likewise.
	* rust/compile/issue-2190-1.rs: likewise.
	* rust/compile/method1.rs: likewise.

Signed-off-by: Muhammad Mahad <mahadtxt@gmail.com>
2024-01-16 19:04:35 +01:00
Owen Avery
f14cbab89d gccrs: Convert class Backend into namespace
gcc/rust/ChangeLog:

	* rust-backend.h
	(class Backend): Convert to ...
	(namespace Backend): ... namespace.
	* rust-gcc.cc
	(Backend::Backend): Rename to ...
	(Backend::init): ... here.
	(rust_get_backend): Remove.

	* rust-session-manager.cc
	(rust_get_backend): Remove.
	(Session::init): Use Backend::init instead of rust_get_backend.
	(Session::compile_crate):
	Initialize Context without pointer to Backend.
	* rust-session-manager.h
	(Session::backend): Remove.
	* backend/rust-compile-context.cc
	(Context::Context): Remove pointer to Backend.
	* backend/rust-compile-context.h
	(class Context): Remove pointer to Backend, update function calls.

	* backend/rust-compile-base.cc: Update function calls.
	* backend/rust-compile-block.cc: Likewise.
	* backend/rust-compile-expr.cc: Likewise.
	* backend/rust-compile-extern.h: Likewise.
	* backend/rust-compile-fnparam.cc: Likewise.
	* backend/rust-compile-intrinsic.cc: Likewise.
	* backend/rust-compile-item.cc: Likewise.
	* backend/rust-compile-pattern.cc: Likewise.
	* backend/rust-compile-resolve-path.cc: Likewise.
	* backend/rust-compile-type.cc: Likewise.
	* backend/rust-compile-var-decl.h: Likewise.
	* backend/rust-compile.cc: Likewise.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
2024-01-16 19:04:35 +01:00
Pierre-Emmanuel Patry
fc024ea79d gccrs: Unify raw attribute values
Attribute values were used as raw string, this is error prone and
makes renaming harder. Using a constexpr instead will leverage the power
of the compiler and emit an error when an incorrect builtin attribute
value is used.

gcc/rust/ChangeLog:

	* ast/rust-ast.cc (Attribute::check_cfg_predicate): Change raw
	string to constexpr call.
	(Attribute::separate_cfg_attrs): Likewise.
	* backend/rust-compile-base.cc (should_mangle_item): Likewise.
	(HIRCompileBase::setup_fndecl): Likewise.
	(HIRCompileBase::handle_cold_attribute_on_fndecl): Likewise.
	* checks/errors/privacy/rust-privacy-reporter.cc (find_proc_macro_attribute):
	Likewise.
	* checks/errors/rust-unsafe-checker.cc (check_target_attr):
	Likewise.
	* expand/rust-cfg-strip.cc (fails_cfg): Likewise.
	(fails_cfg_with_expand): Likewise.
	(expand_cfg_attrs): Likewise.
	* expand/rust-macro-builtins.cc: Likewise.
	* hir/rust-ast-lower-base.cc (ASTLoweringBase::handle_outer_attributes): Likewise.
	(ASTLoweringBase::lower_macro_definition): Likewise.
	* hir/rust-hir-dump.cc (Dump::visit): Likewise.
	* parse/rust-parse-impl.h (Parser::parse_doc_comment): Likewise.
	* parse/rust-parse.cc (extract_module_path): Likewise.
	* resolve/rust-early-name-resolver.cc (is_macro_use_module):
	Likewise.
	(EarlyNameResolver::visit): Likewise.
	* resolve/rust-toplevel-name-resolver-2.0.cc (is_macro_export):
	Likwise.
	* rust-session-manager.cc (Session::injection): Likewise.
	* typecheck/rust-hir-type-check-base.cc (TypeCheckBase::parse_repr_options): Likewise.
	* util/rust-attributes.cc (is_proc_macro_type): Likewise.
	(AttributeChecker::check_attribute): Likewise.
	(AttributeChecker::visit): Likewise.
	* util/rust-hir-map.cc (Mappings::insert_macro_def): Likewise.
	* util/rust-attribute-values.h: New file.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 19:04:35 +01:00
Owen Avery
1f09a4fedc gccrs: Remove Gcc_backend
gcc/rust/ChangeLog:

	* rust-backend.h
	(Backend::Backend): New.
	(Backend::~Backend): Remove.
	(class Gcc_backend): Remove.
	* rust-gcc.cc
	(Gcc_backend::Gcc_backend): Rename to ...
	(Backend::Backend): ... here.
	(rust_get_backend): Construct Backend instead of Gcc_backend.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
2024-01-16 19:04:35 +01:00
Pierre-Emmanuel Patry
1501eed450 gccrs: Add missing linemap to lexer
When some proc macro create tokens and later have some code referring to
those created tokens the code was missing a linemap since the pointer
was null, throwing an ICE.

gcc/rust/ChangeLog:

	* expand/rust-proc-macro.cc (tokenstream_from_string): Change
	linemap null pointer to the current linemap.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 19:04:34 +01:00
Pierre-Emmanuel Patry
e6cd110305 gccrs: Add proc macro definition insertion
Insert proc macro definition from extern crates.

gcc/rust/ChangeLog:

	* resolve/rust-toplevel-name-resolver-2.0.cc (TopLevel::visit):
	Add proc macro definition insertion.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 19:04:34 +01:00
Pierre-Emmanuel Patry
2504357146 gccrs: Change proc macro mapping definition insertion
Since the node id already is contained into the proc macro we may omit
it from the function arguments.

gcc/rust/ChangeLog:

	* util/rust-hir-map.cc (Mappings::insert_derive_proc_macro_def):
	Change the function body to fetch the node id from the macro
	parameter.
	(Mappings::insert_bang_proc_macro_def): Likewise.
	(Mappings::insert_attribute_proc_macro_def): Likewise.
	* util/rust-hir-map.h: Update the function's prototype by
	removing the node id from the list of arguments.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 19:04:34 +01:00
Pierre-Emmanuel Patry
91461d3e73 gccrs: Retrieve def for derive & attribute proc macros
Add definition retrieval for derive and attribute proc macro types.

gcc/rust/ChangeLog:

	* resolve/rust-early-name-resolver-2.0.cc (Early::visit_attributes):
	Add proc macro handle retrieval for attribute and derive proc macros.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 19:04:34 +01:00
Pierre-Emmanuel Patry
7167ed8d86 gccrs: Change proc macro definition lookup to optionals
Continue changing the api to use optionals instead of bools and double
pointers.

gcc/rust/ChangeLog:

	* util/rust-hir-map.cc (Mappings::lookup_derive_proc_macro_def):
	Update function to accomodate new signature.
	(Mappings::lookup_bang_proc_macro_def): Likewise.
	(Mappings::lookup_attribute_proc_macro_def): Likewise.
	* util/rust-hir-map.h: Update function signatures.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 19:04:34 +01:00
Pierre-Emmanuel Patry
8a343bd46f gccrs: Use optional for proc macro invocation lookup
The old interface for those mappings was clunky at best. Now we can use
the optional structure to return a reference to the instance.

gcc/rust/ChangeLog:

	* expand/rust-macro-expand.h (struct MacroExpander): Update
	lookup function prototypes.
	* util/rust-hir-map.cc (Mappings::lookup_derive_proc_macro_invocation):
	Update lookup function according to new signature.
	(Mappings::lookup_bang_proc_macro_invocation): Likewise.
	(Mappings::lookup_attribute_proc_macro_invocation): Likewise.
	* util/rust-hir-map.h: Update function prototypes.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 19:04:34 +01:00
Owen Avery
346ccc0f0a gccrs: Remove Backend::write_export_data
gcc/rust/ChangeLog:

	* rust-backend.h
	(Backend::write_export_data): Remove.
	* rust-gcc.cc
	(Backend::write_export_data): Remove.
2024-01-16 19:04:34 +01:00
Owen Avery
867ee3a57a gccrs: Move remaining expression-related methods into base class Backend
gcc/rust/ChangeLog:

	* rust-backend.h
	(Backend::real_part_expression): Make non-virtual.
	(Backend::imag_part_expression): Likewise.
	(Backend::complex_expression): Likewise.
	(Backend::convert_expression): Likewise.
	(Backend::struct_field_expression): Likewise.
	(Backend::compound_expression): Likewise.
	(Backend::conditional_expression): Likewise.
	(Backend::negation_expression): Likewise.
	(Backend::arithmetic_or_logical_expression): Likewise.
	(Backend::arithmetic_or_logical_expression_checked): Likewise.
	(Backend::comparison_expression): Likewise.
	(Backend::lazy_boolean_expression): Likewise.
	(Backend::constructor_expression): Likewise.
	(Backend::array_constructor_expression): Likewise.
	(Backend::array_initializer): Likewise.
	(Backend::array_index_expression): Likewise.
	(Backend::call_expression): Likewise.

	(Gcc_backend::real_part_expression): Remove.
	(Gcc_backend::imag_part_expression): Remove.
	(Gcc_backend::complex_expression): Remove.
	(Gcc_backend::convert_expression): Remove.
	(Gcc_backend::struct_field_expression): Remove.
	(Gcc_backend::compound_expression): Remove.
	(Gcc_backend::conditional_expression): Remove.
	(Gcc_backend::negation_expression): Remove.
	(Gcc_backend::arithmetic_or_logical_expression): Remove.
	(Gcc_backend::arithmetic_or_logical_expression_checked): Remove.
	(Gcc_backend::comparison_expression): Remove.
	(Gcc_backend::lazy_boolean_expression): Remove.
	(Gcc_backend::constructor_expression): Remove.
	(Gcc_backend::array_constructor_expression): Remove.
	(Gcc_backend::array_initializer): Remove.
	(Gcc_backend::array_index_expression): Remove.
	(Gcc_backend::call_expression): Remove.
	* rust-gcc.cc
	(Gcc_backend::real_part_expression): Rename to ...
	(Backend::real_part_expression): ... here.
	(Gcc_backend::imag_part_expression): Rename to ...
	(Backend::imag_part_expression): ... here.
	(Gcc_backend::complex_expression): Rename to ...
	(Backend::complex_expression): ... here.
	(Gcc_backend::convert_expression): Rename to ...
	(Backend::convert_expression): ... here.
	(Gcc_backend::struct_field_expression): Rename to ...
	(Backend::struct_field_expression): ... here.
	(Gcc_backend::compound_expression): Rename to ...
	(Backend::compound_expression): ... here.
	(Gcc_backend::conditional_expression): Rename to ...
	(Backend::conditional_expression): ... here.
	(Gcc_backend::negation_expression): Rename to ...
	(Backend::negation_expression): ... here.
	(Gcc_backend::arithmetic_or_logical_expression): Rename to ...
	(Backend::arithmetic_or_logical_expression): ... here.
	(Gcc_backend::arithmetic_or_logical_expression_checked): Rename to ...
	(Backend::arithmetic_or_logical_expression_checked): ... here.
	(Gcc_backend::comparison_expression): Rename to ...
	(Backend::comparison_expression): ... here.
	(Gcc_backend::lazy_boolean_expression): Rename to ...
	(Backend::lazy_boolean_expression): ... here.
	(Gcc_backend::constructor_expression): Rename to ...
	(Backend::constructor_expression): ... here.
	(Gcc_backend::array_constructor_expression): Rename to ...
	(Backend::array_constructor_expression): ... here.
	(Gcc_backend::array_initializer): Rename to ...
	(Backend::array_initializer): ... here.
	(Gcc_backend::array_index_expression): Rename to ...
	(Backend::array_index_expression): ... here.
	(Gcc_backend::call_expression): Rename to ...
	(Backend::call_expression): ... here.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
2024-01-16 19:04:34 +01:00
Pierre-Emmanuel Patry
3713338d98 gccrs: Clarify package import procedure
This part of the code is a bit tricky as it calls multiple functions
with almost the same name and slightly different behaviors. It was even
more with a meaningless variable name.

gcc/rust/ChangeLog:

	* rust-session-manager.cc (Session::load_extern_crate): Change
	variable name, add temporaries and comments.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 19:04:34 +01:00
Pierre-Emmanuel Patry
86661b8d3d gccrs: resolver: Refactor macro insertion
Add a templated function to insert any of the three kind of proc macro
into the resolver context.

gcc/rust/ChangeLog:

	* expand/rust-proc-macro.h: Change get_trait_name to get_name in
	order to be coherent with the others proc macro type name
	convention.
	* resolve/rust-toplevel-name-resolver-2.0.cc (insert_macros):
	Add a templated funtion that inserts a proc macro into the
	context and emit an error on failure.
	(TopLevel::visit): Change from manual insertion to a function
	call.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 19:04:34 +01:00
Pierre-Emmanuel Patry
342b071a0f gccrs: resolver: Refactor assertion
Change the condition with rust_unreachable to an assertion. This will
keep the code clean and concise.
Some styling issues appeared during review, this commit make the code
more readable.

gcc/rust/ChangeLog:

	* resolve/rust-toplevel-name-resolver-2.0.cc (TopLevel::visit):
	Change to assertion.
	* util/rust-hir-map.cc (Mappings::lookup_derive_proc_macros):
	Add empty line.
	(Mappings::lookup_bang_proc_macros): Likewise.
	(Mappings::lookup_attribute_proc_macros): Likewise.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 19:04:33 +01:00
Pierre-Emmanuel Patry
c8911dde92 gccrs: Move extern crate resolving
Move extern crate resolving under the extern crate declaration instead
of doing it under the crate's root as extern crates are not resolved by
the top level resolver.

gcc/rust/ChangeLog:

	* metadata/rust-extern-crate.cc (ExternCrate::ExternCrate):
	Update definition to allow Extern crate with no content (pure
	proc macros).
	(ExternCrate::ok): Panic on no content.
	(ExternCrate::load): Likewise.
	* metadata/rust-extern-crate.h: Update prototypes.
	* resolve/rust-toplevel-name-resolver-2.0.cc (TopLevel::go):
	Remove macro resolution.
	(TopLevel::visit): Likewise.
	* resolve/rust-toplevel-name-resolver-2.0.h: Add visit prototype
	for extern crate.
	* rust-session-manager.cc (Session::load_extern_crate): Adapt
	content depending on the loaded crate's content.
	* util/rust-hir-map.cc (Mappings::lookup_derive_proc_macros):
	Change return type to optional because it is way more
	convenient.
	(Mappings::lookup_bang_proc_macros): Likewise.
	(Mappings::lookup_attribute_proc_macros): Likewise.
	* util/rust-hir-map.h: Update function prototypes.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 19:04:33 +01:00
Pierre-Emmanuel Patry
ccef457297 gccrs: Supress error with proc macro crates
This error was emitted when a valid proc macro crate was loaded. Proc
macros do not contain any import data for now.

gcc/rust/ChangeLog:

	* metadata/rust-imports.cc (Import::try_package_in_directory):
	Remove error when some macro are found even if no import data is
	available.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 19:04:33 +01:00
Pierre-Emmanuel Patry
86a3d1582f gccrs: Move proc macro definition to mappings
This commit moves the procedural macros loaded definition from outside
the AST to the mappings. This means most getters/setters around the
mappings had to be changed. This commit also introduces the top level
visit of those mappings instead of visiting the Crate ast members.

gcc/rust/ChangeLog:

	* ast/rust-ast.h (class BangProcMacro): Move class from here to
	rust-proc-macro.h. Also remove related functions.
	(class AttributeProcMacro): Likewise.
	(class CustomDeriveProcMacro): Likewise.
	(struct Crate): Remove proc macro vector members.
	* expand/rust-macro-expand.h (struct MacroExpander): Change the
	type to the newly created classes.
	* expand/rust-proc-macro.cc (BangProcMacro::BangProcMacro): Add
	constructor implementation.
	(AttributeProcMacro::AttributeProcMacro): Likewise.
	(CustomDeriveProcMacro::CustomDeriveProcMacro): Likewise.
	* expand/rust-proc-macro.h (class BangProcMacro): Move class to
	here.
	(class AttributeProcMacro): Likewise.
	(class CustomDeriveProcMacro): Likewise.
	* resolve/rust-toplevel-name-resolver-2.0.cc (TopLevel::go):
	Change top level visitor to check mappings instead
	* rust-session-manager.cc (Session::load_extern_crate):
	Add back macro collection to mappings.
	* util/rust-hir-map.cc (Mappings::insert_derive_proc_macros):
	Update getter signature with new types.
	(Mappings::insert_bang_proc_macros): Likewise.
	(Mappings::insert_attribute_proc_macros): Likewise.
	(Mappings::lookup_derive_proc_macros): Likewise.
	(Mappings::lookup_bang_proc_macros): Likewise.
	(Mappings::lookup_attribute_proc_macros): Likewise.
	(Mappings::insert_derive_proc_macro_def): Likewise.
	(Mappings::insert_bang_proc_macro_def): Likewise.
	(Mappings::insert_attribute_proc_macro_def): Likewise.
	(Mappings::lookup_derive_proc_macro_def): Likewise.
	(Mappings::lookup_bang_proc_macro_def): Likewise.
	(Mappings::lookup_attribute_proc_macro_def): Likewise.
	(Mappings::insert_derive_proc_macro_invocation): Likewise.
	(Mappings::lookup_derive_proc_macro_invocation): Likewise.
	(Mappings::insert_bang_proc_macro_invocation): Likewise.
	(Mappings::lookup_bang_proc_macro_invocation): Likewise.
	(Mappings::insert_attribute_proc_macro_invocation): Likewise.
	(Mappings::lookup_attribute_proc_macro_invocation): Likewise.
	* util/rust-hir-map.h: Update function prototypes as well as map
	types.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 19:04:33 +01:00
Pierre-Emmanuel Patry
e5c109ea4c gccrs: Add proc macro top level discovery
Add mechanism to discover proc macros in loaded extern crates. In the
top level resolver.

gcc/rust/ChangeLog:

	* resolve/rust-toplevel-name-resolver-2.0.cc (TopLevel::go):
	Visit crate's newly stored proc macros.
	* rust-session-manager.cc (Session::load_extern_crate):
	Store proc macros in the parsed crate instead of a local
	variable to achieve mappings.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 19:04:33 +01:00
Pierre-Emmanuel Patry
1caf0e8ffe gccrs: Change early resolver visit_attributes arguments
We do not need to copy the whole vector we can simply take a reference
instead.

gcc/rust/ChangeLog:

	* resolve/rust-early-name-resolver-2.0.cc (Early::visit_attributes):
	Change argument to reference.
	* resolve/rust-early-name-resolver-2.0.h: Update function
	prototype.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 19:04:33 +01:00
Pierre-Emmanuel Patry
8f5bedeb6c gccrs: Add getters for different types of proc macros
Add some getters on the ast crate in order to be able to retrieve a
reference to a crate's proc macros.

gcc/rust/ChangeLog:

	* ast/rust-ast.h: Add getters.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 19:04:33 +01:00
Pierre-Emmanuel Patry
5ea7434545 gccrs: Add proc macros abstractions to crate structure
Add multiple setters for a crate object in order to add macro
abstractions previously introduced.

gcc/rust/ChangeLog:

	* ast/rust-ast.h (struct Crate): Add proc macro members.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 19:04:33 +01:00
Pierre-Emmanuel Patry
7c265ce70b gccrs: Add proc macro ast representation
When resolving proc macros it is convenient to store every macro
directly in the extern crate. These class in the ast module provide a
better abstraction over the raw ProcMacro::{CustomDerive, Bang,
Attribute} structures provided by the proc_macro library.

gcc/rust/ChangeLog:

	* ast/rust-ast.h (class BangProcMacro): Add new proc macro
	abstraction.
	(class AttributeProcMacro): Likewise.
	(class CustomDeriveProcMacro): Likewise.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 19:04:33 +01:00
Pierre-Emmanuel Patry
4788645448 gccrs: Visit function and structure attributes
Add a simple attribute visit function and override StructStruct &
Function visit functions.

gcc/rust/ChangeLog:

	* resolve/rust-early-name-resolver-2.0.cc (Early::visit_attributes):
	Add function to handle attributes.
	(Early::visit): Override visitor functions.
	* resolve/rust-early-name-resolver-2.0.h: Add prototype.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 19:04:32 +01:00
Pierre-Emmanuel Patry
22bce7cbfa gccrs: Parse unparsed derive tokenstreams
Derive attributes should be parsed before attempting to retrieve any
traits. This will convert the tokenstream to a list of path if this
hasn't been done previously.

gcc/rust/ChangeLog:

	* ast/rust-ast.cc (Attribute::get_traits_to_derive): Convert
	tokenstream to path list.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 19:04:32 +01:00
Pierre-Emmanuel Patry
872ea1ab96 gccrs: Ease some constraints on derive definition
Member function is_derive was overly constrained, the attribute changes
when we parse it's meta items and it no longer contains a tokenstream
while staying a derive.

gcc/rust/ChangeLog:

	* ast/rust-ast.cc (Attribute::is_derive): Remove tokenstream
	condition.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 19:04:32 +01:00
Pierre-Emmanuel Patry
90ee631428 gccrs: Change trait getter to return references
Having copy and any other constructor stuff might lead to a breakage in
the future where the node id differs due to a newly constructed
SimplePath node. This change will allow us to assert the NodeId is from
the ast and not any copy made in between.

gcc/rust/ChangeLog:

	* ast/rust-ast.cc (Attribute::get_traits_to_derive): Change
	return type to a vector of references.
	* ast/rust-ast.h: Update constructor.
	* expand/rust-expand-visitor.cc (ExpandVisitor::expand_inner_stmts):
	Update function call.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 19:04:32 +01:00
Pierre-Emmanuel Patry
de8bc8f9bc gccrs: Set traits getter as member function
This function will be used outside of the expand visitor, making it
easily accessible is therefore mandatory.

gcc/rust/ChangeLog:

	* ast/rust-ast.cc (Attribute::get_traits_to_derive): Add
	function as member function.
	* ast/rust-ast.h: Add prototype.
	* expand/rust-expand-visitor.cc (get_traits_to_derive): Remove
	function.
	(ExpandVisitor::expand_inner_stmts): Update function call.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 19:04:32 +01:00
Pierre-Emmanuel Patry
ad1f510849 gccrs: Make is_builtin a member function
This function will be used in the multiple other places, therefore we
should make it easily usable from there.

gcc/rust/ChangeLog:

	* ast/rust-ast.cc (Attribute::is_derive): Add member function.
	* ast/rust-ast.h: Likewise.
	* expand/rust-expand-visitor.cc (is_derive): Remove old
	function.
	(ExpandVisitor::expand_inner_stmts): Update function call.
	(ExpandVisitor::visit_inner_using_attrs): Likewise.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 19:04:32 +01:00
Philip Herron
3afb921cda gccrs: Fix match-expression code-gen
We were massing the match scruitinee expression as a way to access the
result of the expression. This is wrong and needs to be stored in a
temporary otherwise it will cause the code to be regnerated for each time
it is used. This is not an issue in the case where the expression is only
used once.

Fixes #1895

gcc/rust/ChangeLog:

	* backend/rust-compile-expr.cc (CompileExpr::visit): use a temp for the value

gcc/testsuite/ChangeLog:

	* rust/execute/torture/iter1.rs: New test.

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
2024-01-16 19:04:32 +01:00
Owen Avery
83feca39ba gccrs: Move block-related methods into base class Backend
gcc/rust/ChangeLog:

	* rust-backend.h
	(Backend::block): Make non-virtual.
	(Backend::block_add_statements): Likewise.

	(Gcc_backend::block): Remove.
	(Gcc_backend::block_add_statements): Remove.
	* rust-gcc.cc
	(Gcc_backend::block): Rename to ...
	(Backend::block): ... here.
	(Gcc_backend::block_add_statements): Rename to ...
	(Backend::block_add_statements): ... here.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
2024-01-16 19:04:32 +01:00
Pierre-Emmanuel Patry
b1c722d141 gccrs: libproc_macro: Split c++ and rust
Move the rust interface to the libproc_macro directory.

libgrust/ChangeLog:

	* libproc_macro_internal/rust/bridge.rs: Moved to...
	* libproc_macro/bridge.rs: ...here.
	* libproc_macro_internal/rust/bridge/ffistring.rs: Moved to...
	* libproc_macro/bridge/ffistring.rs: ...here.
	* libproc_macro_internal/rust/bridge/group.rs: Moved to...
	* libproc_macro/bridge/group.rs: ...here.
	* libproc_macro_internal/rust/bridge/ident.rs: Moved to...
	* libproc_macro/bridge/ident.rs: ...here.
	* libproc_macro_internal/rust/bridge/literal.rs: Moved to...
	* libproc_macro/bridge/literal.rs: ...here.
	* libproc_macro_internal/rust/bridge/punct.rs: Moved to...
	* libproc_macro/bridge/punct.rs: ...here.
	* libproc_macro_internal/rust/bridge/span.rs: Moved to...
	* libproc_macro/bridge/span.rs: ...here.
	* libproc_macro_internal/rust/bridge/token_stream.rs: Moved to...
	* libproc_macro/bridge/token_stream.rs: ...here.
	* libproc_macro_internal/rust/group.rs: Moved to...
	* libproc_macro/group.rs: ...here.
	* libproc_macro_internal/rust/ident.rs: Moved to...
	* libproc_macro/ident.rs: ...here.
	* libproc_macro_internal/rust/lib.rs: Moved to...
	* libproc_macro/lib.rs: ...here.
	* libproc_macro_internal/rust/literal.rs: Moved to...
	* libproc_macro/literal.rs: ...here.
	* libproc_macro_internal/rust/punct.rs: Moved to...
	* libproc_macro/punct.rs: ...here.
	* libproc_macro_internal/rust/span.rs: Moved to...
	* libproc_macro/span.rs: ...here.
	* libproc_macro_internal/rust/token_stream.rs: Moved to...
	* libproc_macro/token_stream.rs: ...here.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 19:04:32 +01:00
Pierre-Emmanuel Patry
fd73cf8c31 gccrs: Rename libproc_macro to libproc_macro_internal
The name was a bit misleading since libproc_macro is a rust library that
should we should be able to link against some rust code. This cpp
library was the layer below the libproc_macro library, the "real" gcc
libproc_macro act as a translation layer for the internal library.

gcc/rust/ChangeLog:

	* expand/rust-macro-expand.h: Change include directive with the
	new name.
	* expand/rust-proc-macro.h (RUST_PROC_MACRO_H): Likewise.
	* util/rust-hir-map.h: Likewise.
	* util/rust-token-converter.h: Likewise.
	* util/rust-token-converter.cc: Remove useless include
	directive.
	* Make-lang.in: Rename library.

libgrust/ChangeLog:

	* Makefile.am: Change library name.
	* Makefile.in: Likewise.
	* configure.ac: Likewise.
	* configure: Regenerate.
	* libproc_macro/Makefile.am: Moved to...
	* libproc_macro_internal/Makefile.am: ...here.
	* libproc_macro/Makefile.in: Moved to...
	* libproc_macro_internal/Makefile.in: ...here.
	* libproc_macro/bridge.h: Moved to...
	* libproc_macro_internal/bridge.h: ...here.
	* libproc_macro/ffistring.cc: Moved to...
	* libproc_macro_internal/ffistring.cc: ...here.
	* libproc_macro/ffistring.h: Moved to...
	* libproc_macro_internal/ffistring.h: ...here.
	* libproc_macro/group.cc: Moved to...
	* libproc_macro_internal/group.cc: ...here.
	* libproc_macro/group.h: Moved to...
	* libproc_macro_internal/group.h: ...here.
	* libproc_macro/ident.cc: Moved to...
	* libproc_macro_internal/ident.cc: ...here.
	* libproc_macro/ident.h: Moved to...
	* libproc_macro_internal/ident.h: ...here.
	* libproc_macro/literal.cc: Moved to...
	* libproc_macro_internal/literal.cc: ...here.
	* libproc_macro/literal.h: Moved to...
	* libproc_macro_internal/literal.h: ...here.
	* libproc_macro/proc_macro.cc: Moved to...
	* libproc_macro_internal/proc_macro.cc: ...here.
	* libproc_macro/proc_macro.h: Moved to...
	* libproc_macro_internal/proc_macro.h: ...here.
	* libproc_macro/punct.cc: Moved to...
	* libproc_macro_internal/punct.cc: ...here.
	* libproc_macro/punct.h: Moved to...
	* libproc_macro_internal/punct.h: ...here.
	* libproc_macro/registration.h: Moved to...
	* libproc_macro_internal/registration.h: ...here.
	* libproc_macro/rust/bridge.rs: Moved to...
	* libproc_macro_internal/rust/bridge.rs: ...here.
	* libproc_macro/rust/bridge/ffistring.rs: Moved to...
	* libproc_macro_internal/rust/bridge/ffistring.rs: ...here.
	* libproc_macro/rust/bridge/group.rs: Moved to...
	* libproc_macro_internal/rust/bridge/group.rs: ...here.
	* libproc_macro/rust/bridge/ident.rs: Moved to...
	* libproc_macro_internal/rust/bridge/ident.rs: ...here.
	* libproc_macro/rust/bridge/literal.rs: Moved to...
	* libproc_macro_internal/rust/bridge/literal.rs: ...here.
	* libproc_macro/rust/bridge/punct.rs: Moved to...
	* libproc_macro_internal/rust/bridge/punct.rs: ...here.
	* libproc_macro/rust/bridge/span.rs: Moved to...
	* libproc_macro_internal/rust/bridge/span.rs: ...here.
	* libproc_macro/rust/bridge/token_stream.rs: Moved to...
	* libproc_macro_internal/rust/bridge/token_stream.rs: ...here.
	* libproc_macro/rust/group.rs: Moved to...
	* libproc_macro_internal/rust/group.rs: ...here.
	* libproc_macro/rust/ident.rs: Moved to...
	* libproc_macro_internal/rust/ident.rs: ...here.
	* libproc_macro/rust/lib.rs: Moved to...
	* libproc_macro_internal/rust/lib.rs: ...here.
	* libproc_macro/rust/literal.rs: Moved to...
	* libproc_macro_internal/rust/literal.rs: ...here.
	* libproc_macro/rust/punct.rs: Moved to...
	* libproc_macro_internal/rust/punct.rs: ...here.
	* libproc_macro/rust/span.rs: Moved to...
	* libproc_macro_internal/rust/span.rs: ...here.
	* libproc_macro/rust/token_stream.rs: Moved to...
	* libproc_macro_internal/rust/token_stream.rs: ...here.
	* libproc_macro/span.cc: Moved to...
	* libproc_macro_internal/span.cc: ...here.
	* libproc_macro/span.h: Moved to...
	* libproc_macro_internal/span.h: ...here.
	* libproc_macro/tokenstream.cc: Moved to...
	* libproc_macro_internal/tokenstream.cc: ...here.
	* libproc_macro/tokenstream.h: Moved to...
	* libproc_macro_internal/tokenstream.h: ...here.
	* libproc_macro/tokentree.cc: Moved to...
	* libproc_macro_internal/tokentree.cc: ...here.
	* libproc_macro/tokentree.h: Moved to...
	* libproc_macro_internal/tokentree.h: ...here.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 19:04:31 +01:00