Commit graph

207534 commits

Author SHA1 Message Date
Pierre-Emmanuel Patry
90effeedc4 gccrs: libproc_macro: Change constructor in ffistring
The "new" constructor wasn't fitting it's usage well.

libgrust/ChangeLog:

	* libproc_macro/rust/bridge/ffistring.rs: Implement
	From trait for FFIString.
	* libproc_macro/rust/bridge/literal.rs: Change
	constructor call.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 18:37:20 +01:00
Pierre-Emmanuel Patry
9fc94c1562 gccrs: libproc_macro: Copy ffistring data from source
Data from source pointer were not copied correctly in the ffistring
constructor.

libgrust/ChangeLog:

	* libproc_macro/ffistring.cc (FFIString::make_ffistring):
	Add copy from source pointer.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 18:37:20 +01:00
Pierre-Emmanuel Patry
4689998556 gccrs: libproc_macro: Remove has_suffix attribute
This variable was redundant with the empty string representation and
may have lead to desync between both.

libgrust/ChangeLog:

	* libproc_macro/literal.h: Remove has_suffix member
	attribute from Literal.
	* libproc_macro/literal.cc: Update constructors.
	* libproc_macro/rust/bridge/literal.rs: Remove
	has_suffix attribute from Literal.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 18:37:20 +01:00
Pierre-Emmanuel Patry
f730dff173 gccrs: converter: Merge dispatch into one function
Floating point and integer dispatch now have almost the same behavior,
their code could therefore be merged.

gcc/rust/ChangeLog:

	* util/rust-token-converter.cc (dispatch_float_literals): Remove
	function.
	(handle_suffix): Rename old dispatch and add one LitKind
	argument.
	(dispatch_integer_literals): Remove function.
	(convert): Change call from dispatch to suffix handler.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 18:37:20 +01:00
Pierre-Emmanuel Patry
10c9b9f0cc gccrs: libproc_macro: Change cpp literal representation
Change the literal representation on cpp side to match the new one in
rust. This means FFIString had to be implemented on cpp side. A few
helper functions has also been introduced.

libgrust/ChangeLog:

	* libproc_macro/Makefile.am: Add ffistring unit to
	compiled objects list.
	* libproc_macro/Makefile.in: Regenerate.
	* libproc_macro/literal.cc (Literal::drop): Change with
	a call to ffistring drop function.
	(Literal::make_literal): Add new helper constructor
	(Literal__drop): Remove this function.
	(Literal__string): Likewise.
	(Literal__byte_string): Likewise.
	(Literal__from_string): Moved this function.
	(Literal::make_unsigned): Changed the constructor to match the
	new layout.
	(Literal::make_signed): Likewise.
	(Literal::clone): Reimplement th eclone function.
	(Literal::make_u8): Changed the constructor, make suffixed by
	default.
	(Literal::make_u16): Likewise.
	(Literal::make_u32): Likewise.
	(Literal::make_u64): Likewise.
	(Literal::make_i8): Likewise.
	(Literal::make_i16): Likewise.
	(Literal::make_i32): Likewise.
	(Literal::make_i64): Likewise.
	(Literal::make_string): Likewise.
	(Literal::make_byte_string): Likewise.
	(Literal::make_f32): Likewise.
	(Literal::make_f64): Likewise.
	(Literal::make_char): Likewise.
	(Literal::make_usize): Likewise.
	(Literal::make_isize): Likewise.
	(LitKind::make_byte): Add new helper constructor to avoid having
	to set the payload value.
	(LitKind::make_char): Likewise.
	(LitKind::make_integer): Likewise.
	(LitKind::make_float): Likewise.
	(LitKind::make_str): Likewise.
	(LitKind::make_str_raw): Add a new helper constructor which
	takes the payload value as an argument.
	(LitKind::make_byte_str): Add new helper constructor to avoid
	mistakes with payload value.
	(LitKind::make_byte_str_raw): Add a new helper constructor which
	takes the payload value as an argument.
	* libproc_macro/literal.h: Add new functions prototype.
	(enum UnsignedTag): Removed because it is now unused.
	(struct Payload128): Likewise.
	(union UnsignedPayload): Likewise.
	(struct Unsigned): Likewise.
	(enum SignedTag): Likewise.
	(union SignedPayload): Likewise.
	(struct Signed): Likewise.
	(enum LiteralTag): Likewise.
	(enum LitKindTag): Likewise.
	(struct StringPayload): Likewise.
	(struct ByteStringPayload): Likewise.
	(union LitKindPayload): Likewise.
	(struct UnsignedSuffixPayload): Likewise.
	(struct LitKind): Add new literal kind struct representation to
	match the enum on rust side.
	(struct SignedSuffixPayload): Removed because now unused.
	(struct UsizePayload): Likewise.
	(struct IsizePayload): Likewise.
	(struct Float32Payload): Likewise.
	(struct Float64Payload): Likewise.
	(union LiteralPayload): Likewise.
	(struct Literal): Changed the internals of the structure.
	(Literal__drop): Removed the drop function fom the c interface.
	(Literal__string): Removed unused function.
	(Literal__byte_string): Removed unused function.
	* libproc_macro/ffistring.cc: New file.
	* libproc_macro/ffistring.h: New file.

gcc/rust/ChangeLog:

	* lex/rust-token.h: Implement hash for token id enumeration.
	* util/rust-token-converter.cc (dispatch_float_literals): Update
	to new internals.
	(dispatch_integer_literals): Likewise.
	(convert): Likewise.
	(string_literal): Remove function.
	(byte_string_literal): Likewise.
	(unsigned_literal): Likewise.
	(signed_literal): Likewise.
	(from_literal): Update with new internals.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 18:37:19 +01:00
Pierre-Emmanuel Patry
5605333c90 gccrs: libproc_macro: Change rust literal internals
Rust interface literal internals were taking a type and storing that
type. This lead to multiple problems such as various conversion from
string to int/float/other type as well as dead end on undetermined types
(type checker runs at a later stage).

libgrust/ChangeLog:

	* libproc_macro/rust/bridge.rs: Add ffistring module.
	* libproc_macro/rust/bridge/literal.rs: Rework type
	internals.
	* libproc_macro/rust/bridge/ffistring.rs: New file.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 18:37:19 +01:00
Owen Avery
842a8307ca gccrs: Add AST::AttrInputMacro
gcc/rust/ChangeLog:

	* ast/rust-ast-dump.cc
	(Dump::visit): Add AttrInputMacro visitor.
	* ast/rust-ast-dump.h:
	(Dump::visit): Likewise.
	* ast/rust-ast-full-decls.h
	(class AttrInputMacro): New.
	* ast/rust-ast-collector.cc
	(TokenCollector::visit):
	Add and call out to AttrInputMacro visitor.
	* ast/rust-ast-collector.h:
	(TokenCollector::visit): Add AttrInputMacro visitor.
	* ast/rust-ast-visitor.h:
	(ASTVisitor::visit): Likewise.
	* ast/rust-ast.cc
	(AttrInputMacro::accept_vis): New.
	(AttrInputMacro::as_string): New.
	(AttrInputMacro::AttrInputMacro): New.
	(AttrInputMacro::operator=): New.
	* ast/rust-ast.h:
	(AttrInput::AttrInputType::MACRO): New.
	* ast/rust-expr.h
	(class AttrInputMacro): New.
	* checks/errors/rust-feature-gate.h:
	(FeatureGate::visit): Add AttrInputMacro visitor.
	* expand/rust-cfg-strip.cc
	(CfgStrip::visit): Likewise.
	* expand/rust-cfg-strip.h:
	(CfgStrip::visit): Likewise.
	* expand/rust-expand-visitor.cc
	(ExpandVisitor::visit): Likewise.
	* expand/rust-expand-visitor.h:
	(ExpandVisitor::visit): Likewise.
	* hir/rust-ast-lower-base.cc
	(ASTLoweringBase::visit): Likewise.
	* hir/rust-ast-lower-base.h:
	(ASTLoweringBase::visit): Likewise.
	* resolve/rust-ast-resolve-base.cc
	(ResolverBase::visit): Likewise.
	* resolve/rust-ast-resolve-base.h:
	(ResolverBase::visit): Likewise.
	* resolve/rust-early-name-resolver.cc
	(EarlyNameResolver::visit): Likewise.
	* resolve/rust-early-name-resolver.h:
	(EarlyNameResolver::visit): Likewise.
	* util/rust-attributes.cc
	(AttributeChecker::visit): Likewise.
	(check_doc_attribute): Handle AttrInputType::MACRO.
	* util/rust-attributes.h:
	(AttributeChecker::visit): Add AttrInputMacro visitor.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
2024-01-16 18:37:19 +01:00
Owen Avery
215925bccc gccrs: Make MacroInvocation cloning public
gcc/rust/ChangeLog:

	* ast/rust-macro.h
	(MacroInvocation::clone_macro_invocation_impl): Make public.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
2024-01-16 18:37:19 +01:00
Owen Avery
3bbc4ca198 gccrs: Allow hashing Optional<T>
gcc/rust/ChangeLog:

	* util/rust-optional.h
	(struct std::hash<Optional<T>>): New.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
2024-01-16 18:37:19 +01:00
Owen Avery
122f519ceb gccrs: Improve Optional<T&> implementation
gcc/rust/ChangeLog:

	* util/rust-optional.h
	(class Optional<T&>): Use pointers internally.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
2024-01-16 18:37:19 +01:00
Arthur Cohen
ec43b2ee8f gccrs: dump: Dump TupleIndexExprs
gcc/rust/ChangeLog:

	* ast/rust-ast-dump.cc (Dump::visit): Implement dump for
	`TupleIndexExpr`.
2024-01-16 18:37:19 +01:00
Owen Avery
7c31757191 gccrs: Change return type of token_id_keyword_string
gcc/rust/ChangeLog:

	* lex/rust-token.cc
	(token_id_keyword_string): Return std::string reference.
	* lex/rust-token.h
	(token_id_keyword_string): Return std::string reference.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
2024-01-16 18:37:19 +01:00
Matthew Jasper
48408712cc gccrs: Fix parsing of block expressions followed by .
`{ ... }.f;` is parsed as a single statement in rust. This means that we can't
determine whether an expression statement will need a semicolon terminator
until we finish parsing it. To handle this we change expression parsing to
check for this case by inspecting the expression returned from null_denotation
and looking ahead for a `.` or `?` token.

gcc/rust/ChangeLog:

	* ast/rust-ast.h (Expr::as_expr_without_block): Remove.
	(Expr::set_outer_attrs): Make public in base class.
	* expand/rust-macro-expand.cc:
	Add fixme comment for pre-existing bug.
	* hir/tree/rust-hir.h: Remove Expr::as_expr_without_block.
	* parse/rust-parse-impl.h (Parser::parse_lifetime): Use lifetime_from_token.
	(Parser::lifetime_from_token): New method.
	(Parser::null_denotation): Handle labelled loop expressions and for loop expressions.
	(Parser::parse_loop_label): Make initial token a parameter.
	(Parser::parse_labelled_loop_expr): Likewise.
	(Parser::parse_for_loop_expr): Allow FOR token to already be skipped.
	(Parser::parse_expr): Handle expr_can_be_stmt.
	(Parser::parse_expr_with_block): Remove.
	(Parser::parse_expr_stmt_with_block): Remove.
	(Parser::parse_expr_stmt_without_block): Remove.
	(Parser::parse_expr_without_block): Remove.
	(Parser::parse_stmt_or_expr_with_block): Remove.
	(Parser::parse_expr_stmt): Use parse_expr directly.
	(Parser::parse_match_expr): Likewise.
	(Parser::parse_stmt): Use parse_expr_stmt in more cases.
	(Parser::parse_stmt_or_expr):
	Rename from parse_stmt_or_expr_without_block, use parse_expr directly.
	(Parser::parse_block_expr): Update error message.
	* parse/rust-parse.h: Update declarations.

gcc/testsuite/ChangeLog:

	* rust/compile/for_expr.rs: New test.
	* rust/compile/issue-407-2.rs: Update compiler output.
	* rust/compile/issue-407.rs: Update compiler output.
	* rust/compile/issue-867.rs: Update compiler output.
	* rust/compile/issue-2189.rs: New test.
	* rust/compile/macro_call_statement.rs: New test.
	* rust/compile/stmt_with_block_dot.rs: New test.
	* rust/compile/torture/loop8.rs: New test.

Signed-off-by: Matthew Jasper <mjjasper1@gmail.com>
2024-01-16 18:37:19 +01:00
Matthew Jasper
9e9ee593cf gccrs: ast: Remove ExprStmtWithBlock / ExprStmtWithoutBlock distinction
This distinction isn't very helpful and makes correct parsing harder.

gcc/rust/ChangeLog:

	* ast/rust-ast-full-decls.h (class ExprStmtWithoutBlock): Remove.
	(class ExprStmtWithBlock): Remove.
	* ast/rust-stmt.h (class ExprStmtWithoutBlock): Remove.
	(class ExprStmtWithBlock): Remove.
	(class ExprStmt):
	Make non-abstract, add common functionality from removed base classes.
	* ast/rust-ast.h: Move to_stmt to base class.
	* ast/rust-ast.cc (ExprStmtWithBlock::as_string): Remove.
	* ast/rust-macro.h: Use new signature for to_stmt.
	(ExprStmt::as_string): New method.
	(ExprStmtWithoutBlock::as_string): Remove.
	(BlockExpr::strip_tail_expr): Update for removed classes.
	(ExprStmtWithoutBlock::accept_vis): Remove.
	(ExprStmtWithBlock::accept_vis): Remove.
	(ExprStmt::accept_vis): New method.
	* ast/rust-ast-dump.cc (Dump::visit): Update for removed classes.
	* ast/rust-ast-dump.h: Likewise.
	* ast/rust-ast-collector.h: Likewise.
	* ast/rust-ast-collector.cc (TokenStream::visit): Likewise.
	* ast/rust-ast-visitor.h: Likewise.
	* checks/errors/rust-feature-gate.h: Likewise.
	* expand/rust-expand-visitor.cc (ExpandVisitor::visit): Likewise.
	* expand/rust-expand-visitor.h: Likewise.
	* expand/rust-cfg-strip.cc (CfgStrip::visit): Likewise.
	* expand/rust-cfg-strip.h: Likewise.
	* hir/rust-ast-lower-base.cc (ASTLoweringBase::visit): Likewise.
	* hir/rust-ast-lower-base.h: Likewise.
	* hir/rust-ast-lower-stmt.cc (ASTLoweringStmt::visit): Likewise.
	* hir/rust-ast-lower-stmt.h: Likewise.
	* util/rust-attributes.cc (AttributeChecker::visit): Likewise.
	* util/rust-attributes.h: Likewise.
	* resolve/rust-ast-resolve-base.cc (ResolverBase::visit): Likewise.
	* resolve/rust-ast-resolve-base.h: Likewise.
	* resolve/rust-ast-resolve-stmt.h: Likewise.
	* resolve/rust-early-name-resolver.cc (EarlyNameResolver::visit):
	Likewise.
	* resolve/rust-early-name-resolver.h: Likewise.
	* parse/rust-parse-impl.h (Parser::parse_match_expr): Likewise.
	(Parser::parse_stmt_or_expr_without_block): Likewise.
	* parse/rust-parse.h: Likewise.

Signed-off-by: Matthew Jasper <mjjasper1@gmail.com>
2024-01-16 18:37:18 +01:00
Owen Avery
2aeff9ce08 gccrs: Handle keywords in macro fragments
gcc/rust/ChangeLog:

	* lex/rust-token.cc
	(token_id_is_keyword): New.
	(token_id_keyword_string): New.
	* lex/rust-token.h
	(token_id_is_keyword): New.
	(token_id_keyword_string): New.
	* expand/rust-macro-expand.cc
	(MacroExpander::match_fragment): Match keywords for ident fragment.
	* parse/rust-parse-impl.h
	(Parser::parse_identifier_or_keyword_token): Add.
	* parse/rust-parse.h
	(Parser::parse_identifier_or_keyword_token): Add.

gcc/testsuite/ChangeLog:

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

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
2024-01-16 18:37:18 +01:00
Arthur Cohen
8769b4900f gccrs: Address invalid little-endian-only testcases
gcc/testsuite/ChangeLog:

	* rust/compile/const-issue1440.rs: Remove LE conditional compilation.
	* rust/compile/torture/issue-1432.rs: Likewise.
2024-01-16 18:37:18 +01:00
Pierre-Emmanuel Patry
7673702396 gccrs: converter: Fix suffix condition
The suffix condition was wrong, the code was assigning a suffix to
unsuffixed literals. The literals length equals the end of digit
parsing position  means there is no suffix.

gcc/rust/ChangeLog:

	* util/rust-token-converter.cc (dispatch_float_literals): Invert
	suffix condition.
	(dispatch_integer_literals): Likewise.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 18:37:18 +01:00
Pierre-Emmanuel Patry
e7d105546b gccrs: converter: Fix some styling issues
Fix multiple issues regarding style around loops and conditions with one
single element.

gcc/rust/ChangeLog:

	* util/rust-token-converter.cc (convert): Fix style.
	(from_ident): Likewise.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 18:37:18 +01:00
Pierre-Emmanuel Patry
d0661bf8c9 gccrs: converter: Make converter input immutable
Inputs of the converter are never changed and may thus be qualified as
const.

gcc/rust/ChangeLog:

	* util/rust-token-converter.cc (dispatch_float_literals): Make
	input immutable.
	(dispatch_integer_literals): Likewise.
	(convert): Likewise.
	* util/rust-token-converter.h (convert): Likewise.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 18:37:18 +01:00
Pierre-Emmanuel Patry
3480ea7a05 gccrs: converter: Add Ident conversions
Add the implementation to convert an Ident structure back to a token.

gcc/rust/ChangeLog:

	* util/rust-token-converter.cc (from_tokenstream): Add
	conversion of Ident structures.
	(from_ident): Likewise.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 18:37:18 +01:00
Pierre-Emmanuel Patry
1346d20dd5 gccrs: converter: Convert literals back to tokens
Add the implementation of the function to convert Literal back to
tokens. Also change the function signature to accept const.

gcc/rust/ChangeLog:

	* util/rust-token-converter.cc (from_literal): Add function
	implementation.
	(string_literal): String literal specific handler.
	(byte_string_literal): Byte string specific handler.
	(unsigned_literal): Unsigned literal specific handler.
	(signed_literal): Signed literal specific handler.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 18:37:18 +01:00
Pierre-Emmanuel Patry
449d3f5793 gccrs: converter: Add punct conversion function
Add the implementation of the Punct conversion function to tokens.

gcc/rust/ChangeLog:

	* util/rust-token-converter.cc (from_punct): Add conversion
	implementation.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 18:37:18 +01:00
Pierre-Emmanuel Patry
95103ba9cd gccrs: converter: Const conversion to tokenstream
Make the conversion to tokenstream accept a const pointer vector instead
of a simple pointer vector because no changes are made to the original
tokens.

gcc/rust/ChangeLog:

	* util/rust-token-converter.cc (dispatch_float_literals): Accept
	const_TokenPtr instead of TokenPtr.
	(dispatch_integer_literals): Likewise.
	(convert): Accept vector of const_TokenPtr instead of a vector
	of TokenPtr.
	* util/rust-token-converter.h (convert): Likewise.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 18:37:17 +01:00
Pierre-Emmanuel Patry
2099a757e2 gccrs: converter: Return a vector to const pointers
We do not need mutability on the output vector. Also add an accumulator
for punct tokens.

gcc/rust/ChangeLog:

	* util/rust-token-converter.cc (from_tokenstream): Add vector
	for joined punct accumulation.
	(from_ident): Accept const pointer vector.
	(from_literal): Likewise.
	(from_punct): Likewise.
	(from_group): Likewise.
	(from_tokentree): Likewise.
	(convert): Likewise.
	* util/rust-token-converter.h (convert): Likewise.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 18:37:17 +01:00
Pierre-Emmanuel Patry
ab0e27412e gccrs: converter: Add from_tokentree function
Add the from_tokentree function which converts a tokentree to it's
token representation. This function was previously inlined in the
from_tokenstream function but I wanted to keep things clear and
coherent.

gcc/rust/ChangeLog:

	* util/rust-token-converter.cc (from_tokenstream): Add call to
	from_tokentree.
	(from_tokentree): Add implementation, from the from_tokenstream
	function.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 18:37:17 +01:00
Pierre-Emmanuel Patry
c3462989ec gccrs: converter: Add group conversion implementation
Add conversion of a given Group reference.

gcc/rust/ChangeLog:

	* util/rust-token-converter.cc (from_punct): Add group
	conversion.
	(from_group): Likewise.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 18:37:17 +01:00
Pierre-Emmanuel Patry
97612931b1 gccrs: converter: Add TokenStream conversion function
Add a tokenstream conversion function dispatching to inner elements

gcc/rust/ChangeLog:

	* util/rust-token-converter.cc (to_tokenstream): Change function
	name from to_tokenstream to convert.
	(convert): Likewise.
	(from_tokenstream): Add tokenstream handler.
	(from_ident): Add empty function.
	(from_literal): Likewise.
	(from_punct): Likewise.
	(from_group): Likewise.
	* util/rust-token-converter.h (to_tokenstream): Change function
	name from to_tokenstream to convert.
	(convert): Likewise.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 18:37:17 +01:00
Pierre-Emmanuel Patry
8adfcf7121 gccrs: converter: Remove redundant variable
Since the introduction of this variable the code has changed and no
value order preservation is required anymore, the comparison can be done
inline.

gcc/rust/ChangeLog:

	* util/rust-token-converter.cc (dispatch_float_literals): Remove
	suffixed temporary variable.
	(dispatch_integer_literals): Likewise.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 18:37:17 +01:00
Pierre-Emmanuel Patry
ec5f8090a1 gccrs: ast: Move token converter out of ast module
Move the token vector to tokenstream converter out of the TokenCollector
class. This code is not exactly related to the token collection and the
code would be clearer with this rather lengthy conversion split on it's
own.

gcc/rust/ChangeLog:

	* Make-lang.in: Add new rust-token-converter file.
	* ast/rust-ast-collector.cc (pop_group): Function moved from
	TokenCollector.
	(dispatch_float_literals): Likewise.
	(dispatch_integer_literals): Likewise.
	(TokenCollector::collect): Removed function.
	* ast/rust-ast-collector.h: Removed function prototype.
	* util/rust-token-converter.cc: New file.
	* util/rust-token-converter.h: New file.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 18:37:17 +01:00
Pierre-Emmanuel Patry
a56f04dec3 gccrs: ast: Rename header guard
The header guard did not match the file name anymore.

gcc/rust/ChangeLog:

	* ast/rust-ast-collector.h (RUST_AST_TOKENSTREAM_H): Rename
	headerguard from RUST_AST_TOKENSTREAM_H ...
	(RUST_AST_COLLECTOR_H): ... to RUST_AST_COLLECTOR_H.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 18:37:17 +01:00
Pierre-Emmanuel Patry
82387cd8a0 gccrs: ast: Rename rust-ast-tokenstream file
The file does not contain any TokenStream declaration anymore and thus
should be named more appropriately.

gcc/rust/ChangeLog:

	* Make-lang.in: Change file name.
	* ast/rust-ast-tokenstream.cc: Moved to...
	* ast/rust-ast-collector.cc: ...here.
	* ast/rust-ast-tokenstream.h: Moved to...
	* ast/rust-ast-collector.h: ...here.
	* rust-session-manager.cc: Change header name.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 18:37:17 +01:00
Pierre-Emmanuel Patry
71249c646b gccrs: ast: Rename TokenStream in the AST module
Rename the TokenStream class to TokenCollector as it may induce errors
in the future as it is not a tokenstream as defined by the rust
interface. Furthermore this change match more closely the actual behavior
of the class.

gcc/rust/ChangeLog:

	* ast/rust-ast-tokenstream.cc (TokenStream::TokenStream): Rename
	TokenStream to TokenCollector.
	(TokenCollector::TokenCollector): Likewise.
	(TokenStream::collect_tokens): Likewise.
	(TokenCollector::collect_tokens): Likewise.
	(TokenStream::collect): Likewise.
	(TokenCollector::collect): Likewise.
	(TokenStream::visit): Likewise.
	(TokenCollector::visit): Likewise.
	(TokenStream::visit_items_joined_by_separator): Likewise.
	(TokenCollector::visit_items_joined_by_separator): Likewise.
	(TokenStream::visit_as_line): Likewise.
	(TokenCollector::visit_as_line): Likewise.
	(TokenStream::visit_items_as_lines): Likewise.
	(TokenCollector::visit_items_as_lines): Likewise.
	(TokenStream::visit_items_as_block): Likewise.
	(TokenCollector::visit_items_as_block): Likewise.
	(TokenStream::trailing_comma): Likewise.
	(TokenCollector::trailing_comma): Likewise.
	(TokenStream::newline): Likewise.
	(TokenCollector::newline): Likewise.
	(TokenStream::indentation): Likewise.
	(TokenCollector::indentation): Likewise.
	(TokenStream::increment_indentation): Likewise.
	(TokenCollector::increment_indentation): Likewise.
	(TokenStream::decrement_indentation): Likewise.
	(TokenCollector::decrement_indentation): Likewise.
	(TokenStream::visit_closure_common): Likewise.
	(TokenCollector::visit_closure_common): Likewise.
	(TokenStream::visit_loop_common): Likewise.
	(TokenCollector::visit_loop_common): Likewise.
	(TokenStream::visit_function_common): Likewise.
	(TokenCollector::visit_function_common): Likewise.
	* ast/rust-ast-tokenstream.h (class TokenStream): Likewise.
	(class TokenCollector): Likewise.
	* rust-session-manager.cc (Session::dump_tokenstream): Rename
	token vector for clearer intent.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 18:37:17 +01:00
Pierre-Emmanuel Patry
eb95910fee gccrs: tokenstream: Add conversion for float literals
Add the conversion handler for float/double literal tokens to
tokenstream Literals.

gcc/rust/ChangeLog:

	* ast/rust-ast-tokenstream.cc (dispatch_float_literals): Add
	dispatch function for floating point literals.
	(TokenStream::collect): Add call to dispatcher.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 18:37:16 +01:00
Pierre-Emmanuel Patry
a21a4bc894 gccrs: tokenstream: Add literal int draft conversion
Add a first draft for the literal integer conversion to tokenstream
Literal types.

gcc/rust/ChangeLog:

	* ast/rust-ast-tokenstream.cc (dispatch_integer_literals):
	Add a static function to dispatch depending on the core type.
	(TokenStream::collect): Add call to dispatch function.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 18:37:16 +01:00
Pierre-Emmanuel Patry
e9ced4a3a5 gccrs: tokenstream: Add string and byte string literals
Add conversion to tokenstream Literals for string and byte strings.

gcc/rust/ChangeLog:

	* ast/rust-ast-tokenstream.cc (TokenStream::collect): Add
	conversion for byte string and string.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 18:37:16 +01:00
Pierre-Emmanuel Patry
8c465d5fb0 gccrs: tokenstream: Add tokens to Ident conversion
Add conversion from a rust token to tokenstream Idents.

gcc/rust/ChangeLog:

	* ast/rust-ast-tokenstream.cc (TokenStream::collect): Add Ident
	conversion.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 18:37:16 +01:00
Pierre-Emmanuel Patry
c1b343da33 gccrs: tokenstream: Add joint punct token conversion
Add the conversion from tokens to punct structures in tokenstream
conversion function.

gcc/rust/ChangeLog:

	* ast/rust-ast-tokenstream.cc (TokenStream::collect): Add joint
	punct token conversion.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 18:37:16 +01:00
Pierre-Emmanuel Patry
c010c77c47 gccrs: tokenstream: Convert single punctuation tokens
Add the code to convert single punctuation tokens to a tokenstream
element.

gcc/rust/ChangeLog:

	* ast/rust-ast-tokenstream.cc (TokenStream::collect): Add
	conversion for single punctuation tokens.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 18:37:16 +01:00
Pierre-Emmanuel Patry
5c8941ffd6 gccrs: tokenstream: Convert group markers
Add conversion for group delimiters.

gcc/rust/ChangeLog:

	* ast/rust-ast-tokenstream.cc (pop_group): Add a function to
	easily collect a group from a given stack at the end of it.
	(TokenStream::collect): Collect tokens as a rust compatible
	Tokenstream type.
	* ast/rust-ast-tokenstream.h (RUST_AST_TOKENSTREAM_H): Move
	includes to stay constrained by guards.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2024-01-16 18:37:16 +01:00
M V V S Manoj Kumar
0a00068060 gccrs: Added HIR::InlineAsm node
Fixes Issue #1568
Added HIR node HIR::InlineAsm similar to the one found in rustc. In this
I also changed the defination of the AST::InlineAsm node, so that we can
reuse many of it's data members in the HIR::InlineAsm node.

gcc/rust/ChangeLog:

	* ast/rust-ast-full-decls.h (enum class): Added declaration.
	(struct AnonConst): Added declaration.
	(struct InlineAsmRegOrRegClass): Added declaration.
	(struct InlineAsmOperand): Added declaration.
	(struct InlineAsmPlaceHolder): Added declaration.
	(struct InlineAsmTemplatePiece): Added declaration.
	(struct TupleClobber): Added declaration.
	(struct TupleTemplateStr): Added declaration.
	* ast/rust-expr.h (class InlineAsm): Defined all it's data members outside.
	(enum class InlineAsmOptions): Converted this to a enum class so we could use it in the HIR.
	(struct AnonConst): Defined it independent of the AST::InlineAsm node.
	(struct InlineAsmRegOrRegClass): Defined it independent of the AST::InlineAsm node.
	(struct InlineAsmOperand): Defined it independent of the AST::InlineAsm node.
	(struct InlineAsmPlaceHolder): Defined it independent of the AST::InlineAsm node.
	(struct InlineAsmTemplatePiece): Defined it independent of the AST::InlineAsm node.
	(struct TupleClobber): Defined it independent of the AST::InlineAsm node.
	(struct TupleTemplateStr): Defined it independent of the AST::InlineAsm node.
	* hir/tree/rust-hir-expr.h (class InlineAsmReg): Added defination.
	(class InlineAsmRegClass): Added defination.
	(struct InlineAsmRegOrRegClass): Added defination.
	(class InlineAsm): Added defination.
	* hir/tree/rust-hir-full-decls.h (class InlineAsmReg): Added declaration.
	(class InlineAsmRegClass): Added declaration.
	(struct InlineAsmRegOrRegClass): Added declaration.
	(class InlineAsm): Added declaration.

Signed-off-by: M V V S Manoj Kumar <mvvsmanojkumar@gmail.com>
2024-01-16 18:37:16 +01:00
Philip Herron
b90dc2bdd2 gccrs: Add missing coercion site logic to return expressions
gcc/rust/ChangeLog:

	* backend/rust-compile-base.cc: track return type in fncontext
	* backend/rust-compile-context.h (struct fncontext): likewise
	* backend/rust-compile-expr.cc (CompileExpr::visit): apply coercion site
	(CompileExpr::generate_closure_function): update push_context
	* typecheck/rust-hir-type-check-expr.cc (TypeCheckExpr::visit): likewise

gcc/testsuite/ChangeLog:

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

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
2024-01-16 18:37:15 +01:00
Philip Herron
f91d7d3906 gccrs: add missing coercion site code generation for block tail
Fixes #2179

gcc/rust/ChangeLog:

	* backend/rust-compile-base.cc (HIRCompileBase::compile_function_body):
	add missing coercion_site codegen

gcc/testsuite/ChangeLog:

	* rust/execute/torture/issue-2179.rs: New test.

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
2024-01-16 18:37:15 +01:00
Philip Herron
c9600aa54d gccrs: unify how we handle DST's
DST's are not truely reference types they are "unsized types" so
the exact size of them is not known at compile time. We actually
achieve this by pretending they are a reference but really its
struct we pass around.

Fixes #2180

gcc/rust/ChangeLog:

	* backend/rust-compile-expr.cc (CompileExpr::visit): refactr
	(CompileExpr::get_fn_addr_from_dyn): likewise
	(CompileExpr::get_receiver_from_dyn): likewise
	(CompileExpr::type_cast_expression): likewise
	* backend/rust-compile-type.cc (TyTyResolveCompile::visit): likewise
	(TyTyResolveCompile::create_dyn_obj_record): likewise
	(TyTyResolveCompile::create_slice_type_record): likewise
	(TyTyResolveCompile::create_str_type_record): likewise
	* backend/rust-compile-type.h: likewise
	* backend/rust-compile.cc (HIRCompileBase::coercion_site1): likewise
	(HIRCompileBase::coerce_to_dyn_object): refactor
	* backend/rust-tree.h (SLICE_FLAG): removed
	(SLICE_TYPE_P): removed
	(RS_DST_FLAG): new flag
	(RS_DST_FLAG_P): new predicate
	* typecheck/rust-tyty.cc (ReferenceType::is_dyn_object): new helper
	(ReferenceType::is_dyn_obj_type): likewise
	(PointerType::is_dyn_object): likewise
	(PointerType::is_dyn_obj_type): likewise
	* typecheck/rust-tyty.h (class DynamicObjectType): moved up

gcc/testsuite/ChangeLog:

	* rust/execute/torture/issue-2180.rs: New test.

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
2024-01-16 18:37:15 +01:00
Philip Herron
e857a3b679 gccrs: we can only return unit-type when the ABI is non C
gcc/rust/ChangeLog:

	* backend/rust-compile-type.cc (TyTyResolveCompile::visit): add filter

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
2024-01-16 18:37:15 +01:00
Philip Herron
cf046027a2 gccrs: Redo how we handle unit types for the final time
We had a very inconsistant way for dealing with unit-types in gccrs we
tried to optimize the case for a function returning unit type to be clever
and not emit any return value for unit types. Then for other cases we would
use an empty constructor for an empty tuple and in others use a zero
percsion integer. This was all just confusing and made the IR less
conformant to Rust. In this patch I change all of this to use an empty
tuple type for all cases so we pass around {} which maps over to Rust and
gets optimized away in the middle end anyway.

In the patch we also remove old gccgo code which optimizes away zero
size types to void_type_node which is why my original attempt at doing this
two years ago failed.

Fixes #2188

gcc/rust/ChangeLog:

	* backend/rust-compile-base.cc (HIRCompileBase::compile_function_body): use unit_expression
	(HIRCompileBase::unit_expression): new helper
	* backend/rust-compile-base.h: update prototype
	* backend/rust-compile-block.cc (CompileBlock::visit): use unit_expression
	* backend/rust-compile-expr.cc (CompileExpr::visit): likewise
	(CompileExpr::generate_closure_function): likewise
	* backend/rust-compile-implitem.cc (CompileTraitItem::visit): cleanup
	* backend/rust-compile-item.cc (CompileItem::visit): likewise
	* backend/rust-compile-pattern.cc (CompilePatternLet::visit): likewise
	* backend/rust-compile-resolve-path.cc (ResolvePathRef::resolve): likewise
	* backend/rust-compile-type.cc (TyTyResolveCompile::get_unit_type): new helper
	(TyTyResolveCompile::visit): use new unit_type helper
	* backend/rust-compile-type.h: likewise
	* rust-backend.h: simplify the return_expression
	* rust-gcc.cc (Gcc_backend::function_type): likewise
	(Gcc_backend::return_statement): likewise
	* backend/rust-constexpr.cc (eval_constant_expression): remove bad assertion

gcc/testsuite/ChangeLog:

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

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
2024-01-16 18:37:15 +01:00
Philip Herron
c6f1b887e8 gccrs: Fix ICE in check for unused global variables
Calling get variable expression will return an expression but we are
checking for unused decls so lets actually pass the decl.

Addresses #2188

gcc/rust/ChangeLog:

	* checks/lints/rust-lint-unused-var.cc (UnusedVariables::Lint): use the decl not the expr

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
2024-01-16 18:37:15 +01:00
Owen Avery
af874e4bcd gccrs: Fix "default unsafe fn ..." parsing
gcc/rust/ChangeLog:

	* parse/rust-parse-impl.h
	(Parser::parse_trait_impl_function_or_method):
	Parse function/method qualifiers after "default".

gcc/testsuite/ChangeLog:

	* rust/compile/parse_specialization.rs:
	Add "default unsafe" coverage.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
2024-01-16 18:37:15 +01:00
Philip Herron
de9c1ff6d5 gccrs: Add missing compile locals for constants and statics
When we have a block expression for cosntants or statics we need to ensure
we compile the locals for the implicit function we generate in GIMPLE
before feeding it directly into the constant folder to evaluate the data.

Fixes #2178

gcc/rust/ChangeLog:

	* backend/rust-compile-base.cc: add missing compile_locals call

gcc/testsuite/ChangeLog:

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

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
2024-01-16 18:37:15 +01:00
Arthur Cohen
24c8644052 gccrs: ast: Format AST code properly.
gcc/rust/ChangeLog:

	* ast/rust-ast.h (class AttrInputMetaItemContainer): Run clang-format.
	(class DelimTokenTree): Likewise.
2024-01-16 18:37:14 +01:00
Arthur Cohen
12dd77c19f gccrs: enr: Accumulate nested escaped macros properly.
gcc/rust/ChangeLog:
	* resolve/rust-early-name-resolver.cc (is_macro_use_module): New function.
	(EarlyNameResolver::accumulate_escaped_macros): New function.
	(EarlyNameResolver::go): Use `accumulate_escaped_macros`.
	(EarlyNameResolver::visit): Likewise.
	* resolve/rust-early-name-resolver.h: Declare `accumulate_escaped_macros`.

gcc/testsuite/ChangeLog:
	* rust/compile/macro_use1.rs: New test.
	* rust/execute/torture/macro_use1.rs: New test.
	* rust/compile/nested_macro_use1.rs: New test.
	* rust/compile/nested_macro_use2.rs: New test.
2024-01-16 18:37:14 +01:00