]> git.ipfire.org Git - thirdparty/gcc.git/log
thirdparty/gcc.git
18 months agogccrs: Parse AttrInputMacro
Owen Avery [Sun, 30 Apr 2023 06:57:15 +0000 (02:57 -0400)] 
gccrs: Parse AttrInputMacro

gcc/rust/ChangeLog:

* parse/rust-parse-impl.h
(Parser::parse_attr_input): Parse AttrInputMacro.

gcc/testsuite/ChangeLog:

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

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
18 months agogccrs: ast: Propagate type suffix
Pierre-Emmanuel Patry [Thu, 11 May 2023 14:13:41 +0000 (16:13 +0200)] 
gccrs: ast: Propagate type suffix

Propagate back type suffix to created tokens.

gcc/rust/ChangeLog:

* ast/rust-ast-collector.cc (TokenCollector::visit): Propagate
coretype hint.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
18 months agogccrs: Improve Optional<T> implementation
Owen Avery [Fri, 12 May 2023 07:13:30 +0000 (03:13 -0400)] 
gccrs: Improve Optional<T> implementation

gcc/rust/ChangeLog:

* util/rust-optional.h
(class Optional<T>): Improve inner state.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
18 months agogccrs: Handle keyword metavariables
Owen Avery [Wed, 17 May 2023 16:32:23 +0000 (12:32 -0400)] 
gccrs: Handle keyword metavariables

gcc/rust/ChangeLog:

* expand/rust-macro-substitute-ctx.cc
(SubstituteCtx::check_repetition_amount): Handle keywords.
(SubstituteCtx::substitute_token): Likewise.
* lex/rust-token.cc
(Token::get_str): Likewise.
* parse/rust-parse-impl.h
(Parser::parse_macro_match_fragment): Likewise.

gcc/testsuite/ChangeLog:

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

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
18 months agogccrs: ast: Add `outer_attrs` to all `Item`s
Arthur Cohen [Tue, 25 Apr 2023 12:43:15 +0000 (14:43 +0200)] 
gccrs: ast: Add `outer_attrs` to all `Item`s

gcc/rust/ChangeLog:

* ast/rust-ast.h: Add `outer_attrs` to Item.
* ast/rust-expr.h: Make use of new inheritance methods.
* ast/rust-item.h: Likewise.
* ast/rust-macro.h: Likewise.

18 months agogccrs: libproc_macro: Change constructor in ffistring
Pierre-Emmanuel Patry [Tue, 16 May 2023 12:01:36 +0000 (14:01 +0200)] 
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>
18 months agogccrs: libproc_macro: Copy ffistring data from source
Pierre-Emmanuel Patry [Tue, 16 May 2023 11:25:40 +0000 (13:25 +0200)] 
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>
18 months agogccrs: libproc_macro: Remove has_suffix attribute
Pierre-Emmanuel Patry [Thu, 11 May 2023 10:35:18 +0000 (12:35 +0200)] 
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>
18 months agogccrs: converter: Merge dispatch into one function
Pierre-Emmanuel Patry [Thu, 11 May 2023 10:23:38 +0000 (12:23 +0200)] 
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>
18 months agogccrs: libproc_macro: Change cpp literal representation
Pierre-Emmanuel Patry [Wed, 10 May 2023 13:17:46 +0000 (15:17 +0200)] 
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>
18 months agogccrs: libproc_macro: Change rust literal internals
Pierre-Emmanuel Patry [Wed, 10 May 2023 09:34:45 +0000 (11:34 +0200)] 
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>
18 months agogccrs: Add AST::AttrInputMacro
Owen Avery [Sun, 30 Apr 2023 06:54:22 +0000 (02:54 -0400)] 
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>
18 months agogccrs: Make MacroInvocation cloning public
Owen Avery [Thu, 11 May 2023 04:29:04 +0000 (00:29 -0400)] 
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>
18 months agogccrs: Allow hashing Optional<T>
Owen Avery [Fri, 12 May 2023 07:14:29 +0000 (03:14 -0400)] 
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>
18 months agogccrs: Improve Optional<T&> implementation
Owen Avery [Fri, 12 May 2023 07:05:03 +0000 (03:05 -0400)] 
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>
18 months agogccrs: dump: Dump `TupleIndexExpr`s
Arthur Cohen [Fri, 12 May 2023 12:44:54 +0000 (14:44 +0200)] 
gccrs: dump: Dump `TupleIndexExpr`s

gcc/rust/ChangeLog:

* ast/rust-ast-dump.cc (Dump::visit): Implement dump for
`TupleIndexExpr`.

18 months agogccrs: Change return type of token_id_keyword_string
Owen Avery [Tue, 16 May 2023 04:31:38 +0000 (00:31 -0400)] 
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>
18 months agogccrs: Fix parsing of block expressions followed by `.`
Matthew Jasper [Wed, 10 May 2023 01:08:37 +0000 (02:08 +0100)] 
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>
18 months agogccrs: ast: Remove ExprStmtWithBlock / ExprStmtWithoutBlock distinction
Matthew Jasper [Tue, 9 May 2023 11:53:33 +0000 (12:53 +0100)] 
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>
18 months agogccrs: Handle keywords in macro fragments
Owen Avery [Tue, 9 May 2023 00:58:59 +0000 (20:58 -0400)] 
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>
18 months agogccrs: Address invalid little-endian-only testcases
Arthur Cohen [Thu, 11 May 2023 08:19:56 +0000 (10:19 +0200)] 
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.

18 months agogccrs: converter: Fix suffix condition
Pierre-Emmanuel Patry [Fri, 5 May 2023 12:40:20 +0000 (14:40 +0200)] 
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>
18 months agogccrs: converter: Fix some styling issues
Pierre-Emmanuel Patry [Fri, 5 May 2023 12:34:09 +0000 (14:34 +0200)] 
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>
18 months agogccrs: converter: Make converter input immutable
Pierre-Emmanuel Patry [Wed, 3 May 2023 13:33:43 +0000 (15:33 +0200)] 
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>
18 months agogccrs: converter: Add Ident conversions
Pierre-Emmanuel Patry [Wed, 3 May 2023 13:18:51 +0000 (15:18 +0200)] 
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>
18 months agogccrs: converter: Convert literals back to tokens
Pierre-Emmanuel Patry [Wed, 3 May 2023 12:38:51 +0000 (14:38 +0200)] 
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>
18 months agogccrs: converter: Add punct conversion function
Pierre-Emmanuel Patry [Wed, 3 May 2023 10:38:06 +0000 (12:38 +0200)] 
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>
18 months agogccrs: converter: Const conversion to tokenstream
Pierre-Emmanuel Patry [Wed, 3 May 2023 10:09:59 +0000 (12:09 +0200)] 
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>
18 months agogccrs: converter: Return a vector to const pointers
Pierre-Emmanuel Patry [Wed, 3 May 2023 10:04:20 +0000 (12:04 +0200)] 
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>
18 months agogccrs: converter: Add from_tokentree function
Pierre-Emmanuel Patry [Wed, 3 May 2023 08:42:36 +0000 (10:42 +0200)] 
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>
18 months agogccrs: converter: Add group conversion implementation
Pierre-Emmanuel Patry [Wed, 3 May 2023 08:32:17 +0000 (10:32 +0200)] 
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>
18 months agogccrs: converter: Add TokenStream conversion function
Pierre-Emmanuel Patry [Wed, 3 May 2023 08:17:16 +0000 (10:17 +0200)] 
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>
18 months agogccrs: converter: Remove redundant variable
Pierre-Emmanuel Patry [Tue, 2 May 2023 14:53:17 +0000 (16:53 +0200)] 
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>
18 months agogccrs: ast: Move token converter out of ast module
Pierre-Emmanuel Patry [Tue, 2 May 2023 14:34:46 +0000 (16:34 +0200)] 
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>
18 months agogccrs: ast: Rename header guard
Pierre-Emmanuel Patry [Tue, 2 May 2023 14:14:38 +0000 (16:14 +0200)] 
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>
18 months agogccrs: ast: Rename rust-ast-tokenstream file
Pierre-Emmanuel Patry [Tue, 2 May 2023 14:02:55 +0000 (16:02 +0200)] 
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>
18 months agogccrs: ast: Rename TokenStream in the AST module
Pierre-Emmanuel Patry [Tue, 2 May 2023 13:49:10 +0000 (15:49 +0200)] 
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>
18 months agogccrs: tokenstream: Add conversion for float literals
Pierre-Emmanuel Patry [Fri, 28 Apr 2023 13:07:33 +0000 (15:07 +0200)] 
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>
18 months agogccrs: tokenstream: Add literal int draft conversion
Pierre-Emmanuel Patry [Fri, 28 Apr 2023 11:01:05 +0000 (13:01 +0200)] 
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>
18 months agogccrs: tokenstream: Add string and byte string literals
Pierre-Emmanuel Patry [Thu, 27 Apr 2023 16:16:44 +0000 (18:16 +0200)] 
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>
18 months agogccrs: tokenstream: Add tokens to Ident conversion
Pierre-Emmanuel Patry [Thu, 27 Apr 2023 15:33:35 +0000 (17:33 +0200)] 
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>
18 months agogccrs: tokenstream: Add joint punct token conversion
Pierre-Emmanuel Patry [Thu, 27 Apr 2023 13:17:35 +0000 (15:17 +0200)] 
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>
18 months agogccrs: tokenstream: Convert single punctuation tokens
Pierre-Emmanuel Patry [Thu, 27 Apr 2023 11:24:40 +0000 (13:24 +0200)] 
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>
18 months agogccrs: tokenstream: Convert group markers
Pierre-Emmanuel Patry [Thu, 27 Apr 2023 09:01:32 +0000 (11:01 +0200)] 
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>
18 months agogccrs: Added HIR::InlineAsm node
M V V S Manoj Kumar [Thu, 16 Mar 2023 05:33:57 +0000 (11:03 +0530)] 
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>
18 months agogccrs: Add missing coercion site logic to return expressions
Philip Herron [Tue, 9 May 2023 14:59:46 +0000 (15:59 +0100)] 
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>
18 months agogccrs: add missing coercion site code generation for block tail
Philip Herron [Tue, 9 May 2023 13:47:37 +0000 (14:47 +0100)] 
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>
18 months agogccrs: unify how we handle DST's
Philip Herron [Mon, 8 May 2023 13:10:57 +0000 (14:10 +0100)] 
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>
18 months agogccrs: we can only return unit-type when the ABI is non C
Philip Herron [Mon, 8 May 2023 13:52:05 +0000 (14:52 +0100)] 
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>
18 months agogccrs: Redo how we handle unit types for the final time
Philip Herron [Fri, 5 May 2023 18:06:37 +0000 (19:06 +0100)] 
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>
18 months agogccrs: Fix ICE in check for unused global variables
Philip Herron [Fri, 5 May 2023 16:16:08 +0000 (17:16 +0100)] 
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>
18 months agogccrs: Fix "default unsafe fn ..." parsing
Owen Avery [Mon, 8 May 2023 00:29:15 +0000 (20:29 -0400)] 
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>
18 months agogccrs: Add missing compile locals for constants and statics
Philip Herron [Fri, 5 May 2023 15:54:28 +0000 (16:54 +0100)] 
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>
18 months agogccrs: ast: Format AST code properly.
Arthur Cohen [Fri, 5 May 2023 10:59:16 +0000 (12:59 +0200)] 
gccrs: ast: Format AST code properly.

gcc/rust/ChangeLog:

* ast/rust-ast.h (class AttrInputMetaItemContainer): Run clang-format.
(class DelimTokenTree): Likewise.

18 months agogccrs: enr: Accumulate nested escaped macros properly.
Arthur Cohen [Tue, 18 Apr 2023 14:22:22 +0000 (16:22 +0200)] 
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.

18 months agogccrs: ast: Add take_items() and set_items() methods for Item containers
Arthur Cohen [Tue, 18 Apr 2023 12:38:22 +0000 (14:38 +0200)] 
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.

18 months agogccrs: ast: Add Kind::MODULE
Arthur Cohen [Wed, 29 Mar 2023 14:56:12 +0000 (16:56 +0200)] 
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().

18 months agogccrs: builtin: Cleanup handling of builtin macros
Arthur Cohen [Wed, 3 May 2023 09:19:30 +0000 (11:19 +0200)] 
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.

18 months agogccrs: utils: Add bidirectional hashmap class
Arthur Cohen [Wed, 3 May 2023 09:17:01 +0000 (11:17 +0200)] 
gccrs: utils: Add bidirectional hashmap class

gcc/rust/ChangeLog:

* expand/rust-macro-builtins.cc: Include bidirectional map.
* util/bi-map.h: New file.

18 months agogccrs: libproc_macro: Add helpers to construct Procmacro
Pierre-Emmanuel Patry [Mon, 24 Apr 2023 15:14:35 +0000 (17:14 +0200)] 
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>
18 months agogccrs: libproc_macro: Add proc_macro interface structures
Pierre-Emmanuel Patry [Mon, 24 Apr 2023 14:46:23 +0000 (16:46 +0200)] 
gccrs: libproc_macro: Add proc_macro interface structures

Add the structures that should be used by a compiler opening a
procedural macro to either identify or execute it.

libgrust/ChangeLog:

* libproc_macro/proc_macro.h (struct CustomDerivePayload):
Add C compatible payload structure.
(struct AttrPayload): Likewise.
(struct BangPayload): Likewise.
(enum ProcmacroTag): Add tag for tagged union.
(union ProcmacroPayload): Proc macro payload union.
(struct Procmacro): Tagged union.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
18 months agogccrs: Add test from issue 1446
Owen Avery [Wed, 3 May 2023 00:21:42 +0000 (20:21 -0400)] 
gccrs: Add test from issue 1446

gcc/testsuite/ChangeLog:

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

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
18 months agogccrs: Handle replacing stripped tail expressions
Owen Avery [Wed, 26 Apr 2023 13:29:04 +0000 (09:29 -0400)] 
gccrs: Handle replacing stripped tail expressions

gcc/rust/ChangeLog:

* ast/rust-ast.cc
(BlockExpr::strip_tail_expr):
Try to take new tail expression from statements list.
* ast/rust-expr.h
(BlockExpr::strip_tail_expr):
Replace definition with only declaration.

gcc/testsuite/ChangeLog:

* rust/execute/torture/cfg-tail.rs: New test.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
18 months agogccrs: Add is_expr method to AST::Stmt
Owen Avery [Wed, 26 Apr 2023 13:25:35 +0000 (09:25 -0400)] 
gccrs: Add is_expr method to AST::Stmt

gcc/rust/ChangeLog:

* ast/rust-ast.h
(Stmt::is_expr): New.
* ast/rust-stmt.h
(ExprStmt::is_expr): New.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
18 months agogccrs: Fix out of bounds indexing while expanding macros with repetition
Owen Avery [Thu, 20 Apr 2023 17:31:30 +0000 (13:31 -0400)] 
gccrs: Fix out of bounds indexing while expanding macros with repetition

gcc/rust/ChangeLog:

* expand/rust-macro-substitute-ctx.cc
(SubstituteCtx::substitute_repetition): Fix out-of-bounds.

gcc/testsuite/ChangeLog:

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

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
18 months agogccrs: libproc_macro: Change proc_macro.h to main header
Pierre-Emmanuel Patry [Thu, 27 Apr 2023 08:09:01 +0000 (10:09 +0200)] 
gccrs: libproc_macro: Change proc_macro.h to main header

Add different include directives to the proc_macro header in order to
create an handy header much alike rust-system.

libgrust/ChangeLog:

* libproc_macro/proc_macro.h: Add Literal, Punct,
Group, TokenTree and Tokenstream headers.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
18 months agogccrs: libproc_macro: Build statically
Pierre-Emmanuel Patry [Wed, 26 Apr 2023 08:31:35 +0000 (10:31 +0200)] 
gccrs: libproc_macro: Build statically

We do not need dynamic linking, all use case of this library cover can
be done statically hence the change.

gcc/rust/ChangeLog:

* Make-lang.in: Link against the static libproc_macro.

libgrust/ChangeLog:

* Makefile.am: Remove libtool forwarding.
* Makefile.in: Regenerate.
* libproc_macro/Makefile.am: Creates an archive instead
of using libtool.
* libproc_macro/Makefile.in: Regenerate.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
18 months agogccrs: libproc_macro: Remove internal named namespaces
Pierre-Emmanuel Patry [Tue, 25 Apr 2023 11:19:00 +0000 (13:19 +0200)] 
gccrs: libproc_macro: Remove internal named namespaces

Either move the elements from their namespace up to the procmacro
namespace or make the namespace anonymous.

libgrust/ChangeLog:

* libproc_macro/group.cc (Group::make_group): Remove
internal namespace.
(Group::drop): Likewise.
* libproc_macro/group.h (enum Delimiter): Make members
upercase.
(struct Group):
* libproc_macro/ident.cc (Ident::drop): Remove internal
namespace.
* libproc_macro/ident.h (Ident__clone): Likewise.
* libproc_macro/literal.cc (Literal::make_isize):
Likewise.
* libproc_macro/literal.h (union LiteralPayload):
Likewise.
(Literal__from_string): Likewise.
* libproc_macro/punct.cc (Punct::make_punct): Likewise.
* libproc_macro/punct.h (enum Spacing): Make members
uppercase.
* libproc_macro/tokenstream.cc (TokenStream::make_tokenstream):
Remove internal namespace.
(TokenStream::grow): Likewise.
(TokenStream::push): Likewise.
(TokenSream__push): Likewise.
(TokenStream__clone): Likewise.
(TokenStream__drop): Likewise.
* libproc_macro/tokenstream.h (struct TokenStream):
Likewise.
(TokenSream__push): Likewise.
(TokenStream__drop): Likewise.
* libproc_macro/tokentree.cc (TokenTree::make_tokentree):
Likewise.
(TokenTree::drop): Likewise.
* libproc_macro/tokentree.h (union TokenTreePayload):
Likewise.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
18 months agogccrs: libproc_macro: Put all structures in a namespace
Pierre-Emmanuel Patry [Tue, 25 Apr 2023 10:42:47 +0000 (12:42 +0200)] 
gccrs: libproc_macro: Put all structures in a namespace

Put all functions and structures in a Procmacro namespace to avoid
spilling names in any other namespace.

libgrust/ChangeLog:

* libproc_macro/group.cc (Group::drop): Add Procmacro
namespace.
* libproc_macro/group.h: Likewise.
* libproc_macro/ident.cc (Ident::drop): Likewise.
* libproc_macro/ident.h (Ident__clone): Likewise.
* libproc_macro/literal.cc (Literal::make_isize):
Likewise.
* libproc_macro/literal.h (Literal__from_string):
Likewise.
* libproc_macro/punct.cc (Punct::make_punct): Likewise.
* libproc_macro/punct.h: Likewise.
* libproc_macro/tokenstream.cc (TokenStream__drop):
Likewise.
* libproc_macro/tokenstream.h (TokenStream__drop):
Likewise.
* libproc_macro/tokentree.cc (TokenTree::drop):
Likewise.
* libproc_macro/tokentree.h: Likewise.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
18 months agogccrs: cli: Add frust-extern option
Pierre-Emmanuel Patry [Tue, 18 Apr 2023 15:26:07 +0000 (17:26 +0200)] 
gccrs: cli: Add frust-extern option

Add a new option to gather extern crates location.

gcc/rust/ChangeLog:

* lang.opt: Add frust-extern option.
* rust-session-manager.cc (Session::handle_extern_option): Add
frust-extern option handler.
* rust-session-manager.h (struct Session): Add an unordered map
to store library name and locations.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
18 months agogccrs: Fix infinite loop with parsing invalid generic parameters
Owen Avery [Tue, 18 Apr 2023 04:46:59 +0000 (00:46 -0400)] 
gccrs: Fix infinite loop with parsing invalid generic parameters

gcc/rust/ChangeLog:

* parse/rust-parse-impl.h
(Parser::parse_generic_params):
Handle parameter parsing error.

gcc/testsuite/ChangeLog:

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

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
18 months agogccrs: Improve operator overload check for recursive overload
Philip Herron [Mon, 17 Apr 2023 21:17:37 +0000 (22:17 +0100)] 
gccrs: Improve operator overload check for recursive overload

This is a case in #2019 where you have the default Add impl for i32 for
example which has:

  impl Add for i32 {
    fn add(self, other:i32) { self + other }
  }

This function will do a check for operator overload which then is able to
find multiple candidates such as:

  impl<'a> Add<i32> for &'a i32 {
    type Output = <i32 as Add<i32>>::Output;

    fn add(self, other: i32) -> <i32 as Add<i32>>::Output {
        Add::add(*self, other)
    }
  }

This initial operator overload will resolve to this as it looks like a
valid candidate. This patch adds another level of checks to ensure the
candidate does not equal the current context DefId.

Addresses #2019

gcc/rust/ChangeLog:

* typecheck/rust-hir-type-check-expr.cc: update for op overload

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
18 months agogccrs: qualified path syntax is used to disambiguate predicates
Philip Herron [Thu, 20 Apr 2023 16:10:15 +0000 (17:10 +0100)] 
gccrs: qualified path syntax is used to disambiguate predicates

When resolving a qualified path we need to use the predicate to lookup the
relevant assoicated impl block where possible. The issue here is that
it might not have one due to a valid error in the impl block or it might
be used within a trait this is a valid case. Generally we will be able to
resolve to an impl block then it can grab that type and move on.

Fixes #2135

gcc/rust/ChangeLog:

* typecheck/rust-hir-type-check-path.cc (TypeCheckExpr::visit): use the predicate
(TypeCheckExpr::resolve_segments): cleanup

gcc/testsuite/ChangeLog:

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

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
18 months agogccrs: Extract helper lookup_associated_impl_block
Philip Herron [Thu, 20 Apr 2023 15:56:46 +0000 (16:56 +0100)] 
gccrs: Extract helper lookup_associated_impl_block

This will look for a specified predicate that is associated with it so we
might have the predicate Foo<u16, i32> which would refer to:

  impl Foo<i32> for u16 {}

This is a general helper which can be used in several places.

gcc/rust/ChangeLog:

* typecheck/rust-hir-trait-reference.cc (AssociatedImplTrait::AssociatedImplTrait):
bind the predicate
(AssociatedImplTrait::get_trait): remove
(AssociatedImplTrait::get_predicate): new getter
* typecheck/rust-hir-trait-reference.h: bind predicate
* typecheck/rust-hir-type-check-item.cc: update ctor
* typecheck/rust-type-util.cc (lookup_associated_impl_block): new function
* typecheck/rust-type-util.h (class BaseType): remove unused forward decl
(lookup_associated_impl_block): new helper
* typecheck/rust-tyty-bounds.cc (TypeBoundPredicate::is_equal): new
* typecheck/rust-tyty-subst.cc (SubstitutionRef::lookup_associated_impl): use new helper
(SubstitutionRef::monomorphize): update usage/error handling
* typecheck/rust-tyty-subst.h: remove old prototype
* typecheck/rust-tyty.h: add is_equal decl

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
18 months agogccrs: Type check StructPatternFieldIdentPat
Owen Avery [Thu, 27 Apr 2023 02:19:40 +0000 (22:19 -0400)] 
gccrs: Type check StructPatternFieldIdentPat

gcc/rust/ChangeLog:

* typecheck/rust-hir-type-check-pattern.cc
(TypeCheckPattern::visit): Type check StructPatternFieldIdentPat.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
18 months agogccrs: Lower StructPatternFieldIdentPat
Owen Avery [Thu, 27 Apr 2023 02:14:53 +0000 (22:14 -0400)] 
gccrs: Lower StructPatternFieldIdentPat

gcc/rust/ChangeLog:

* hir/rust-ast-lower-pattern.cc
(ASTLoweringPattern::visit): Lower StructPatternFieldIdentPat.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
18 months agogccrs: resolve the associated_predicate when mapping Fn traits
Philip Herron [Thu, 20 Apr 2023 10:12:29 +0000 (11:12 +0100)] 
gccrs: resolve the associated_predicate when mapping Fn traits

This is required to solve #2105

gcc/rust/ChangeLog:

* typecheck/rust-hir-type-check-expr.cc (TypeCheckExpr::resolve_fn_trait_call):
return the assoicated predicate
* typecheck/rust-hir-type-check-expr.h: update prototype

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
18 months agogccrs: Add missing where clause lowering for Impl functions
Philip Herron [Thu, 20 Apr 2023 09:26:18 +0000 (10:26 +0100)] 
gccrs: Add missing where clause lowering for Impl functions

Fixes #2106

gcc/rust/ChangeLog:

* hir/rust-ast-lower-implitem.h: add missing where clause lowering

gcc/testsuite/ChangeLog:

* rust/compile/issue-2106.rs: New test.
* rust/compile/issue-1524.rs: regression (placeholder generic)

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
18 months agogccrs: Add missing TypeBoundWhereClauseItem::get_locus
Philip Herron [Thu, 20 Apr 2023 08:59:47 +0000 (09:59 +0100)] 
gccrs: Add missing TypeBoundWhereClauseItem::get_locus

gcc/rust/ChangeLog:

* hir/tree/rust-hir-item.h: add get_locus() const

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
18 months agogccrs: Add accessors to HIR::StructPatternFieldIdentPat
Owen Avery [Wed, 26 Apr 2023 20:33:07 +0000 (16:33 -0400)] 
gccrs: Add accessors to HIR::StructPatternFieldIdentPat

gcc/rust/ChangeLog:

* hir/tree/rust-hir-pattern.h
(StructPatternFieldIdentPat::get_identifier): New.
(StructPatternFieldIdentPat::get_pattern): New.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
18 months agogccrs: Minor tuning in AST dump
Marc Poulhiès [Wed, 26 Apr 2023 21:08:30 +0000 (23:08 +0200)] 
gccrs: Minor tuning in AST dump

Use parentheses to remove any ambiguities when dumping expressions with
unary ! and -.

gcc/rust/ChangeLog:
* ast/rust-ast-dump.cc (Dump::visit): print parentheses around
unique expression operand.

Signed-off-by: Marc Poulhiès <dkm@kataplop.net>
18 months agogccrs: Fix -frust-dump-* error messages
Owen Avery [Wed, 26 Apr 2023 12:42:36 +0000 (08:42 -0400)] 
gccrs: Fix -frust-dump-* error messages

gcc/rust/ChangeLog:

* rust-session-manager.cc
(Session::enable_dump): Fix error messages.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
18 months agogccrs: Add missing ABI checking on function types
Philip Herron [Sun, 23 Apr 2023 22:12:45 +0000 (23:12 +0100)] 
gccrs: Add missing ABI checking on function types

Addresses #2304

gcc/rust/ChangeLog:

* typecheck/rust-unify.cc (UnifyRules::emit_abi_mismatch): new error method
(UnifyRules::expect_fndef): add ABI check
* typecheck/rust-unify.h: prototype for new error method

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
18 months agogccrs: Add missing ABI mapping
Philip Herron [Sun, 23 Apr 2023 22:01:06 +0000 (23:01 +0100)] 
gccrs: Add missing ABI mapping

gcc/rust/ChangeLog:

* util/rust-abi.cc (get_abi_from_string): add ABI mapping

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
18 months agogccrs: Add mechanism use pattern information to improve type info
Philip Herron [Sun, 23 Apr 2023 21:41:21 +0000 (22:41 +0100)] 
gccrs: Add mechanism use pattern information to improve type info

When we have an untyped closure we assumed all parameters were inference
variables but we can use the pattern type to try and improve the type info
so if we have a reference pattern it must be a reference to an inference
variables '&_'. This patch adds a new visitor to figure this out for
untyped closure parameters.

Note this test case does fully type resolve into the gimple:

    bool test::main::{{closure}}
        (struct test::main::{{closure}} $closure, struct (& u8) args)
    { ... }

Though the Rustc version does fail type-resolution but we make some
assumptions during comparison expressions here that they resolve to a bool
this will change when we implement the comparison lang items.

Fixes #2142

gcc/rust/ChangeLog:

* hir/tree/rust-hir-pattern.h: add missing get_mutability
* typecheck/rust-hir-type-check-expr.cc (TypeCheckExpr::visit):
use new ClosureParamInfer on untyped parameters
* typecheck/rust-hir-type-check-pattern.cc (ClosureParamInfer::Resolve): interface
(ClosureParamInfer::ClosureParamInfer): constructor
(ClosureParamInfer::visit): visitors for each pattern
* typecheck/rust-hir-type-check-pattern.h (class ClosureParamInfer): new visitor

gcc/testsuite/ChangeLog:

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

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
18 months agogccrs: remove unused header
Philip Herron [Sun, 23 Apr 2023 20:49:12 +0000 (21:49 +0100)] 
gccrs: remove unused header

gcc/rust/ChangeLog:

* typecheck/rust-hir-type-check-pattern.h: cleanup

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
18 months agogccrs: Fix ICE when we dont get a reference type
Philip Herron [Fri, 21 Apr 2023 16:52:01 +0000 (17:52 +0100)] 
gccrs: Fix ICE when we dont get a reference type

gcc/rust/ChangeLog:

* typecheck/rust-hir-type-check-pattern.cc (TypeCheckPattern::visit):
return so we dont hit undefined behaviour

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
18 months agogccrs: remove unused includes
Philip Herron [Thu, 20 Apr 2023 10:20:41 +0000 (11:20 +0100)] 
gccrs: remove unused includes

gcc/rust/ChangeLog:

* backend/rust-compile-implitem.h: remove includes

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
18 months agogccrs: fix ICE with recursive function calls
Philip Herron [Thu, 20 Apr 2023 11:33:55 +0000 (12:33 +0100)] 
gccrs: fix ICE with recursive function calls

Fixes #2136

gcc/rust/ChangeLog:

* backend/rust-compile-item.cc (CompileItem::visit): remove bad checks

gcc/testsuite/ChangeLog:

* rust/compile/issue-2136-1.rs: New test.
* rust/compile/issue-2136-2.rs: New test.

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
18 months agogccrs: enable -Winfinite-recursion warnings by default
Philip Herron [Thu, 20 Apr 2023 11:06:21 +0000 (12:06 +0100)] 
gccrs: enable -Winfinite-recursion warnings by default

gcc/rust/ChangeLog:

* lang.opt: add lang option flag
* rust-lang.cc (grs_langhook_init_options_struct): enable by default

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
18 months agogccrs: Fix ICE in assignment of error type bound predicates
Philip Herron [Thu, 20 Apr 2023 10:55:20 +0000 (11:55 +0100)] 
gccrs: Fix ICE in assignment of error type bound predicates

gcc/rust/ChangeLog:

* typecheck/rust-tyty-bounds.cc (TypeBoundPredicate::operator=):
we are done if other is in an error state

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
18 months agogccrs: Fix ICE during method resolution
Philip Herron [Thu, 20 Apr 2023 11:44:31 +0000 (12:44 +0100)] 
gccrs: Fix ICE during method resolution

We were missing a check for trait item selection to ensure they are
actually methods and remove assertion to check if the trait item is a
function this is a valid error check not an assertion.

Fixes #2139

gcc/rust/ChangeLog:

* typecheck/rust-hir-dot-operator.cc (MethodResolver::select): verify it is a method

gcc/testsuite/ChangeLog:

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

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
18 months agogccrs: Track Self properly with TypePredicateBounds
Philip Herron [Tue, 18 Apr 2023 16:56:43 +0000 (17:56 +0100)] 
gccrs: Track Self properly with TypePredicateBounds

When we handle generic trait bounds we never tracked its associated Self
type. Its important to remember a Trait Predicate is associated with a type
this means we end up missing a lot of helpful type information down the
line relating to higher ranked trait bounds and associated types
compuations. Remember traits have an implict Generic Type Parameter of Self
we use this in computing trait defintions so in that case no associated
type is specified which is to be expected but in all other cases we do
even if it is generic its still useful type information to keep track of.

There is one regression here with compile/issue-1893.rs this testcase
mostly worked out as a fluke rather than a proper fix so its no suprise
here it has regressed the other two test cases one where the number
generic arguments has changed, Rustc gets around this and has a seperate
error message for this case.

We need to solve this patch in order to solve #2019

gcc/rust/ChangeLog:

* typecheck/rust-hir-trait-resolve.cc (TraitResolver::resolve_trait): use new interface
* typecheck/rust-hir-type-check-base.h: update prototype to include Self
* typecheck/rust-hir-type-check-expr.cc (TypeCheckExpr::visit): lifewise
* typecheck/rust-hir-type-check-item.cc (TypeCheckItem::resolve_impl_block_substitutions):
likewise
* typecheck/rust-hir-type-check-path.cc (TypeCheckExpr::visit): likewise
(TypeCheckExpr::resolve_segments): likewise
* typecheck/rust-hir-type-check-type.cc (TypeCheckType::visit): likewise
(TypeResolveGenericParam::visit): likewise
(ResolveWhereClauseItem::visit): likewise
* typecheck/rust-tyty-bounds.cc (TypeCheckBase::get_predicate_from_bound): likewise
(TypeBoundPredicate::apply_generic_arguments): likewise
(TypeBoundsMappings::lookup_predicate): likewise
* typecheck/rust-tyty-bounds.h: likewise
* typecheck/rust-tyty.h:likewise

gcc/testsuite/ChangeLog:

* rust/compile/issue-1893.rs: regression
* rust/compile/traits12.rs: rustc uses a custom error message here
* rust/compile/unconstrained_type_param.rs: extra error message

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
18 months agogccrs: add error state to TypeCheckContextItem and missing copy ctor's
Philip Herron [Tue, 18 Apr 2023 11:36:29 +0000 (12:36 +0100)] 
gccrs: add error state to TypeCheckContextItem and missing copy ctor's

When checking current context we might be in the const or static context
which does not have a current function or impl or trait context associated
with it. So this allows us to represent the an error state for that case.

gcc/rust/ChangeLog:

* typecheck/rust-hir-type-check.h: New error state and missing copy implementations
* typecheck/rust-typecheck-context.cc (TypeCheckContextItem::TypeCheckContextItem):
missing copy ctor
(TypeCheckContextItem::operator=): missing copy implementation
(TypeCheckContextItem::get_error): new static function
(TypeCheckContextItem::is_error): new method
(TypeCheckContextItem::get_context_type): handle error state
(TypeCheckContextItem::get_defid): handle error state

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
18 months agogccrs: add helper to check for a const or static context
Philip Herron [Mon, 17 Apr 2023 21:04:11 +0000 (22:04 +0100)] 
gccrs: add helper to check for a const or static context

gcc/rust/ChangeLog:

* typecheck/rust-hir-type-check.h: new helper
* typecheck/rust-typecheck-context.cc (TypeCheckContext::have_function_context):
implementation

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
18 months agogccrs: Add get_defid helper to TypeCheckContextItem
Philip Herron [Mon, 17 Apr 2023 20:50:54 +0000 (21:50 +0100)] 
gccrs: Add get_defid helper to TypeCheckContextItem

gcc/rust/ChangeLog:

* typecheck/rust-hir-type-check.h: Add prototype
* typecheck/rust-typecheck-context.cc (TypeCheckContextItem::get_defid): implementation

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
18 months agogccrs: minor refactor to reuse a variable instead of recreating it later
Philip Herron [Mon, 17 Apr 2023 20:01:25 +0000 (21:01 +0100)] 
gccrs: minor refactor to reuse a variable instead of recreating it later

gcc/rust/ChangeLog:

* typecheck/rust-hir-type-check-expr.cc: refactor

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
18 months agogccrs: Fix memory corruption at peek_context
Philip Herron [Mon, 17 Apr 2023 19:48:41 +0000 (20:48 +0100)] 
gccrs: Fix memory corruption at peek_context

When working in the resolve_operator_overload it was found that we got
memory corruption as method resolution will use the query system and
therefore resolve new methods and the current function context info will
change and due to the fact the peek_context interface returns a reference
to the element which was now safe from a vector which can change and all
you need is the current function context at that moment in time.

gcc/rust/ChangeLog:

* typecheck/rust-autoderef.cc: don't take a reference
* typecheck/rust-hir-type-check-expr.cc (TypeCheckExpr::visit): likewise
* typecheck/rust-hir-type-check.h: remove reference
* typecheck/rust-typecheck-context.cc (TypeCheckContext::pop_return_type): likewise

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
18 months agogccrs: patterns: Add execution testcases to verify proper pattern matching
Arthur Cohen [Fri, 21 Apr 2023 09:22:52 +0000 (11:22 +0200)] 
gccrs: patterns: Add execution testcases to verify proper pattern matching

These testcases are similar to the ones added in #2072 but regarding
execution. One more issue was opened from them - #2144

gcc/testsuite/ChangeLog:

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

18 months agogccrs: Resolve identifier-pattern struct pattern fields
Owen Avery [Mon, 24 Apr 2023 19:49:49 +0000 (15:49 -0400)] 
gccrs: Resolve identifier-pattern struct pattern fields

gcc/rust/ChangeLog:

* resolve/rust-ast-resolve-pattern.cc
(PatternDeclaration::visit): Handle StructPatternFieldIdentPat.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>