From: Kushal Pal <[email protected]>
gcc/rust/ChangeLog:
* ast/rust-ast-builder.cc (AstBuilder::fn_qualifiers):
Add new parameter.
* ast/rust-ast-builder.h: Likewise.
* ast/rust-ast.cc (Function::Function):
Remove current default parameter.
(Function::operator=):
Remove current default parameter.
* ast/rust-item.h (class FunctionQualifiers):
Add data member to represent defaultness of a function.
(class Function):
Remove current default parameter.
* parse/rust-parse-impl.hxx (Parser::parse_function_qualifiers):
Parse function qualifiers in order.
* util/rust-common.h (enum class): Create enum to represent
defaultness of a function.
Signed-off-by: Kushal Pal <[email protected]>
---
This change was merged into the gccrs repository and is posted here for
upstream visibility and potential drive-by review, as requested by GCC
release managers.
Each commit email contains a link to its details on github from where you can
find the Pull-Request and associated discussions.
Commit on github:
https://github.com/Rust-GCC/gccrs/commit/ee1cac14372bec89703ef021c960b62cbfa937b6
The commit has been mentioned in the following pull-request(s):
- https://github.com/Rust-GCC/gccrs/pull/4463
gcc/rust/ast/rust-ast-builder.cc | 3 +-
gcc/rust/ast/rust-ast-builder.h | 4 +--
gcc/rust/ast/rust-ast.cc | 2 --
gcc/rust/ast/rust-item.h | 20 ++++++-----
gcc/rust/parse/rust-parse-impl.hxx | 55 +++++++++++++-----------------
gcc/rust/util/rust-common.h | 6 ++++
6 files changed, 44 insertions(+), 46 deletions(-)
diff --git a/gcc/rust/ast/rust-ast-builder.cc b/gcc/rust/ast/rust-ast-builder.cc
index 46a7883b5..bce5bb85a 100644
--- a/gcc/rust/ast/rust-ast-builder.cc
+++ b/gcc/rust/ast/rust-ast-builder.cc
@@ -149,7 +149,8 @@ Builder::function_param (std::unique_ptr<Pattern> &&pattern,
FunctionQualifiers
Builder::fn_qualifiers () const
{
- return FunctionQualifiers (loc, Async::No, Const::No, Unsafety::Normal);
+ return FunctionQualifiers (loc, Default::No, Async::No, Const::No,
+ Unsafety::Normal);
}
std::unique_ptr<Function>
diff --git a/gcc/rust/ast/rust-ast-builder.h b/gcc/rust/ast/rust-ast-builder.h
index 1b642e4af..2b34c2ab1 100644
--- a/gcc/rust/ast/rust-ast-builder.h
+++ b/gcc/rust/ast/rust-ast-builder.h
@@ -188,8 +188,8 @@ public:
std::unique_ptr<Type> return_type, std::unique_ptr<BlockExpr> block,
std::vector<std::unique_ptr<GenericParam>> generic_params = {},
FunctionQualifiers qualifiers
- = FunctionQualifiers (UNKNOWN_LOCATION, Async::No, Const::No,
- Unsafety::Normal),
+ = FunctionQualifiers (UNKNOWN_LOCATION, Default::No, Async::No,
+ Const::No, Unsafety::Normal),
WhereClause where_clause = WhereClause::create_empty (),
Visibility visibility = Visibility::create_private ()) const;
diff --git a/gcc/rust/ast/rust-ast.cc b/gcc/rust/ast/rust-ast.cc
index e8897696a..5880ea92f 100644
--- a/gcc/rust/ast/rust-ast.cc
+++ b/gcc/rust/ast/rust-ast.cc
@@ -1106,7 +1106,6 @@ Function::Function (Function const &other)
: VisItem (other), ExternalItem (other.get_node_id ()),
qualifiers (other.qualifiers), function_name (other.function_name),
where_clause (other.where_clause), locus (other.locus),
- has_default (other.has_default),
is_external_function (other.is_external_function)
{
// guard to prevent null dereference (always required)
@@ -1138,7 +1137,6 @@ Function::operator= (Function const &other)
// visibility = other.visibility->clone_visibility();
// outer_attrs = other.outer_attrs;
locus = other.locus;
- has_default = other.has_default;
is_external_function = other.is_external_function;
// guard to prevent null dereference (always required)
diff --git a/gcc/rust/ast/rust-item.h b/gcc/rust/ast/rust-item.h
index 234797824..91c52d2cc 100644
--- a/gcc/rust/ast/rust-item.h
+++ b/gcc/rust/ast/rust-item.h
@@ -547,6 +547,7 @@ public:
// Qualifiers for function, i.e. const, unsafe, extern etc.
class FunctionQualifiers
{
+ Default default_status;
Async async_status;
Const const_status;
Unsafety unsafe_status;
@@ -555,12 +556,14 @@ class FunctionQualifiers
location_t locus;
public:
- FunctionQualifiers (location_t locus, Async async_status, Const const_status,
+ FunctionQualifiers (location_t locus, Default default_status,
+ Async async_status, Const const_status,
Unsafety unsafe_status, bool has_extern = false,
std::string extern_abi = std::string ())
- : async_status (async_status), const_status (const_status),
- unsafe_status (unsafe_status), has_extern (has_extern),
- extern_abi (std::move (extern_abi)), locus (locus)
+ : default_status (default_status), async_status (async_status),
+ const_status (const_status), unsafe_status (unsafe_status),
+ has_extern (has_extern), extern_abi (std::move (extern_abi)),
+ locus (locus)
{
if (!this->extern_abi.empty ())
{
@@ -571,6 +574,7 @@ public:
std::string as_string () const;
+ bool is_default () const { return default_status == Default::Yes; }
bool is_unsafe () const { return unsafe_status == Unsafety::Unsafe; }
bool is_extern () const { return has_extern; }
bool is_const () const { return const_status == Const::Yes; }
@@ -1343,7 +1347,6 @@ class Function : public VisItem, public AssociatedItem,
public ExternalItem
WhereClause where_clause;
tl::optional<std::unique_ptr<BlockExpr>> function_body;
location_t locus;
- bool has_default;
bool is_external_function;
public:
@@ -1368,7 +1371,7 @@ public:
bool has_body () const { return function_body.has_value (); }
- bool is_default () const { return has_default; }
+ bool is_default () const { return qualifiers.is_default (); }
// Mega-constructor with all possible fields
Function (Identifier function_name, FunctionQualifiers qualifiers,
@@ -1377,8 +1380,7 @@ public:
std::unique_ptr<Type> return_type, WhereClause where_clause,
tl::optional<std::unique_ptr<BlockExpr>> function_body,
Visibility vis, std::vector<Attribute> outer_attrs,
- location_t locus, bool has_default = false,
- bool is_external_function = false)
+ location_t locus, bool is_external_function = false)
: VisItem (std::move (vis), std::move (outer_attrs)),
ExternalItem (Stmt::node_id), qualifiers (std::move (qualifiers)),
function_name (std::move (function_name)),
@@ -1387,7 +1389,7 @@ public:
return_type (std::move (return_type)),
where_clause (std::move (where_clause)),
function_body (std::move (function_body)), locus (locus),
- has_default (has_default), is_external_function (is_external_function)
+ is_external_function (is_external_function)
{}
// TODO: add constructor with less fields
diff --git a/gcc/rust/parse/rust-parse-impl.hxx
b/gcc/rust/parse/rust-parse-impl.hxx
index c2ddb17c2..8c60ac382 100644
--- a/gcc/rust/parse/rust-parse-impl.hxx
+++ b/gcc/rust/parse/rust-parse-impl.hxx
@@ -1638,7 +1638,7 @@ Parser<ManagedTokenSource>::parse_function
(AST::Visibility vis,
std::move (generic_params), std::move (function_params),
std::move (return_type), std::move (where_clause),
std::move (body), std::move (vis),
- std::move (outer_attrs), locus, false, is_external));
+ std::move (outer_attrs), locus, is_external));
}
// Parses function or method qualifiers (i.e. const, unsafe, and extern).
@@ -1646,6 +1646,7 @@ template <typename ManagedTokenSource>
AST::FunctionQualifiers
Parser<ManagedTokenSource>::parse_function_qualifiers ()
{
+ Default default_status = Default::No;
Async async_status = Async::No;
Const const_status = Const::No;
Unsafety unsafe_status = Unsafety::Normal;
@@ -1653,29 +1654,27 @@ Parser<ManagedTokenSource>::parse_function_qualifiers ()
std::string abi;
const_TokenPtr t;
- location_t locus;
- // Check in order of const, unsafe, then extern
- for (int i = 0; i < 2; i++)
+ location_t locus = lexer.peek_token ()->get_locus ();
+ // Check in order of default, const, async, unsafe, extern
+ if (lexer.peek_token ()->get_id () == IDENTIFIER
+ && lexer.peek_token ()->get_str () == Values::WeakKeywords::DEFAULT)
{
- t = lexer.peek_token ();
- locus = t->get_locus ();
+ default_status = Default::Yes;
+ lexer.skip_token();
+ }
- switch (t->get_id ())
- {
- case CONST:
- lexer.skip_token ();
- const_status = Const::Yes;
- break;
- case ASYNC:
- lexer.skip_token ();
- async_status = Async::Yes;
- break;
- default:
- // const status is still none
- break;
- }
+ if (lexer.peek_token ()->get_id () == CONST)
+ {
+ lexer.skip_token ();
+ const_status = Const::Yes;
}
+ if (lexer.peek_token ()->get_id () == ASYNC)
+ {
+ lexer.skip_token ();
+ async_status = Async::Yes;
+ }
+
if (lexer.peek_token ()->get_id () == UNSAFE)
{
lexer.skip_token ();
@@ -1696,8 +1695,9 @@ Parser<ManagedTokenSource>::parse_function_qualifiers ()
}
}
- return AST::FunctionQualifiers (locus, async_status, const_status,
- unsafe_status, has_extern, std::move (abi));
+ return AST::FunctionQualifiers (locus, default_status, async_status,
+ const_status, unsafe_status, has_extern,
+ std::move (abi));
}
// Parses generic (lifetime or type) params inside angle brackets (optional).
@@ -4456,15 +4456,6 @@
Parser<ManagedTokenSource>::parse_trait_impl_function_or_method (
// - template?
location_t locus = lexer.peek_token ()->get_locus ();
- auto is_default = false;
- auto t = lexer.peek_token ();
- if (t->get_id () == IDENTIFIER
- && t->get_str () == Values::WeakKeywords::DEFAULT)
- {
- is_default = true;
- lexer.skip_token ();
- }
-
// parse function or method qualifiers
AST::FunctionQualifiers qualifiers = parse_function_qualifiers ();
@@ -4601,7 +4592,7 @@
Parser<ManagedTokenSource>::parse_trait_impl_function_or_method (
std::move (generic_params), 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));
+ std::move (outer_attrs), locus));
}
// Parses an extern block of declarations.
diff --git a/gcc/rust/util/rust-common.h b/gcc/rust/util/rust-common.h
index 490668f0d..e1af08308 100644
--- a/gcc/rust/util/rust-common.h
+++ b/gcc/rust/util/rust-common.h
@@ -48,6 +48,12 @@ enum class Async
No
};
+enum class Default
+{
+ Yes,
+ No
+};
+
enum BoundPolarity
{
RegularBound,
base-commit: 7c402e98b69f2eccc47365cbcec4384c9dff27b3
--
2.53.0