Commit graph

207827 commits

Author SHA1 Message Date
Muhammad Mahad
c75db430f0 gccrs: [E0412] used type name not in scope
gcc/rust/ChangeLog:

	* resolve/rust-ast-resolve-type.cc (ResolveRelativeTypePath::go):
	Added ErrorCode.

Signed-off-by: Muhammad Mahad <mahadtxt@gmail.com>
2024-01-16 19:00:28 +01:00
Pierre-Emmanuel Patry
5249b87d9a gccrs: Fix a warning about extra semicolon
This semicolon produces several warning in each TU the header file is
included in.

gcc/rust/ChangeLog:

	* util/rust-common.h (enum_to_str): Remove extra semicolon after
	the function.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 19:00:28 +01:00
Muhammad Mahad
a60bafec5a gccrs: [E0658] Unstable langauge feature
gcc/rust/ChangeLog:

	* checks/errors/rust-const-checker.cc (ConstChecker::visit):
	Use of mutable reference in constant functions.
	* checks/errors/rust-feature-gate.cc (FeatureGate::gate):
	ErrorCode for intrinsics are subject to change.

Signed-off-by: Muhammad Mahad <mahadtxt@gmail.com>
2024-01-16 19:00:28 +01:00
Muhammad Mahad
9e208648cb gccrs: [E0015] Use of non-const inside const
gcc/rust/ChangeLog:

	* checks/errors/rust-const-checker.cc (ConstChecker::check_function_call):
	Added errorcode.

Signed-off-by: Muhammad Mahad <mahadtxt@gmail.com>
2024-01-16 19:00:28 +01:00
Muhammad Mahad
24fe3afef2 gccrs: [E0107] Wrong number of generic argument
gcc/rust/ChangeLog:

	* typecheck/rust-tyty-subst.cc (SubstitutionRef::get_mappings_from_generic_args):
	Added errorcode.

Signed-off-by: Muhammad Mahad <mahadtxt@gmail.com>
2024-01-16 19:00:28 +01:00
Arthur Cohen
e99ee91a95 gccrs: nr2.0: Add macros 2.0 resolution testcase.
gcc/testsuite/ChangeLog:

	* rust/compile/name_resolution10.rs: New test.
2024-01-16 19:00:28 +01:00
Arthur Cohen
8ea51b5c81 gccrs: nr2.0: Add macros 2.0 in Ribs in TopLevel visitor
gcc/rust/ChangeLog:

	* resolve/rust-toplevel-name-resolver-2.0.cc (TopLevel::visit): Declare
	macros in the current rib if they are macros 2.0.
2024-01-16 19:00:27 +01:00
Arthur Cohen
c2ea7f6f36 gccrs: ast: Add get_kind method to MacroRulesDefinition
gcc/rust/ChangeLog:

	* ast/rust-macro.h: Add new method to `MacroRulesDefinition` to allow
	getting the `MacroKind` contained.
2024-01-16 19:00:27 +01:00
Arthur Cohen
44ec7404b9 gccrs: nr2.0: Add complex macro name resolution test cases
gcc/testsuite/ChangeLog:

	* rust/compile/name_resolution6.rs: New test.
	* rust/compile/name_resolution7.rs: New test.
	* rust/compile/name_resolution8.rs: New test.
	* rust/compile/name_resolution9.rs: New test.
2024-01-16 19:00:27 +01:00
Arthur Cohen
301e59b864 gccrs: session-manager: Run name resolution 2.0 if the option is present
gcc/rust/ChangeLog:

	* rust-session-manager.cc
	(Session::expansion): Use new `Early` name resolution 2.0 pass
2024-01-16 19:00:27 +01:00
Arthur Cohen
f7084d4872 gccrs: nr2.0: Add Early name resolution visitor
This visitor takes care of resolving macro invocations, procedural macros
and imports - it is used in conjunction with the `TopLevel` pass and
the macro expander.

gcc/rust/ChangeLog:

	* Make-lang.in: Add new object file.
	* resolve/rust-early-name-resolver-2.0.cc: New file.
	* resolve/rust-early-name-resolver-2.0.h: New file.
2024-01-16 19:00:27 +01:00
Arthur Cohen
2bde73fa46 gccrs: nr2.0: Visit receiver/call expression and arguments in calls/methods
gcc/rust/ChangeLog:

	* resolve/rust-default-resolver.cc
	(DefaultResolver::visit): Visit CallExpr and MethodCallExpr properly.
	* resolve/rust-default-resolver.h: Switch "node" to plural in documentation.
2024-01-16 19:00:27 +01:00
Arthur Cohen
3a5a74d917 gccrs: toplevel: Handle macro definitions properly
gcc/rust/ChangeLog:

	* resolve/rust-toplevel-name-resolver-2.0.cc
	(TopLevel::insert_or_error_out): Fix format string.
	(is_macro_export): New method.
	(TopLevel::visit): Handle macro definitions.
2024-01-16 19:00:27 +01:00
Arthur Cohen
d3d006d6b0 gccrs: resolver: Resolve macros too.
gcc/rust/ChangeLog:

	* resolve/rust-name-resolution-context.cc
	(Resolver::insert): Do not call into `rust_unreachable` when resolving
	macros anymore.
2024-01-16 19:00:27 +01:00
Arthur Cohen
79d8fb09c6 gccrs: forever stack: Add path resolution
gcc/rust/ChangeLog:

	* resolve/rust-forever-stack.h
	(insert_at_root): New method.
	(resolve_path): New method.
	(reverse_iter): Iterate on `Node`s instead of `Rib`s
	* resolve/rust-forever-stack.hxx: Add path resolution.
2024-01-16 19:00:27 +01:00
Arthur Cohen
5a0e099e89 gccrs: rib2.0: Add shadowing
gcc/rust/ChangeLog:

	* resolve/rust-rib.h: Add shadowing parameter. Make kind field public.
	* resolve/rust-rib.cc (Rib::insert): Likewise.
2024-01-16 19:00:26 +01:00
Muhammad Mahad
7c10950f54 gccrs: [E0426] Use of undeclared label
Refactored error message to print more
userfriendly message and added error
code.

gcc/rust/ChangeLog:

	* resolve/rust-ast-resolve-expr.cc (ResolveExpr::visit):
	refactored message and called error function.

gcc/testsuite/ChangeLog:

	* rust/compile/undeclared_label.rs: New test for E0426.

Signed-off-by: Muhammad Mahad <mahadtxt@gmail.com>
2024-01-16 19:00:26 +01:00
Muhammad Mahad
f0193accb7 gccrs: [E0635] Use of Unknown feature.
Added ErrorCode support for use of unknown
feature.

gcc/rust/ChangeLog:

	* checks/errors/rust-feature-gate.cc (FeatureGate::check):
	errorcode support for unknown feature.

gcc/testsuite/ChangeLog:

	* rust/compile/feature.rs: Added new unknown feature.

Signed-off-by: Muhammad Mahad <mahadtxt@gmail.com>
2024-01-16 19:00:26 +01:00
Muhammad Mahad
5db4f84f88 gccrs: [E0308] mismatch types on assignment
This errorcode emits when there are
mismatch types between lhs & rhs of
assignment operator & refactored
message. This error code was used
in many test cases, so updated the
error comments.

gcc/rust/ChangeLog:

	* typecheck/rust-unify.cc (UnifyRules::emit_type_mismatch):
	refactored & called error function.

gcc/testsuite/ChangeLog:

	* rust/compile/arrays1.rs: changed comment to pass testcase.
	* rust/compile/bad_type1.rs: likewise.
	* rust/compile/bad_type2.rs: likewise.
	* rust/compile/const_generics_6.rs: likewise.
	* rust/compile/deadcode_err1.rs: likewise.
	* rust/compile/deadcode_err2.rs: likewise.
	* rust/compile/func1.rs: likewise.
	* rust/compile/func3.rs: likewise.
	* rust/compile/func4.rs: likewise.
	* rust/compile/func5.rs: likewise.
	* rust/compile/generics1.rs: likewise.
	* rust/compile/generics2.rs: likewise.
	* rust/compile/generics3.rs: likewise.
	* rust/compile/implicit_returns_err1.rs: likewise.
	* rust/compile/implicit_returns_err2.rs: likewise.
	* rust/compile/implicit_returns_err3.rs: likewise.
	* rust/compile/implicit_returns_err4.rs: likewise.
	* rust/compile/issue-1152.rs: likewise.
	* rust/compile/issue-2477.rs: likewise.
	* rust/compile/reference1.rs: likewise.
	* rust/compile/stmt_with_block_err1.rs: likewise.
	* rust/compile/traits1.rs: likewise.
	* rust/compile/traits2.rs: likewise.
	* rust/compile/tuple_mismatch.rs: likewise.
	* rust/compile/tuple_struct3.rs: likewise.
	* rust/compile/mismatched-types.rs: New test from rustc.

Signed-off-by: Muhammad Mahad <mahadtxt@gmail.com>
2024-01-16 19:00:26 +01:00
Marc Poulhiès
8b1e1faa7f gccrs: better handling of incorrect file loading in include_* builtin macros
When the load_file_bytes() fails to open the file, it emits an error but
returns an empty vector (as if the file is empty).

Instead, return a tl::optional nullopt in case of error and an empty
vector in case of an empty file.

fixes #2421

gcc/rust/ChangeLog:

	* expand/rust-macro-builtins.cc
	(load_file_bytes): Return a tl::optional.
	(MacroBuiltin::include_byte_handler): Adjust and check file was
	correctly opened.
	(MacroBuiltin::include_str_handler): Likewise.

gcc/testsuite/ChangeLog:

	* rust/compile/empty_file: New file.
	* rust/compile/issue-2421_str.rs: New test.

Signed-off-by: Marc Poulhiès <dkm@kataplop.net>
2024-01-16 19:00:26 +01:00
Arthur Cohen
3b0a200eb8 gccrs: nr2.0: Use DefaultResolver for TopLevel
gcc/rust/ChangeLog:

	* resolve/rust-toplevel-name-resolver-2.0.h
	(class TopLevel): Inherit from DefaultResolver
	* resolve/rust-toplevel-name-resolver-2.0.cc
	(TopLevel::TopLevel): Remove unecessary methods
2024-01-16 19:00:26 +01:00
Arthur Cohen
467794700e gccrs: nr2.0: Add DefaultResolver visitor
The DefaultResolver class provides a visitor framework for all three resolvers
in the new name resolution algorithm, with things such as scoping or visiting
sub items.

gcc/rust/ChangeLog:

	* Make-lang.in: Add new object file.
	* resolve/rust-default-resolver.cc: New file.
	* resolve/rust-default-resolver.h: New file.
2024-01-16 19:00:26 +01:00
Raiki Tamura
26c4133a62 gccrs: Normalize Hangul to NFC
gcc/rust/ChangeLog:

	* util/rust-unicode.cc (decomp_cano): Decompose Hangul.
	(sort_cano): Fix bounds check.
	(recomp): use `compose_hangul`.
	(compose_hangul): Compose Hangul.
	(rust_utf8_normalize_test): Add tests.

Signed-off-by: Raiki Tamura <tamaron1203@gmail.com>
2024-01-16 19:00:26 +01:00
Arthur Cohen
6db677bac0 gccrs: forever-stack: Use rust_assert instead of assert
This causes complaints by our GCC 4.8 builder.

gcc/rust/ChangeLog:

	* resolve/rust-forever-stack.hxx: assert() -> rust_assert()
2024-01-16 19:00:26 +01:00
Arthur Cohen
daae0c5dff gccrs: top-level: Add base TopLevel visitor
The `TopLevel` pass takes care of collecting definitions, placing them
in the proper namespaces, and making them accessible for later resolution
passes like `Early` and `Late`. It is meant to be run in a fixed point
fashion, as import resolution, macro resolution and macro expansion
may generate multiple new definitions.

gcc/rust/ChangeLog:

	* Make-lang.in: Add new object file.
	* resolve/rust-toplevel-name-resolver-2.0.cc: New file.
	* resolve/rust-toplevel-name-resolver-2.0.h: New file.
2024-01-16 19:00:25 +01:00
Arthur Cohen
79df2b3caf gccrs: name resolution 2.0: Add base for our context data structure
This commit adds a first simple `NameResolutionContext` data structure, which will
be used by all passes of the name resolution to store definitions and access
them. Namely, it contains a few instances of `ForeverStack`, for each
namespace we will be using.

gcc/rust/ChangeLog:

	* Make-lang.in: Add new object file.
	* resolve/rust-name-resolution-context.cc: New file.
	* resolve/rust-name-resolution-context.h: New file.
2024-01-16 18:56:04 +01:00
Muhammad Mahad
47576fa5a8 gccrs: [E0572] return is outside of function context
gcc/rust/ChangeLog:

	* typecheck/rust-hir-type-check-expr.cc (TypeCheckExpr::visit):
	called error function.

Signed-off-by: Muhammad Mahad <mahadtxt@gmail.com>
2024-01-16 18:56:04 +01:00
Owen Avery
c016d443b8 gccrs: Use MacroInvocLexerBase in MacroInvocLexer
gcc/rust/ChangeLog:

	* expand/rust-macro-invoc-lexer.cc
	(MacroInvocLexer::skip_token): Remove.
	* expand/rust-macro-invoc-lexer.h
	(class MacroInvocLexer): Extend MacroInvocLexerBase.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
2024-01-16 18:56:04 +01:00
Marc Poulhiès
58b49a65a3 gccrs: use tl::optional for macro transcribers
refs #2421.

gcc/rust/ChangeLog:

	* ast/rust-ast-fragment.cc (Fragment::create_empty): New.
	* ast/rust-ast-fragment.h (MacroTranscriberFunc): New.
	* ast/rust-macro.h (MacroRulesDefinition): Use MacroTranscriberFunc.
	* expand/rust-macro-builtins.cc
	(MacroBuiltin::builtin_transcribers): likewise.
	(MacroBuiltin::assert_handler): Return optional.
	(MacroBuiltin::file_handler): Likewise.
	(MacroBuiltin::column_handler): Likewise.
	(MacroBuiltin::include_bytes_handler): Likewise.
	(MacroBuiltin::include_str_handler): Likewise.
	(MacroBuiltin::compile_error_handler): Likewise.
	(MacroBuiltin::concat_handler): Likewise.
	(MacroBuiltin::env_handler): Likewise.
	(MacroBuiltin::cfg_handler): Likewise.
	(MacroBuiltin::include_handler): Likewise.
	(MacroBuiltin::line_handler): Likewise.
	(MacroBuiltin::stringify_handler): Likewise.
	(MacroBuiltin::sorry): Likewise.
	* expand/rust-macro-builtins.h (builtin_transcribers): Use
	MacroTranscriberFunc.
	(assert_handler): Return optional.
	(file_handler): Likewise.
	(column_handler): Likewise.
	(include_bytes_handler): Likewise.
	(include_str_handler): Likewise.
	(compile_error_handler): Likewise.
	(concat_handler): Likewise.
	(env_handler): Likewise.
	(cfg_handler): Likewise.
	(include_handler): Likewise.
	(line_handler): Likewise.
	(stringify_handler): Likewise.
	(sorry): Likewise.
	* expand/rust-macro-expand.cc (MacroExpander::expand_invoc):
	Adjust to transcribers returning optional.

Signed-off-by: Marc Poulhiès <dkm@kataplop.net>
2024-01-16 18:56:04 +01:00
Philip Herron
432cdee6a6 gccrs: Fix ICE by adding check for enum candidate's in TypePath resolution
Fixes #2479

gcc/rust/ChangeLog:

	* typecheck/rust-hir-trait-resolve.cc (TraitItemReference::resolve_item):
	always resolve the type even when its an a mandatory trait item
	* typecheck/rust-hir-type-check-type.cc (TypeCheckType::resolve_root_path):
	Add check for enum candidates otherwise you get undefined behaviour

gcc/testsuite/ChangeLog:

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

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
2024-01-16 18:56:04 +01:00
Raiki Tamura
f7b2e17682 gccrs: Add Unicode check for crate_name attributes
gcc/rust/ChangeLog:

	* lex/rust-codepoint.h: Add comment
	* lex/rust-lex.h: New method to get decoded characters
	* rust-session-manager.cc (validate_crate_name): Modify unicode check
	(rust_crate_name_validation_test): Add testcases
	* util/rust-unicode.h (RUST_UNICODE_H): New class Utf8String.
	(class Utf8String): New class.
	* util/rust-unicode.cc (binary_search_sorted_array): Add comment.
	(recursive_decomp_cano): Add comment.
	(recomp): Remove dead code.
	(dump_string): Removed.

gcc/testsuite/ChangeLog:

	* rust/compile/bad-crate-name.rs: Moved to...
	* rust/compile/bad-crate-name1.rs: ...here.
	* rust/compile/bad-crate-name2.rs: New test.

Signed-off-by: Raiki Tamura <tamaron1203@gmail.com>
2024-01-16 18:56:04 +01:00
Owen Avery
884dec3a42 gccrs: Add missing CHECKING_P guard to rust-unicode.cc
gcc/rust/ChangeLog:

	* util/rust-unicode.cc: Add CHECKING_P guard.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
2024-01-16 18:56:04 +01:00
Philip Herron
0610584d0d gccrs: fix ice when function is outside of context
Fixes #2477

gcc/rust/ChangeLog:

	* typecheck/rust-hir-type-check-expr.cc (TypeCheckExpr::visit):
	We need to check if a function context exists

gcc/testsuite/ChangeLog:

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

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
2024-01-16 18:56:03 +01:00
Philip Herron
6164ec07c6 gccrs: Begin enforcing Sized properly and support anti traits like ?Sized
Sized is implicitly applied to every generic type parameter apart from the
implicit Self type parameter on traits, as that would cause a recursive
bound and would make Traits unable to be appied to unsized types.

In order to keep everything happy this means we also need to support the
anti trait bound '?' so that Sized can be removed properly. The full Sized
rules are not completely implemented here. Slice's and Str's are currently
marked as Sized but there is a small regression here that looks like a more
general bug which should be fixed on its own as part of #2443. There is
a big testsuite update here to pull in the Sized lang item.

Note this lays the bound's ground work so we can start supporting Drop
trait properly which needs tackled very soon.

Fixes: #2375
Addresses: #2443

gcc/rust/ChangeLog:

	* expand/rust-proc-macro.cc (literal_from_string): update Lexer constructor
	(tokenstream_from_string): likewise
	* lex/rust-lex.cc (Lexer::Lexer): likewise
	* lex/rust-lex.h: pass through Linemap
	* parse/rust-cfg-parser.cc (parse_cfg_option): likewise
	* rust-session-manager.cc (Session::load_extern_crate): likewise
	* typecheck/rust-hir-trait-resolve.cc (TraitResolver::resolve_trait):
	dont apply Sized on self
	* typecheck/rust-hir-type-check-base.cc (TypeCheckBase::get_marker_predicate): new
	* typecheck/rust-hir-type-check-base.h: add prototype
	* typecheck/rust-hir-type-check-type.cc (TypeResolveGenericParam::Resolve): apply Sized
	(TypeResolveGenericParam::visit): likewise
	* typecheck/rust-hir-type-check-type.h: update prototypes
	* typecheck/rust-typecheck-context.cc: remove bad assertions
	* typecheck/rust-tyty-bounds.cc (TypeBoundsProbe::assemble_sized_builtin): cleanup
	(TypeCheckBase::get_predicate_from_bound): apply sized rules properly
	* util/rust-hir-map.cc (Mappings::lookup_trait_item_lang_item): helpers
	(Mappings::get_lang_item): likewise
	* util/rust-hir-map.h: likewise
	* util/rust-token-converter.cc (from_ident): update lexer ctor
	(from_punct): likewise

gcc/testsuite/ChangeLog:

	* rust/compile/bounds1.rs: Apply sized trait
	* rust/compile/canonical_paths1.rs: likewise
	* rust/compile/cast_generics.rs: likewise
	* rust/compile/closure_no_type_anno.rs: likewise
	* rust/compile/complex_qualified_path_in_expr.rs: likewise
	* rust/compile/const-issue1440.rs: likewise
	* rust/compile/const_generics_1.rs: likewise
	* rust/compile/const_generics_8.rs: likewise
	* rust/compile/derive_macro1.rs: likewise
	* rust/compile/derive_macro3.rs: likewise
	* rust/compile/derive_macro4.rs: likewise
	* rust/compile/derive_macro6.rs: likewise
	* rust/compile/expected_type_args2.rs: likewise
	* rust/compile/expected_type_args3.rs: likewise
	* rust/compile/generics1.rs: likewise
	* rust/compile/generics11.rs: likewise
	* rust/compile/generics12.rs: likewise
	* rust/compile/generics2.rs: likewise
	* rust/compile/generics3.rs: likewise
	* rust/compile/generics4.rs: likewise
	* rust/compile/generics6.rs: likewise
	* rust/compile/generics7.rs: likewise
	* rust/compile/generics8.rs: likewise
	* rust/compile/if_let_expr.rs: likewise
	* rust/compile/issue-1005.rs: likewise
	* rust/compile/issue-1019.rs: likewise
	* rust/compile/issue-1031.rs: likewise
	* rust/compile/issue-1034.rs: likewise
	* rust/compile/issue-1128.rs: likewise
	* rust/compile/issue-1129-2.rs: likewise
	* rust/compile/issue-1130.rs: likewise
	* rust/compile/issue-1131.rs: likewise
	* rust/compile/issue-1165.rs: likewise
	* rust/compile/issue-1173.rs: likewise
	* rust/compile/issue-1235.rs: likewise
	* rust/compile/issue-1237.rs: likewise
	* rust/compile/issue-1289.rs: likewise
	* rust/compile/issue-1383.rs: likewise
	* rust/compile/issue-1447.rs: likewise
	* rust/compile/issue-1589.rs: likewise
	* rust/compile/issue-1725-1.rs: likewise
	* rust/compile/issue-1725-2.rs: likewise
	* rust/compile/issue-1773.rs: likewise
	* rust/compile/issue-1786.rs: likewise
	* rust/compile/issue-1893.rs: likewise
	* rust/compile/issue-1901.rs: likewise
	* rust/compile/issue-1930.rs: likewise
	* rust/compile/issue-1981.rs: likewise
	* rust/compile/issue-2019-1.rs: likewise
	* rust/compile/issue-2019-2.rs: likewise
	* rust/compile/issue-2019-3.rs: likewise
	* rust/compile/issue-2036.rs: likewise
	* rust/compile/issue-2037.rs: likewise
	* rust/compile/issue-2070.rs: likewise
	* rust/compile/issue-2105.rs: likewise
	* rust/compile/issue-2106.rs: likewise
	* rust/compile/issue-2135.rs: likewise
	* rust/compile/issue-2136-1.rs: likewise
	* rust/compile/issue-2136-2.rs: likewise
	* rust/compile/issue-2139.rs: likewise
	* rust/compile/issue-2142.rs: likewise
	* rust/compile/issue-2165.rs: likewise
	* rust/compile/issue-2166.rs: likewise
	* rust/compile/issue-2190-1.rs: likewise
	* rust/compile/issue-2190-2.rs: likewise
	* rust/compile/issue-2195.rs: likewise
	* rust/compile/issue-2238.rs: likewise
	* rust/compile/issue-2304.rs: likewise
	* rust/compile/issue-850.rs: likewise
	* rust/compile/issue-855.rs: likewise
	* rust/compile/issue-925.rs: likewise
	* rust/compile/macro-issue1400.rs: likewise
	* rust/compile/macro20.rs: likewise
	* rust/compile/macro23.rs: likewise
	* rust/compile/macro40.rs: likewise
	* rust/compile/macro54.rs: likewise
	* rust/compile/name_resolution2.rs: likewise
	* rust/compile/name_resolution4.rs: likewise
	* rust/compile/nested_generic.rs: likewise
	* rust/compile/parse_associated_type_as_generic_arg.rs: likewise
	* rust/compile/parse_associated_type_as_generic_arg2.rs: likewise
	* rust/compile/parse_associated_type_as_generic_arg3.rs: likewise
	* rust/compile/parse_complex_generic_application.rs: likewise
	* rust/compile/parse_complex_generic_application2.rs: likewise
	* rust/compile/path_as_generic_arg.rs: likewise
	* rust/compile/privacy4.rs: likewise
	* rust/compile/privacy6.rs: likewise
	* rust/compile/sizeof-stray-infer-var-bug.rs: likewise
	* rust/compile/stmt_with_block_dot.rs: likewise
	* rust/compile/torture/associated_types1.rs: likewise
	* rust/compile/torture/forward_decl_5.rs: likewise
	* rust/compile/torture/generics1.rs: likewise
	* rust/compile/torture/generics10.rs: likewise
	* rust/compile/torture/generics11.rs: likewise
	* rust/compile/torture/generics12.rs: likewise
	* rust/compile/torture/generics13.rs: likewise
	* rust/compile/torture/generics14.rs: likewise
	* rust/compile/torture/generics15.rs: likewise
	* rust/compile/torture/generics16.rs: likewise
	* rust/compile/torture/generics17.rs: likewise
	* rust/compile/torture/generics18.rs: likewise
	* rust/compile/torture/generics19.rs: likewise
	* rust/compile/torture/generics2.rs: likewise
	* rust/compile/torture/generics20.rs: likewise
	* rust/compile/torture/generics21.rs: likewise
	* rust/compile/torture/generics22.rs: likewise
	* rust/compile/torture/generics23.rs: likewise
	* rust/compile/torture/generics24.rs: likewise
	* rust/compile/torture/generics25.rs: likewise
	* rust/compile/torture/generics26.rs: likewise
	* rust/compile/torture/generics27.rs: likewise
	* rust/compile/torture/generics28.rs: likewise
	* rust/compile/torture/generics29.rs: likewise
	* rust/compile/torture/generics3.rs: likewise
	* rust/compile/torture/generics30.rs: likewise
	* rust/compile/torture/generics31.rs: likewise
	* rust/compile/torture/generics32.rs: likewise
	* rust/compile/torture/generics4.rs: likewise
	* rust/compile/torture/generics5.rs: likewise
	* rust/compile/torture/generics6.rs: likewise
	* rust/compile/torture/generics7.rs: likewise
	* rust/compile/torture/generics8.rs: likewise
	* rust/compile/torture/generics9.rs: likewise
	* rust/compile/torture/intrinsics-2.rs: likewise
	* rust/compile/torture/intrinsics-6.rs: likewise
	* rust/compile/torture/intrinsics-7.rs: likewise
	* rust/compile/torture/intrinsics-8.rs: likewise
	* rust/compile/torture/issue-1024.rs: likewise
	* rust/compile/torture/issue-1075.rs: likewise
	* rust/compile/torture/issue-1432.rs: likewise
	* rust/compile/torture/issue-1555.rs: likewise
	* rust/compile/torture/issue-368.rs: likewise
	* rust/compile/torture/issue-808.rs: likewise
	* rust/compile/torture/issue-862.rs: likewise
	* rust/compile/torture/issue-893-2.rs: likewise
	* rust/compile/torture/issue-893.rs: likewise
	* rust/compile/torture/must_use2.rs: likewise
	* rust/compile/torture/nested_fn2.rs: likewise
	* rust/compile/torture/phantom_data.rs: likewise
	* rust/compile/torture/range-lang-item1.rs: likewise
	* rust/compile/torture/traits1.rs: likewise
	* rust/compile/torture/traits11.rs: likewise
	* rust/compile/torture/traits12.rs: likewise
	* rust/compile/torture/traits13.rs: likewise
	* rust/compile/torture/traits14.rs: likewise
	* rust/compile/torture/traits15.rs: likewise
	* rust/compile/torture/traits16.rs: likewise
	* rust/compile/torture/traits17.rs: likewise
	* rust/compile/torture/traits18.rs: likewise
	* rust/compile/torture/traits19.rs: likewise
	* rust/compile/torture/traits2.rs: likewise
	* rust/compile/torture/traits3.rs: likewise
	* rust/compile/torture/traits4.rs: likewise
	* rust/compile/torture/traits5.rs: likewise
	* rust/compile/torture/traits6.rs: likewise
	* rust/compile/torture/traits7.rs: likewise
	* rust/compile/torture/traits8.rs: likewise
	* rust/compile/torture/traits9.rs: likewise
	* rust/compile/torture/transmute-size-check-1.rs: likewise
	* rust/compile/torture/transmute1.rs: likewise
	* rust/compile/torture/uninit-intrinsic-1.rs: likewise
	* rust/compile/torture/utf8_identifiers.rs: likewise
	* rust/compile/traits1.rs: likewise
	* rust/compile/traits10.rs: likewise
	* rust/compile/traits11.rs: likewise
	* rust/compile/traits12.rs: likewise
	* rust/compile/traits2.rs: likewise
	* rust/compile/traits3.rs: likewise
	* rust/compile/traits4.rs: likewise
	* rust/compile/traits5.rs: likewise
	* rust/compile/traits6.rs: likewise
	* rust/compile/traits7.rs: likewise
	* rust/compile/traits8.rs: likewise
	* rust/compile/traits9.rs: likewise
	* rust/compile/type-bindings1.rs: likewise
	* rust/compile/unconstrained_type_param.rs: likewise
	* rust/compile/unsafe10.rs: likewise
	* rust/execute/torture/closure1.rs: likewise
	* rust/execute/torture/closure2.rs: likewise
	* rust/execute/torture/closure3.rs: likewise
	* rust/execute/torture/closure4.rs: likewise
	* rust/execute/torture/coercion1.rs: likewise
	* rust/execute/torture/coercion2.rs: likewise
	* rust/execute/torture/coercion3.rs: likewise
	* rust/execute/torture/copy_nonoverlapping1.rs: likewise
	* rust/execute/torture/derive_macro1.rs: likewise
	* rust/execute/torture/derive_macro3.rs: likewise
	* rust/execute/torture/derive_macro4.rs: likewise
	* rust/execute/torture/index1.rs: likewise
	* rust/execute/torture/issue-1120.rs: likewise
	* rust/execute/torture/issue-1133.rs: likewise
	* rust/execute/torture/issue-1198.rs: likewise
	* rust/execute/torture/issue-1232.rs: likewise
	* rust/execute/torture/issue-1249.rs: likewise
	* rust/execute/torture/issue-1436.rs: likewise
	* rust/execute/torture/issue-1496.rs: likewise
	* rust/execute/torture/issue-1720-2.rs: likewise
	* rust/execute/torture/issue-1720.rs: likewise
	* rust/execute/torture/issue-2052.rs: likewise
	* rust/execute/torture/issue-2179.rs: likewise
	* rust/execute/torture/issue-2180.rs: likewise
	* rust/execute/torture/issue-2236.rs: likewise
	* rust/execute/torture/issue-647.rs: likewise
	* rust/execute/torture/issue-845.rs: likewise
	* rust/execute/torture/issue-851.rs: likewise
	* rust/execute/torture/issue-858.rs: likewise
	* rust/execute/torture/macros23.rs: likewise
	* rust/execute/torture/macros28.rs: likewise
	* rust/execute/torture/method2.rs: likewise
	* rust/execute/torture/method3.rs: likewise
	* rust/execute/torture/method4.rs: likewise
	* rust/execute/torture/operator_overload_1.rs: likewise
	* rust/execute/torture/operator_overload_10.rs: likewise
	* rust/execute/torture/operator_overload_11.rs: likewise
	* rust/execute/torture/operator_overload_12.rs: likewise
	* rust/execute/torture/operator_overload_2.rs: likewise
	* rust/execute/torture/operator_overload_3.rs: likewise
	* rust/execute/torture/operator_overload_4.rs: likewise
	* rust/execute/torture/operator_overload_5.rs: likewise
	* rust/execute/torture/operator_overload_6.rs: likewise
	* rust/execute/torture/operator_overload_7.rs: likewise
	* rust/execute/torture/operator_overload_8.rs: likewise
	* rust/execute/torture/operator_overload_9.rs: likewise
	* rust/execute/torture/prefetch_data.rs: likewise
	* rust/execute/torture/ref-pattern2.rs: likewise
	* rust/execute/torture/slice-magic.rs: likewise
	* rust/execute/torture/slice-magic2.rs: likewise
	* rust/execute/torture/slice1.rs: likewise
	* rust/execute/torture/str-layout1.rs: likewise
	* rust/execute/torture/trait1.rs: likewise
	* rust/execute/torture/trait10.rs: likewise
	* rust/execute/torture/trait11.rs: likewise
	* rust/execute/torture/trait12.rs: likewise
	* rust/execute/torture/trait13.rs: likewise
	* rust/execute/torture/trait2.rs: likewise
	* rust/execute/torture/trait3.rs: likewise
	* rust/execute/torture/trait4.rs: likewise
	* rust/execute/torture/trait5.rs: likewise
	* rust/execute/torture/trait6.rs: likewise
	* rust/execute/torture/trait7.rs: likewise
	* rust/execute/torture/trait8.rs: likewise
	* rust/execute/torture/trait9.rs: likewise
	* rust/execute/torture/transmute1.rs: likewise
	* rust/execute/torture/wrapping_op1.rs: likewise
	* rust/execute/torture/wrapping_op2.rs: likewise
	* rust/link/generic_function_0.rs: likewise
	* rust/link/generic_function_1.rs: likewise
	* rust/compile/issue-2375.rs: New test.

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
2024-01-16 18:56:03 +01:00
Philip Herron
f84d52a517 gccrs: Track polarity in type bound predicate
Addresses #2443

gcc/rust/ChangeLog:

	* typecheck/rust-hir-path-probe.cc: track regular polarity
	* typecheck/rust-hir-trait-resolve.cc (TraitResolver::resolve_trait): likewise
	* typecheck/rust-hir-type-check-expr.cc (TypeCheckExpr::visit): likewise
	* typecheck/rust-hir-type-check-item.cc (TypeCheckItem::visit): likewise
	* typecheck/rust-tyty-bounds.cc (TypeCheckBase::get_predicate_from_bound): likewise
	(TypeBoundPredicate::TypeBoundPredicate): update ctor
	(TypeBoundPredicate::operator=): update copy assignment ctor
	(TypeBoundPredicate::error): update error node
	* typecheck/rust-tyty.h: add polarity field to predicate

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
2024-01-16 18:56:03 +01:00
Philip Herron
c533a11ae0 gccrs: Track trait bound polarity properly
Trait bounds can have three forms in Rust the regular trait bound, '!' the
negative trait bound to enforice that this trait must not be implmented and
'?' the anti trait bound to remove this bound. This patch extends our
Polarity enum to include the Anti trait bound and updates the HIR lowering
code to track this properly.

Addresses #2443

gcc/rust/ChangeLog:

	* hir/rust-ast-lower-item.cc (ASTLoweringItem::visit): use new BoundPolarity enum
	* hir/rust-ast-lower-type.cc (ASTLoweringTypeBounds::visit): likewise
	* hir/rust-hir-dump.cc (BoundPolarityString): new helper
	(Dump::visit): update hir dump
	* hir/tree/rust-hir-item.h (class ImplBlock): likewise
	* hir/tree/rust-hir-type.h (class TraitBound): likewise
	* hir/tree/rust-hir.cc (TraitBound::as_string): fix as string
	* util/rust-common.h (enum Polarity): add new anti bound
	(enum BoundPolarity): likewise
	* util/rust-hir-map.cc (Mappings::Mappings): update naming

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
2024-01-16 18:56:03 +01:00
Owen Avery
2b00b13d30 gccrs: Move Gcc_backend declaration to header file
gcc/rust/ChangeLog:

	* rust-backend.h: Include "rust-gcc.h".
	(class Gcc_backend): Move to ...
	* rust-gcc.cc (class Gcc_backend): ... here.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
2024-01-16 18:56:03 +01:00
Philip Herron
46a5df00ab gccrs: fix ICE when we have unimplemented/invalid trait items
When the resulting trait item is in an error state this means the
underlying fields will be null.

Fixes #2478

gcc/rust/ChangeLog:

	* typecheck/rust-hir-type-check-item.cc: add is_error check

gcc/testsuite/ChangeLog:

	* rust/compile/non_member_const.rs: add missing error message
	* rust/compile/issue-2478.rs: New test.

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
2024-01-16 18:56:03 +01:00
Raiki Tamura
4d63098451 gccrs: Add function for Unicode NFC normalization
gcc/rust/ChangeLog:

	* Make-lang.in: Add rust-unicode.o
	* rust-lang.cc (run_rust_tests): Add test.
	* rust-system.h: Include <array>
	* util/make-rust-unicode.py: Generater of rust-unicode-data.h.
	* util/rust-unicode-data.h: Auto-generated file.
	* util/rust-unicode.cc: New file.
	* util/rust-unicode.h: New file.

Signed-off-by: Raiki Tamura <tamaron1203@gmail.com>
2024-01-16 18:56:03 +01:00
Arthur Cohen
fa13cfd08a gccrs: error codes: Add rust_error_codes.def, refactor ErrorCode enum
gcc/rust/ChangeLog:

	* rust-diagnostics.cc: Rework `make_description` and `make_url` functions.
	* rust-diagnostics.h: Specify ErrorCode's underlying type,
	remove error_codes_strings table.
	* rust_error_codes.def: New file.
2024-01-16 18:56:03 +01:00
Owen Avery
886d56d0c5 gccrs: Remove Location typedef
gcc/rust/ChangeLog:

	* rust-location.h (typedef Location): Remove.

	* expand/rust-proc-macro.cc
	(register_callback): Replace Location constructor with UNDEF_LOCATION.

	* ast/rust-ast-collector.h: Replace Location with location_t.
	* checks/errors/privacy/rust-privacy-reporter.cc: Likewise.
	* checks/errors/privacy/rust-privacy-reporter.h: Likewise.
	* checks/errors/privacy/rust-pub-restricted-visitor.cc: Likewise.
	* checks/errors/privacy/rust-pub-restricted-visitor.h: Likewise.
	* checks/errors/rust-feature-gate.cc: Likewise.
	* checks/errors/rust-feature-gate.h: Likewise.
	* metadata/rust-imports.h: Likewise.
	* resolve/rust-ast-resolve-path.h: Likewise.
	* resolve/rust-name-resolver.h: Likewise.
	* rust-backend.h: Likewise.
	* rust-diagnostics.h: Likewise.
	* rust-gcc.cc: Likewise.
	* rust-linemap.h: Likewise.
	* util/rust-attributes.cc: Likewise.
	* util/rust-hir-map.cc: Likewise.
	* util/rust-hir-map.h: Likewise.
	* util/rust-token-converter.cc: Likewise.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
2024-01-16 18:56:03 +01:00
Owen Avery
9cc353d75a gccrs: Replace usages of Location with location_t in typechecking
gcc/rust/ChangeLog:

	* typecheck/rust-autoderef.cc: Replace Location with location_t.
	* typecheck/rust-coercion.cc: Likewise.
	* typecheck/rust-coercion.h: Likewise.
	* typecheck/rust-hir-path-probe.h: Likewise.
	* typecheck/rust-hir-trait-reference.cc: Likewise.
	* typecheck/rust-hir-trait-resolve.cc: Likewise.
	* typecheck/rust-hir-type-check-base.cc: Likewise.
	* typecheck/rust-hir-type-check-expr.cc: Likewise.
	* typecheck/rust-hir-type-check-expr.h: Likewise.
	* typecheck/rust-hir-type-check-implitem.cc: Likewise.
	* typecheck/rust-hir-type-check-item.cc: Likewise.
	* typecheck/rust-hir-type-check-path.cc: Likewise.
	* typecheck/rust-hir-type-check-pattern.cc: Likewise.
	* typecheck/rust-hir-type-check-stmt.cc: Likewise.
	* typecheck/rust-hir-type-check-struct.cc: Likewise.
	* typecheck/rust-hir-type-check-type.cc: Likewise.
	* typecheck/rust-hir-type-check-type.h: Likewise.
	* typecheck/rust-type-util.cc: Likewise.
	* typecheck/rust-type-util.h: Likewise.
	* typecheck/rust-tyty-bounds.cc: Likewise.
	* typecheck/rust-tyty-call.cc: Likewise.
	* typecheck/rust-tyty-call.h: Likewise.
	* typecheck/rust-tyty-cmp.h: Likewise.
	* typecheck/rust-tyty-subst.cc: Likewise.
	* typecheck/rust-tyty-subst.h: Likewise.
	* typecheck/rust-tyty.cc: Likewise.
2024-01-16 18:56:02 +01:00
Muhammad Mahad
55a3049525 gccrs: [E0571] break with argument in non-loop loop
Refactored error message similiar to rustc
& called error function.

gcc/rust/ChangeLog:

	* typecheck/rust-hir-type-check-expr.cc (TypeCheckExpr::visit):
	refactored error message & called error function.

gcc/testsuite/ChangeLog:

	* rust/compile/break2.rs: Modified file to pass test case.
	* rust/compile/break_with_value_inside_loop.rs: New test.

Signed-off-by: Muhammad Mahad <mahadtxt@gmail.com>
2024-01-16 18:56:02 +01:00
Pierre-Emmanuel Patry
0680907b3b gccrs: proc_macro: Add literal_from_string callback
The function to get a literal from a string missed an implementation.
It did require a conversion function to achieve it, now that callback
system has been merged this function can be easily implemented.

gcc/rust/ChangeLog:

	* expand/rust-proc-macro.cc (literal_from_string): Add callback
	function.
	(load_macros_array): Likewise.

libgrust/ChangeLog:

	* libproc_macro/literal.cc (Literal__from_string): Add
	implementation with call to constructor.
	(Literal::make_literal): Add new constructor which calls the
	callback.
	* libproc_macro/literal.h: Add new constructor's
	prototype.
	* libproc_macro/proc_macro.cc (bridge_is_available):
	Change symbol name to match convention.
	* libproc_macro/registration.h: Add lit_from_str
	symbol.
	* libproc_macro/tokenstream.cc (TokenStream::make_tokenstream):
	Change symbol name to disambiguate with literal from string.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 18:56:02 +01:00
Pierre-Emmanuel Patry
ff773b9030 gccrs: converter: Move literal conversion out
The literal conversion code could be used for the literal_from_string
callback, this means we should move it out of the function in it's own
function. This involves a new switch, which is quite sad but we're not
yet at a performance profiling phase, there may be lower hanging fruits.

gcc/rust/ChangeLog:

	* util/rust-token-converter.cc (handle_suffix): Rework function
	to make it work with the new literal conversion function.
	(convert_literal): Add a new function to convert to a proc macro
	literal from a literal tokenptr. The function will abort if the
	pointer does not point to a literal.
	(convert): Add call to convert literal for every literal case.
	* util/rust-token-converter.h (convert_literal): Add public
	prototype.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 18:56:02 +01:00
Pierre-Emmanuel Patry
6d1adb5c39 gccrs: Move callbacked function in a new namespace
Move the function registered as a callback in a new anonymous namespace
in order to group every callback in the future under the same namespace.

gcc/rust/ChangeLog:

	* expand/rust-proc-macro.cc: Remove static modifier and move to
	an anonymous namespace.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 18:56:02 +01:00
Muhammad Mahad
55f8b63ab3 gccrs: New Error Code Framework
Updated ErrorCode struct to enum class to enforce proper
error codes, similiar to rustc. For converting the enum
to the respective error code, I used a map and updated
make_description & make_url function accordingly and
also removes the memory leak from the previous frame-
work. Also, added macro to safely convert the enum
number to string.

gcc/rust/ChangeLog:

	* backend/rust-compile-intrinsic.cc (Intrinsics::compile):
	Formatted according to enum class.
	* checks/errors/rust-feature-gate.cc (FeatureGate::gate): likewise.
	* checks/errors/rust-unsafe-checker.cc (check_unsafe_call): likewise.
	* hir/rust-ast-lower-base.cc (struct_field_name_exists): likewise.
	* resolve/rust-ast-resolve-expr.cc (ResolveExpr::visit): likewise.
	* resolve/rust-ast-resolve-path.cc (ResolvePath::resolve_path):
	likewise.
	* resolve/rust-ast-resolve-pattern.cc (PatternDeclaration::go): likewise.
	(PatternDeclaration::add_new_binding): likewise.
	* resolve/rust-ast-resolve-type.cc (ResolveRelativeTypePath::go): likewise.
	* resolve/rust-ast-verify-assignee.h: likewise.
	* rust-diagnostics.cc: updated make_desc & url function for enum class.
	* rust-diagnostics.h (struct ErrorCode): removed struct to switch to enum.
	(enum class): Switched from errorcode struct to enum class.
	(XSTR): Macro for converting enum to string.
	(STR): macro Used by XSTR for converting to string.
	(ERROR_CODE): macro used by map for check.
	(TABLE_TO_MAP): macro used by map for check
	* typecheck/rust-casts.cc (TypeCastRules::emit_cast_error):
	Formatted according to enum class.
	* typecheck/rust-hir-path-probe.h: likewise.
	* typecheck/rust-hir-type-check-expr.cc (TypeCheckExpr::visit): likewise.
	* typecheck/rust-hir-type-check-implitem.cc (TypeCheckTopLevelExternItem::visit):
	likewise.
	(TypeCheckImplItemWithTrait::visit): likewise.
	* typecheck/rust-hir-type-check-item.cc: likewise.
	* typecheck/rust-hir-type-check-pattern.cc (TypeCheckPattern::visit): likewise.
	(emit_invalid_field_error): likewise.
	* typecheck/rust-hir-type-check-struct.cc (TypeCheckStructExpr::resolve): likewise.
	* typecheck/rust-tyty-call.cc (emit_unexpected_argument_error): likewise.
	(TypeCheckCallExpr::visit): likewise.
	* typecheck/rust-tyty-subst.cc (SubstitutionRef::get_mappings_from_generic_args):
	likewise.
	* typecheck/rust-tyty.cc (BaseType::bounds_compatible): likewise.

Signed-off-by: Muhammad Mahad <mahadtxt@gmail.com>
2024-01-16 18:56:02 +01:00
Pierre-Emmanuel Patry
ce7f0df47e gccrs: Add multiple tests for non root proc macro
Add multiple tests to prevent regressions on procedural macros errors
when one is declared outside of the crate's top level.

gcc/testsuite/ChangeLog:

	* rust/compile/proc_macro_attribute_non_root_function.rs: New test.
	* rust/compile/proc_macro_attribute_non_root_method.rs: New test.
	* rust/compile/proc_macro_attribute_non_root_module.rs: New test.
	* rust/compile/proc_macro_derive_non_root_function.rs: New test.
	* rust/compile/proc_macro_derive_non_root_method.rs: New test.
	* rust/compile/proc_macro_derive_non_root_module.rs: New test.
	* rust/compile/proc_macro_non_root_function.rs: New test.
	* rust/compile/proc_macro_non_root_method.rs: New test.
	* rust/compile/proc_macro_non_root_module.rs: New test.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 18:56:02 +01:00
Pierre-Emmanuel Patry
b05d874fc5 gccrs: Check proc_macro attributes on non root functions
Check proc_macro, proc_macro_attribute and proc_macro_derive attributes
on non root functions, emit an error when one is found.

gcc/rust/ChangeLog:

	* util/rust-attributes.cc (check_proc_macro_non_root): Add
	function to emit this specific error.
	(AttributeChecker::visit): Modify visitor to propagate to some
	containers that were not handled correctly.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 18:56:02 +01:00
Owen Avery
96e4e5d27e gccrs: Replace Location with location_t in unnamed function parameters
gcc/rust/ChangeLog:

	* backend/rust-compile-base.h: Replace Location with location_t.
	* metadata/rust-imports.h: Likewise.
	* resolve/rust-name-resolver.cc: Likewise.
	* resolve/rust-name-resolver.h: Likewise.
	* rust-backend.h: Likewise.
	* rust-gcc.cc: Likewise.
	* rust-gcc.h: Likewise.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
2024-01-16 18:56:02 +01:00