Commit Graph

207529 Commits

Author SHA1 Message Date
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
Arthur Cohen
ebbb3d2d5f gccrs: ast: Add take_items() and set_items() methods for Item containers
Both the AST::Crate and AST::Module class are std::unique_ptr<AST::Item>
containers, and may require spurious insertions in these containers,
for example when expanding a procedural macro, or in our case, escaping
macros through the #[macro_use] attribute. These functions allow you
to replace *all* of the items contained in such a container.

gcc/rust/ChangeLog:

	* ast/rust-ast.h: Add take_items() and set_items() method to Crate.
	* ast/rust-item.h: Add take_items() and set_items() method to Module.
2024-01-16 18:37:14 +01:00
Arthur Cohen
c532c201b3 gccrs: ast: Add Kind::MODULE
gcc/rust/ChangeLog:

	* ast/rust-ast.h (enum Kind): Add MODULE variant.
	* ast/rust-item.h: Return Kind::MODULE in AST::Module::get_kind().
2024-01-16 18:34:17 +01:00
Arthur Cohen
cf1287ee24 gccrs: builtin: Cleanup handling of builtin macros
This commit regroups information related to builtin macros in one place instead
of spreading it over multiple files. It also adds a simple bi-directional
hashmap in order to perform lookups from a key as well as a value.

gcc/rust/ChangeLog:

	* ast/rust-macro.cc (builtin_macro_from_string): Move function.
	* ast/rust-macro.h (enum class): Move enum.
	(builtin_macro_from_string): Move function.
	* expand/rust-macro-builtins.cc (builtin_macro_from_string): New function.
	(make_macro_path_str): Use new bi-map.
	(parse_single_string_literal): Use new `BuiltinMacro` enum.
	(MacroBuiltin::include_bytes_handler): Likewise.
	(MacroBuiltin::include_str_handler): Likewise.
	(MacroBuiltin::compile_error_handler): Likewise.
	(MacroBuiltin::concat_handler): Likewise.
	(MacroBuiltin::env_handler): Likewise.
	(MacroBuiltin::include_handler): Likewise.
	(MacroBuiltin::sorry): New function.
	* expand/rust-macro-builtins.h (enum class): Move enum here.
	(builtin_macro_from_string): New function declaration.
	* resolve/rust-early-name-resolver.cc (EarlyNameResolver::visit): Use
	new function.
	* util/rust-hir-map.cc (Mappings::insert_macro_def): Remove old
	builtin macro map.
2024-01-16 18:34:17 +01:00
Arthur Cohen
25c9921b1d gccrs: utils: Add bidirectional hashmap class
gcc/rust/ChangeLog:

	* expand/rust-macro-builtins.cc: Include bidirectional map.
	* util/bi-map.h: New file.
2024-01-16 18:34:16 +01:00
Pierre-Emmanuel Patry
fb3eb13f0f gccrs: libproc_macro: Add helpers to construct Procmacro
Add some helper functions to create Procmacro tagged unions.

libgrust/ChangeLog:

	* libproc_macro/proc_macro.cc (Procmacro::make_derive):
	Add custom derive macro constructor.
	(Procmacro::make_attribute): Add attribute macro constructor.
	(Procmacro::make_bang): Add bang macro constructor.
	* libproc_macro/proc_macro.h (struct Procmacro):
	Add helper function prototypes.

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