aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/parse
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/rust/parse')
-rw-r--r--gcc/rust/parse/rust-parse-impl.h59
-rw-r--r--gcc/rust/parse/rust-parse.h2
2 files changed, 33 insertions, 28 deletions
diff --git a/gcc/rust/parse/rust-parse-impl.h b/gcc/rust/parse/rust-parse-impl.h
index f08ab69..e1d7388 100644
--- a/gcc/rust/parse/rust-parse-impl.h
+++ b/gcc/rust/parse/rust-parse-impl.h
@@ -29,6 +29,8 @@
#include "rust-dir-owner.h"
#include "rust-attribute-values.h"
+#include "optional.h"
+
namespace Rust {
// Left binding powers of operations.
enum binding_powers
@@ -2903,10 +2905,11 @@ Parser<ManagedTokenSource>::parse_function (AST::Visibility vis,
return std::unique_ptr<AST::Function> (
new AST::Function (std::move (function_name), std::move (qualifiers),
- std::move (generic_params), std::move (function_params),
- std::move (return_type), std::move (where_clause),
- std::move (block_expr), std::move (vis),
- std::move (outer_attrs), locus));
+ std::move (generic_params),
+ tl::optional<AST::SelfParam> (),
+ std::move (function_params), std::move (return_type),
+ std::move (where_clause), std::move (block_expr),
+ std::move (vis), std::move (outer_attrs), locus));
}
// Parses function or method qualifiers (i.e. const, unsafe, and extern).
@@ -5645,18 +5648,18 @@ Parser<ManagedTokenSource>::parse_inherent_impl_function_or_method (
// do actual if instead of ternary for return value optimisation
if (is_method)
{
- return std::unique_ptr<AST::Method> (
- new AST::Method (std::move (ident), std::move (qualifiers),
- std::move (generic_params), std::move (self_param),
- std::move (function_params), std::move (return_type),
- std::move (where_clause), std::move (body),
- std::move (vis), std::move (outer_attrs), locus));
+ return std::unique_ptr<AST::Function> (new AST::Function (
+ std::move (ident), std::move (qualifiers), std::move (generic_params),
+ tl::optional<AST::SelfParam> (tl::in_place, std::move (self_param)),
+ std::move (function_params), std::move (return_type),
+ std::move (where_clause), std::move (body), std::move (vis),
+ std::move (outer_attrs), locus));
}
else
{
return std::unique_ptr<AST::Function> (
new AST::Function (std::move (ident), std::move (qualifiers),
- std::move (generic_params),
+ std::move (generic_params), tl::nullopt,
std::move (function_params), std::move (return_type),
std::move (where_clause), std::move (body),
std::move (vis), std::move (outer_attrs), locus));
@@ -5884,17 +5887,18 @@ Parser<ManagedTokenSource>::parse_trait_impl_function_or_method (
// do actual if instead of ternary for return value optimisation
if (is_method)
{
- return std::unique_ptr<AST::Method> (new AST::Method (
+ return std::unique_ptr<AST::Function> (new AST::Function (
std::move (ident), std::move (qualifiers), std::move (generic_params),
- std::move (self_param), std::move (function_params),
- std::move (return_type), std::move (where_clause), std::move (body),
- std::move (vis), std::move (outer_attrs), locus, is_default));
+ tl::optional<AST::SelfParam> (tl::in_place, std::move (self_param)),
+ std::move (function_params), std::move (return_type),
+ std::move (where_clause), std::move (body), std::move (vis),
+ std::move (outer_attrs), locus, is_default));
}
else
{
return std::unique_ptr<AST::Function> (new AST::Function (
std::move (ident), std::move (qualifiers), std::move (generic_params),
- std::move (function_params), std::move (return_type),
+ tl::nullopt, std::move (function_params), std::move (return_type),
std::move (where_clause), std::move (body), std::move (vis),
std::move (outer_attrs), locus, is_default));
}
@@ -7188,7 +7192,7 @@ Parser<ManagedTokenSource>::parse_self_param ()
* resolve it into whatever it is afterward. As such, this is only here for
* algorithmically defining the grammar rule. */
template <typename ManagedTokenSource>
-AST::Method
+std::unique_ptr<AST::Function>
Parser<ManagedTokenSource>::parse_method ()
{
location_t locus = lexer.peek_token ()->get_locus ();
@@ -7202,7 +7206,7 @@ Parser<ManagedTokenSource>::parse_method ()
if (ident_tok == nullptr)
{
skip_after_next_block ();
- return AST::Method::create_error ();
+ return nullptr;
}
Identifier method_name{ident_tok};
@@ -7217,7 +7221,7 @@ Parser<ManagedTokenSource>::parse_method ()
add_error (std::move (error));
skip_after_next_block ();
- return AST::Method::create_error ();
+ return nullptr;
}
// parse self param
@@ -7229,7 +7233,7 @@ Parser<ManagedTokenSource>::parse_method ()
add_error (std::move (error));
skip_after_next_block ();
- return AST::Method::create_error ();
+ return nullptr;
}
// skip comma if it exists
@@ -7248,7 +7252,7 @@ Parser<ManagedTokenSource>::parse_method ()
add_error (std::move (error));
skip_after_next_block ();
- return AST::Method::create_error ();
+ return nullptr;
}
// parse function return type - if exists
@@ -7266,15 +7270,16 @@ Parser<ManagedTokenSource>::parse_method ()
add_error (std::move (error));
skip_after_end_block ();
- return AST::Method::create_error ();
+ return nullptr;
}
// does not parse visibility, but this method isn't used, so doesn't matter
- return AST::Method (std::move (method_name), std::move (qualifiers),
- std::move (generic_params), std::move (self_param),
- std::move (function_params), std::move (return_type),
- std::move (where_clause), std::move (block_expr),
- AST::Visibility::create_error (), AST::AttrVec (), locus);
+ return std::unique_ptr<AST::Function> (new AST::Function (
+ std::move (method_name), std::move (qualifiers), std::move (generic_params),
+ tl::optional<AST::SelfParam> (tl::in_place, std::move (self_param)),
+ std::move (function_params), std::move (return_type),
+ std::move (where_clause), std::move (block_expr),
+ AST::Visibility::create_error (), AST::AttrVec (), locus));
}
/* Parses an expression or macro statement. */
diff --git a/gcc/rust/parse/rust-parse.h b/gcc/rust/parse/rust-parse.h
index e432275..3ff9b99 100644
--- a/gcc/rust/parse/rust-parse.h
+++ b/gcc/rust/parse/rust-parse.h
@@ -345,7 +345,7 @@ private:
AST::AttrVec outer_attrs);
std::unique_ptr<AST::ExternBlock>
parse_extern_block (AST::Visibility vis, AST::AttrVec outer_attrs);
- AST::Method parse_method ();
+ std::unique_ptr<AST::Function> parse_method ();
// Expression-related (Pratt parsed)
std::unique_ptr<AST::Expr>