diff options
author | Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com> | 2023-02-27 10:10:51 +0100 |
---|---|---|
committer | CohenArthur <arthur.cohen@embecosm.com> | 2023-02-28 17:00:02 +0000 |
commit | 689c421dd7a92bba7e31342a034fb25b85407b37 (patch) | |
tree | 9e9a92f7040032e5b2622f350f3c59f24e3b8b45 | |
parent | 5c2ed969a2d58217797cf2e938c0f833a50d7cb4 (diff) | |
download | gcc-689c421dd7a92bba7e31342a034fb25b85407b37.zip gcc-689c421dd7a92bba7e31342a034fb25b85407b37.tar.gz gcc-689c421dd7a92bba7e31342a034fb25b85407b37.tar.bz2 |
parser: Parse external type item
Add the code to parse type item declaration within an extern block.
gcc/rust/ChangeLog:
* parse/rust-parse-impl.h (Parser::parse_external_type_item):
Add function to parser an external type item.
(Parser::parse_external_item):
Add identification and parsing for external type items.
* parse/rust-parse.h:
Add parser_external_type_item prototype.
Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
-rw-r--r-- | gcc/rust/parse/rust-parse-impl.h | 31 | ||||
-rw-r--r-- | gcc/rust/parse/rust-parse.h | 2 |
2 files changed, 33 insertions, 0 deletions
diff --git a/gcc/rust/parse/rust-parse-impl.h b/gcc/rust/parse/rust-parse-impl.h index 7807d75..7988d12 100644 --- a/gcc/rust/parse/rust-parse-impl.h +++ b/gcc/rust/parse/rust-parse-impl.h @@ -3990,6 +3990,34 @@ Parser<ManagedTokenSource>::parse_lifetime () } } +template <typename ManagedTokenSource> +std::unique_ptr<AST::ExternalTypeItem> +Parser<ManagedTokenSource>::parse_external_type_item (AST::Visibility vis, + AST::AttrVec outer_attrs) +{ + Location locus = lexer.peek_token ()->get_locus (); + skip_token (TYPE); + + const_TokenPtr alias_name_tok = expect_token (IDENTIFIER); + if (alias_name_tok == nullptr) + { + Error error (lexer.peek_token ()->get_locus (), + "could not parse identifier in external opaque type"); + add_error (std::move (error)); + + skip_after_semicolon (); + return nullptr; + } + + if (!skip_token (SEMICOLON)) + return nullptr; + + return std::unique_ptr<AST::ExternalTypeItem> ( + new AST::ExternalTypeItem (std::move (alias_name_tok->get_str ()), + std::move (vis), std::move (outer_attrs), + std::move (locus))); +} + // Parses a "type alias" (typedef) item. template <typename ManagedTokenSource> std::unique_ptr<AST::TypeAlias> @@ -6011,6 +6039,9 @@ Parser<ManagedTokenSource>::parse_external_item () std::move (variadic_attrs), std::move (vis), std::move (outer_attrs), locus)); } + case TYPE: + return parse_external_type_item (std::move (vis), + std::move (outer_attrs)); default: // error add_error ( diff --git a/gcc/rust/parse/rust-parse.h b/gcc/rust/parse/rust-parse.h index 54a87c9..42168e9 100644 --- a/gcc/rust/parse/rust-parse.h +++ b/gcc/rust/parse/rust-parse.h @@ -273,6 +273,8 @@ private: template <typename EndTokenPred> std::vector<AST::Lifetime> parse_lifetime_bounds (EndTokenPred is_end_token); AST::Lifetime parse_lifetime (); + std::unique_ptr<AST::ExternalTypeItem> + parse_external_type_item (AST::Visibility vis, AST::AttrVec outer_attrs); std::unique_ptr<AST::TypeAlias> parse_type_alias (AST::Visibility vis, AST::AttrVec outer_attrs); std::unique_ptr<AST::Struct> parse_struct (AST::Visibility vis, |